Python面试题
1.列表(list)和元组(tuple)有什么区别?
列表是可变的。创建后可以对其进行修改。
元组是不可变的。元组一旦创建,就不能对其进行更改。
列表表示的是顺序。它们是有序序列,通常是同一类型的对象。比如说按创建日期排序的所有用户名,如[“Seth”,“Ema”,“Eli”]。
元组表示的是结构。可以用来存储不同数据类型的元素。比如内存中的数据库记录,如(2,“Ema”,“2020–04–16”)(#id,名称,创建日期)。
2.如何进行字符串插值?
- 通过(%)操作符拼接
>>>print('%s %s!' % ('Hello', 'World'))
Hello World!
- 通过str.format()方法拼接
>>>print('{} {}!'.format('Hello', 'World'))
Hello World!
- 通过F-strings拼接
>>> s1 = 'Hello'
>>> s2 = 'World'
>>> print(f'{s1} {s2}!')
Hello World!
- 通过string模块中的Template对象拼接
>>> from string import Template
>>> s = Template('${s1} ${s2}!')
>>> s.safe_substitute(s1='Hello',s2='World')
Hello World!
3.“is"和”=="有什么区别?
'is’用来检查对象的标识符(id)
'=='用来检查两个对象是否相等
4.什么是装饰器(decorator)?
装饰器允许通过将现有函数传递给装饰器,从而向现有函数添加一些额外的功能,该装饰器将执行现有函数的功能和添加的额外功能。
5.解释range函数
range函数可以用来创建一个整数列表,一般用在for循环中。它有3种使用方法。
range函数可以接受1到3个参数,参数必须是整数。
用法1:-range(stop):生成从0到参数’stop’之间的整数。
[i for i in range(10)]#=>[0,1,2,3,4,5,6,7,8,9]
用法2:-range(start,stop):生成从参数’start’到’stop’之间的整数
[i for i in range(2,10)]#=>[2,3,4,5,6,7,8,9]
用法3:-range(start,stop,step):以参数’step’为步长,生成从’start’到’stop’之间的整数
[i for i in range(2,10,2)]#=>[2,4,6,8]
6.定义一个Car类,它有两个属性:‘color’和’speed’。然后创建一个实例并返回’speed’。
class Car():
def __init__(self,color,speed):
self.color = color
self.speed = speed
car = Car('red','1000mph')
print(car.speed)
7.Python中的实例方法、静态方法和类方法有什么区别?
实例方法:接受self参数,并且与类的特定实例相关。
静态方法:使用装饰器@static method,与特定实例无关,并且是自包含的(不能修改类或者实例的属性)
类方法:接受cls参数,并且可以修改类本身。
8."func"和"func()"有什么区别?
func是表示函数的对象,它可以被分配给变量或者传递给另一个函数。
带圆括号的func()调用该函数并返回其输出。
使用return func时返回的是func这个函数,使用return func()时返回的是func()执行后的返回值,如果func()函数没有返回值则返回值为None,而且此时func函数如果有其他打印语句之类的也会一起执行。
9.解释map函数的工作原理。
map是python内置函数,会根据提供的函数对指定的序列做映射。
map()函数的格式是:
map(function,iterable,...)
10.reduce函数的用法
可以把一个序列通过某种方式(function)转变成一个值
语法:接收两个参数,第一个参数是function,第二个参数是序列
reduce(function,sequence[,initial])
11.解释filter函数的工作原理
filter()函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
该函数接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判别,然后返回True或False,最后将返回True的元素放到新列表中。
filter(function,iterable)
参数:
- function-判断函数
- iterable-可迭代对象
12.python是按引用调用还是按值调用?
python函数参数既支持按值传递也支持按引用传递。
事实上,解释器会查看对象引用(内存地址)指示的那个值的类型,如果变量指示是一个可变的值,就会按引用调用语义。如果所指示的数据类型是不可变的,则按值调用语义。
不可变对象(如字符串、数字和元组等)是按值调用的。
可变对象(如列表、字典、集合)是通过引用调用的
13.如何使用reverse函数反转一个列表?
li=[1,2,3]
print(li)
li.reverse()
print(li)
14.字符串乘法是如何工作的?
print('cat'*3)
15.列表乘法是如何工作的?
print([1,2,3]*2)
16.字符串拼接
- 通过(%)操作符拼接
>>>print('%s %s!' % ('Hello', 'World'))
Hello World!
- 通过str.format()方法拼接
>>>print('{} {}!'.format('Hello', 'World'))
Hello World!
- 通过F-strings拼接
>>> s1 = 'Hello'
>>> s2 = 'World'
>>> print(f'{s1} {s2}!')
Hello World!
- 通过string模块中的Template对象拼接
>>> from string import Template
>>> s = Template('${s1} ${s2}!')
>>> s.safe_substitute(s1='Hello',s2='World')
Hello World!
- 通过(+)操作符拼接
s = 'Hello'+' '+'World'+'!'
print(s)
输出结果:Hello World!
- 通过str.join()方法拼接
strlist=['Hello',' ','World','!']
print(''.join(strlist))
输出结果:Hello World!
17.python列表生成式
列表生成式的结构是在一个中括号里包含一个表达式,然后是一个for语句,然后是0个或多个for或者if语句。列表表达式可以是任意的,意思是你可以在列表中放入任意类型的对象。返回结果将是一个新的列表,在这个以if 和for语句为上下文的表达式运行完成之后产生。
variable=[out_exp for out_exp in input_list if out_exp == 2]
18.字符串反转
- 反转列表法
a = 'abcdef'
b = list(a)
b.reverse()
b = ''.join(b)
print(b)
- 循环反向迭代法
a = 'abcdef'
b = ''
for i in a:
b = i + b
print(b)
- 反向循环迭代法
a = 'abcdef'
b = ''
for i in a[::-1]:
b += i
print(b)
- 倒序切片法
a = 'abcdef'
b = [::-1]
print(b)
- 遍历索引法
a = 'abcdef'
b = ''
for i in range(1,len(a)+1):
b = b+a[-i]
- 列表弹出法
a = 'abcdef'
a = list(a)
b = ''
while len(a)>0:
b = b+a.pop()
- 列表解析法/反向遍历索引法
a = 'abcdef'
b = ''.join(i for i in a[::-1])
print(b)
- 累积相加法
a = 'abcdef'
from functools import reduce
def f(x,y):
return y+x
b = reduce(f,a)
print(b)
- 匿名函数法
a = 'abcdef'
b =reduce(lambda x,y:y+x,a)
print(b)
19.python单例模式
单例模式是一种常见的软件设计模式,该模式的主要目的是确保某个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。
20.pass语句
pass语句什么也不做,一般作为占位符或者创建占位程序,pass语句不会执行任何操作。