文章目录
- 基础篇
- 1. python函数中的 *args 与**kwargs有什么区别?
- 2. 什么是python解释器?
- 3. 什么是源代码? 什么是字节码?
- 4. 什么是PVM?
- 5. python程序的执行流程?
- 6. CPython、Jython、IronPython有什么区别?
- 7. 请列举python的核心数据类型?
- 8. python的不可变性代表着什么?
- 9.序列是什么意思,python中的哪些类型是被认为是序列的?
- 10. python中的多态是什么意思?
- 11. python常用的内置数学函数?
- 12.python三元表达式的用法?
- 13.python常用操作符及程序?
- 14. 为什么python的浮点数会出现精度丢失的问题?
- 15. 如何将一个整数显示成八进制、十六进制或二进制的形式?
- 16. 如何将十六进制的数、八进制的数或者二进制的字符串转换为整数?
- 17. 当把一个变量a赋值给其他类型的对象时,它的前一个引用值会发生什么变化? 下面语句中,对象3发生了什么变化?
- 18. python下面程序打印的结果为?
- 19. 深拷贝与浅拷贝的区别?
- 20. 思考下面三段代码,他们会改变A打印出来的值嘛?
- 21. 字符串反斜杠转义符
- 22. 字符串反斜杠问题,以下字符串打印的长度为多少?
- 23. python中修改字符串的方式有哪几种方式?
- 24. python中常用的字符串常量和表达?
- 25. python中如何将字符转换为ASCII码, 如何反向转换,将整数转换为字符?
- 26. python3中整数和字符串在列表中能排序嘛?
- 27. 列表的append()方法为什么比"+" 快?
- 28. 怎么使用列表实现一个栈?
- 29. 什么是重定向输出流? 怎么使用print()将方法将日志输入到文件里?
- 30. 在python中,举出三种可以把变量赋值成相同值的方式?
- 31. 将三个变量赋值给可变对象时,你可能需要注意什么问题?
- 32. L=L.sort() 有什么错误?
- 33. open文件调用中,默认的处理模式自变量是什么?
- 34. 用python生成一个指定位数的随机数字字符串?
- 35. 当一个函数没有return语句时,它会返回什么?
- 36. 作用域问题,以下打印结果为?
- 37. global有什么用? 以下打印结果为?
- 38. 什么是nonlocal? global和nonlocal的区别是什么?
- 39. 什么是LEGB原则?
- 40. 函数设计的概念?
- 大小性
- 41. 三元表达式怎么写?
- 42. 请比较map、filter和reduce函数的区别?
- 43. 什么是函数的注解?
- 44. python怎么定义main()方法?
- 45. 改变sys.pyth和改变pythonpath来修改模块的搜索路径有什么不同?
- 46. 如果用户通过交互模式输入模块的变量名进行测试,你该怎样进行导入?
- 47. python类的构造函数是什么?
- 48. python 怎么拦截异常?
- 49. python怎么用map替代for循环?
- 50. python排序列表中的字典,怎么按照列表中字典指定的key或者value来排序?
- 51. python怎么获取当前时间?
- 52. python常用的计算表达式有哪些?
- 53. 怎么将字符串中的多个空格替换成其他字符?
- web篇
加班加点整理出来python面试题…(っ•̀ω•́)っ✎⁾⁾ , 喜欢的点赞、支持+收藏哟!
基础篇
1. python函数中的 *args 与**kwargs有什么区别?
答: *args 用来将元素打包成tuple来给函数处理, ** kwargs将参数打包成dict来给函数处理。
2. 什么是python解释器?
答: python 解释器是用来运行python程序的代码程序,可以将源代码转换为字节码
3. 什么是源代码? 什么是字节码?
答: 源代码是指.py文件里面的代码,字节码是python解释器将.py文件转化为.pyc文件里的代码。
4. 什么是PVM?
答: PVM是python的虚拟机, python运行时引擎编译得到的代码。
5. python程序的执行流程?
python解释器将录入的源代码转化为字节码后,字节码在pvm上运行,其中pvm仍然需要解释字节码文件,在pvm里,Python不需要反复重分析和重分解每一行语句,这就解释了python的运行速度在传统的编译语言和传统的解释语言之间。
6. CPython、Jython、IronPython有什么区别?
答: CPython是python脚本化c和c++程序的实现,Jython是python脚本化java应用程序的实现,IronPython是脚本化.net的实现; python代码被这些系统翻译成对应的c、c++、java、.net语句来执行。
7. 请列举python的核心数据类型?
答: 数字、字符串、列表、元组、字典、集合、文件。
8. python的不可变性代表着什么?
答: python中的数字、字符串、元组是不可改变的,在内存中只有一份,不能重新赋值。例如变量
a=5
a=6 # 实际上是在内存中新开辟了一个地址空间,与a=5的地址空间是不一样的。
9.序列是什么意思,python中的哪些类型是被认为是序列的?
答: 序列值一个对位置进行排序的对象组合。python中的字符串、列表、元组是序列,支持索引、合并、分片
10. python中的多态是什么意思?
答: python中的多态是指一个操作符拥有多种形态,比如在一个函数中使用到了符号"+", 用在两个数字之间,表示的数字的运算,用在字符串与数字、字符串之间表示为拼接。
11. python常用的内置数学函数?
答:
- math.pow(x,y) : x的y次方。
- abs(v), 绝对值函数。
- round(v), 取整,小于或等于五舍去,大于五才进一位。
- hex(v),转换为16进制数, 0x9dd。
- bin(v), 将整数转换为二进制表示。 0b 100.
12.python三元表达式的用法?
答: x if y else z, 如果满足条件y,那么取x,否则取z
13.python常用操作符及程序?
答:
操作符 | 描述 |
---|---|
x and y | 逻辑与,只有x为真的时候,才计算y。 |
x or y | 逻辑或,只有x为假的时候才计算y。 |
not x | 逻辑非 |
x in y , x not in y | 成员关系(可迭代对象、集合) |
x is y, x is not y | 对象关系, 如判断x是否为None |
x<y , x>y ,x<=y ,x>=y | 大小比较,用于集合的比较。 |
x==y,x!=y | x等于y,x 不等于y |
x|y | x位或y, 集合并集 |
x & y | 位与,集合交集 |
x ^ y | 位异或 |
x<<y, x>>y | 表示x 左移y位,x右移y位 |
x+y,x-y | x减y, 集合的差减 |
x * y , x%y, x/y , x//y | 乘法或重复(x为字符串,y为数字时表示重复拼接x字符串),余数或格式化,除法,真除法或floor除法, 真除法指 // ,其中有一个数为浮点数,那么返回的结果为浮点数。 |
-x,+x | 一元减法,加法/识别 |
~x | 按位取反 |
x**y | 按幂运算 |
x[i] | 索引 |
x[i:j:k] | 分片 |
x(…) | 函数、方法、类或其他可以调用的 |
x.attr | 属性引用 |
(…) | 元组、表达书、生成器表达式 |
[…] | 列表、列表解析 |
{…} | 字典、集合、字典和集合的解析 |
14. 为什么python的浮点数会出现精度丢失的问题?
答: 因为python采用双精度浮点数来存储小数,在内存中占有8个字节,一共64位,其中52位为有效数字,11位存储指数,1位存储符号位。在小数转化为二进制数的过程中,很容易生成写不尽的二进制串,如十进制数0.1 ,转换成二进制数为: 0.0001100110011001100110011001100110011001100110011001…… , 长度明显大于52位,因此会从53位开始舍去或者进1, 因此会出现经度丢失的问题。
15. 如何将一个整数显示成八进制、十六进制或二进制的形式?
答: oct(v) , hex(v) ,bin(v) ,其中v为整数。
16. 如何将十六进制的数、八进制的数或者二进制的字符串转换为整数?
答: 通过int(v) 转换,其中v为十六进制数、八进制数或二进制数,如果是"0x123",那么可以使用eval()方法进行转换,但是eval()方法运行起来或存在内存开销和安全的问题。
17. 当把一个变量a赋值给其他类型的对象时,它的前一个引用值会发生什么变化? 下面语句中,对象3发生了什么变化?
答:
>>>a=3
>>>a=“span”
1) a=3, python会先在内存中创建一个对象3, 同时创建一个变量a, 用来接收对象3的引用,就是说a变量对应的引用指向了对象3。
2) a=“span”, python 又会创建一个对象"span", 由于变量a已经存在,那么就直接把变量a的引用指向了对象"span", 至此,对象3就成为了在内存中没有引用的对象。
3)由于没有引用指向"3", 那么垃圾收集器就开始工作,回收掉该对象,同时释放掉该对象对应的内存。
18. python下面程序打印的结果为?
import copy
a = [1, 2, 3]
c = a
b = copy.copy(a)
print(b, "是否相等:", b == a)
a = [1, [1, 2, 3], 2, 3]
b = copy.copy(a)
print(b, "是否相等:", b == a)
b = copy.deepcopy(a)
print(b, "b是否相等a:", b == a) # True
print(b, "b是否相等c:", b == c) # False
print(b, "a是否相等c:", a == c) # False
# 将a的引用赋值给C后,b还是和a相等,c那么就是一个新的引用,即新的地址指向[1,2,3]
由于b是a 拷贝出来的,那么地址也是一样的,相等于是同一个东西,因此是相等的。c=a, 是指python会在内存中先创建一个变量c, 地址当然与a是不一样的, 但是a与c 都是引用对象[1,2,3], 所以c与a和b不相等。
19. 深拷贝与浅拷贝的区别?
答: 深拷贝是指拷贝本对象以及本对象所有的引用都会复制一份,浅拷贝是指只复制当前对象里的所有属性内容,不包括引用。
20. 思考下面三段代码,他们会改变A打印出来的值嘛?
答:
- 不会,只改变了B的值,B=A表示B和A都指向了对象"spam" , B=“shrubbery” 表示的是B的引用指向了该对象。
- 会,因为 A和B共享引用 [“spam”]里的内容,改变B[0],那么A也会对应发生改变。
- 不会,因为分片A[:]会先拷贝一份A, 修改B,只会影响拷贝的那个,不会影响A的打印结果。
21. 字符串反斜杠转义符
转移 | 意义 |
---|---|
\ | 反斜杠 |
’ | 单引号 |
‘’ | 双引号 |
\b | 倒退 |
\f | 换页 |
\n | 换行 |
\t | 水平制表符 |
\v | 垂直制表符 |
\xhh | 十六进制,转义的十六进制的长度始终为1 |
\000 | 八进制,转义的八进制长度始终为1 |
\0 | NULL(字符串结尾) |
22. 字符串反斜杠问题,以下字符串打印的长度为多少?
1) s='a\0b\0c'
len(s)
2) s='\001\002\003'
len(s)
3) s='\x00m'
len(s)
打印结果分别为:
- 5, \0相当于在字符串中的二进制0。
- 3, \001 相当于八进制的对应的字符,因此长度为3。
- 2, \x00 相当于16进制的对应的字符,因此长度为2。
23. python中修改字符串的方式有哪几种方式?
答:
- 如果对已知字符串,可以使用分片的方式来修改字符串,如下: 替换掉 ‘big’
s= 'a big apple'
s= s[:2]+"new"+s[5:]
- 使用replace()方法替换目标字符串。
s= 'a big apple'
s=s.replace("big",new)
- 使用find()方法来找到目标位置,然后再使用分片, 另外find()方法,如果找不到位置的话,那么返回-1。
s= 'a big apple'
pos=s.find("big")
s=s[:pos]+"new"+s[pos+3:]
最终打印结果都为:
24. python中常用的字符串常量和表达?
操作 | 解释 |
---|---|
s="""…""" | 三引号,多行注释,同时也表示一个字符串相当于’…’ |
s=r’abc’ | raw字符串,能够抑制转义,一般用在url上 |
s1+s2 | 合并字符串s1,s2 |
s1*3 | 重复字符串3遍 |
“a %s applie”% big | 格式化字符串 |
s.rtrip() | 移除空格,压缩字符串 |
s.split(",") | 将字符串按照’,’ 分割 |
s.isdigit() | 返回值为boolean,判断该字符串是否为数字字符串 |
s.lower() | 转换为小写 |
s.endwith(“test”) | 结束测试,是否以test结尾 |
‘,’ .join(strlist) | 给字符串插入分隔符, |
s.encode(“latin-1”) | unicode编码 |
‘test’ in s | 判断是否在字符串中 |
[x for x in x] | 迭代列表,字符串转换成列表 |
m = map(lambda g: ord(g.swapcase()), s) | 通过方法ord() 进行转换, 返回一个map object,map是一个迭代器 |
25. python中如何将字符转换为ASCII码, 如何反向转换,将整数转换为字符?
答: python的内置函数ord(‘a’),可以将单个字符转换成ascii码, 内置的chr(12),可以将字符转换为对应的整数。
26. python3中整数和字符串在列表中能排序嘛?
答: 不能,会出现异常 : TypeError: ‘<’ not supported between instances of ‘str’ and ‘int’
另外,在python 2.6之前,列表里的不同类型数据是可以比较的,并且Int类型比str类型小。
27. 列表的append()方法为什么比"+" 快?
答: 因为执行append()方法添加元素时,不需要创建新的对象,而用"+"时,会创建出一个新的列表对象,然后再做拼接,创建对象或消化额外的资源和时间。
import time
import random
l = [1, 2, 4]
start = time.time()
# 使用append添加100万个元素耗时9s
for i in range(0, 1000000):
l.append(random.randint(0, 10))
end = time.time()
print("总共耗时:", (end - start))
# 使用+ 来添加1000个元素
start = time.time()
for i in range(0, 1000):
l + [random.randint(0, 10)]
end = time.time()
print("总共耗时:", (end - start))
打印结果:
总共耗时: 0.9624276161193848
总共耗时: 3.5864064693450928
28. 怎么使用列表实现一个栈?
答: 代码实现如下:
# 使用列表实现一个栈
class Stack:
array = []
# 入栈
def push(self, val):
self.array.append(val)
# 弹出栈顶元素
def pop(self):
self.array.pop()
29. 什么是重定向输出流? 怎么使用print()将方法将日志输入到文件里?
答: 首先,看一下Print()方法
def print(self, *args, sep=' ', end='\n', file=None): # known special case of print
"""
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
"""
pass
可以发现,打印出来的内容其实可以输出到file里,通过赋值给sys.stdout将打印在控制台上的文字输出到文件里。
方式一 :全局输出定向到文件里, 相当于用文件去接收print()方法里的内容
import sys
sys.stdout = open("log.txt", 'a')
print("error info!")
方式二: 指定输出到文件里,此方式比第一种方式较灵活。
log = open("log.txt", 'a')
print("a", "b", file=log)
print("abc")
执行代码,查看log.txt文件:
30. 在python中,举出三种可以把变量赋值成相同值的方式?
答:
1) 多重目标赋值方式 a=b=c=1
2) 序列赋值方式a,b,c=1,2,3 或者一行赋值多个,a=1,b=2,c=3
3) 可以使用分页在一行赋值多个变量。a=1;b=2;c=3 ,这本来是三个独立的表达式
31. 将三个变量赋值给可变对象时,你可能需要注意什么问题?
答:
比如a=b=c=[], 如果是三个变量的值引用同一个列表对象,那么其中一个a改变了[] 的 容量,b和c的打印出来的值也会发生改变,而数字和字符串是不会出现这样的问题的,因为数字和字符串是不可变的对象。
32. L=L.sort() 有什么错误?
答:
L.sort()的返回值为None, 如果用None赋值给L,那么排序后的结果为None。
33. open文件调用中,默认的处理模式自变量是什么?
答: 处理模式的参数默认值为‘r’: 读取输入。
34. 用python生成一个指定位数的随机数字字符串?
答:
def generate_number(length):
start = int("1" + "0" * (length - 1))
end = int("9" * length)
return random.randrange(start, end)
35. 当一个函数没有return语句时,它会返回什么?
答: 会返回一个None。
36. 作用域问题,以下打印结果为?
答: 88, 因为局部变量非global不能修改全局变量。
37. global有什么用? 以下打印结果为?
答: global能在方法里声明一个全局变量,带有global的变量可以被函数外部引用。
X = 88
def func():
global X
X = 99
func()
print(X)
打印结果为: 99
38. 什么是nonlocal? global和nonlocal的区别是什么?
答: nonlocal是指定函数外部的变量的修改可以只在一个函数起作用,作用的范围只在一个函数里,在python3.0引入。
nonlocal和global的区别在于,对外部变量的修改影响的作用范围不同,global声明的变量可以影响全局,nonlocal声明的变量对外面变量的影响只在本函数内, 另外nonlocal一般会应用在嵌套作用域里,能控制变量影响的范围。
- global 使得作用域查找从嵌套作用域开始,如果不存在,那么就继续向外查询, 并且global允许对那里的名称进行赋值。
- nonlocal 限制作用域查找的只是嵌套的def , 要求名称已经存在那里,并且对他们进行赋值,作用域不会继续查找到全局作用域或内置作用域。
例: 默认情况下,嵌套作用域不允许修改外部的变量, 那么可以使用nonlocal修改嵌套作用域的变量
def func1(a):
state = a
def nested(b):
nonlocal state
state += 1
print(state, b)
return nested
F = func1(5)
F(6)
打印结果: 6 6
注:
使用nonlocal在嵌套作用域里声明变量时,一定要注意变量必须在嵌套作用域的外部声明,否则会抛出异常:
no binding for nonlocal state。
而global声明的变量,不需要在外部存在!
39. 什么是LEGB原则?
答: LEGB原则是变量名解析的一个原则。主要包含以下三点:
- 变量名引用分为三个作用域进行查找: 本地,(如果函数内有变量,那么会查找函数内), 全局,内置。
- 在默认情况下,变量名赋值会创建或改变本地变量。
- 全局声明和非本地声明的变量会映射到模块文件内部的作用域。
下图为LEGB作用域查找原则:
40. 函数设计的概念?
答:
耦合性:
1) 对于输入使用参数并且对于输出使用return语句。
2) 只要在真正必要的情况下使用全局变量。
3) 不要改变可变类型的参数。
4) 避免直接改变在另一个模块文件中的变量。
聚合性:
1) 每一个函数应该都有单一、统一的目标。
大小性
1) 每一个函数应该相对较小。
41. 三元表达式怎么写?
答: x if y else z 等同于((y and x) or z)
42. 请比较map、filter和reduce函数的区别?
答: map函数用来收集每一项函数传过来的结果,filter收集每一项返回结果为True的值,reduce不能在内置作用域使用,只能通过functools来导入reduce,用来计算所有项的和或乘积等,返回结果为一个值。map和filter的结果需要通过list()方法来转换得到一个列表结果。
43. 什么是函数的注解?
答: 函数注解在python 3.0后可以使用,主要是对函数的参数和返回结果进行说明, 可在终端使用__annotations__属性获取到所有的属性,返回的结果是一个字典。
>>> def func(a:'apple',b:'banana'):
... return a+b
...
>>> func(1,2)
3
>>> func.__annotations__
{'a': 'apple', 'b': 'banana'}
>>>
44. python怎么定义main()方法?
答: if __name__=="__main__"
45. 改变sys.pyth和改变pythonpath来修改模块的搜索路径有什么不同?
答: 如果只是改变 sys.pyth 列表里的内容,在程序退出时,sys.pyth列表的内容会恢复成之前的模样,即程序对其修改无效,如果修改pythonpath,那么搜索路径对所有程序都有效。
46. 如果用户通过交互模式输入模块的变量名进行测试,你该怎样进行导入?
答: 通过import语句,并通过exec来进行执行,或把字符串名传给__import__函数来进行调用。
47. python类的构造函数是什么?
答: 是在从类生成实例时,会自动调用__init__()方法,我们可以在该方法里初始化类的属性。
48. python 怎么拦截异常?
答: 使用try… except 异常类型 as e, 来拦截并处理异常,在项目中要避免空except的情况,否则可能会导致应用程序终止。
49. python怎么用map替代for循环?
map的__init__方法为:
def __init__(self, func, *iterables): # real signature unknown; restored from __doc__
pass
实现:
a = [1, 2, 3, 5]
res = list(map(lambda x: x * 2, a))
print(res)
50. python排序列表中的字典,怎么按照列表中字典指定的key或者value来排序?
a = [
{
"value": "用途",
"name": "t4"
},
{
"value": "期初累计摊额",
"name": "t10"
},
{
"value": "原值",
"name": "t5"
},
{
"value": "增加日期",
"name": "t3"
},
]
a.sort(key=lambda s: int(s["name"][1:]))
# a.sort(key=lambda s: s["name"])
print(a)
打印结果:
[{'value': '增加日期', 'name': 't3'}, {'value': '用途', 'name': 't4'}, {'value': '原值', 'name': 't5'}, {'value': '期初累计摊额', 'name': 't10'}]
51. python怎么获取当前时间?
- 不带时区
import datetime
now = datetime.datetime.now()
52. python常用的计算表达式有哪些?
符号 | 含义 |
---|---|
** | 乘方,如10**2=100 |
pow(x,y) | x的y次方,如pow(10,2)=100 |
// | 整除,结果舍去小数点后的部分,如101//10=10 |
% | 取余,如10%3=1 |
53. 怎么将字符串中的多个空格替换成其他字符?
使用re正则表达式中的sub方法,第一个参数是正则表达式,第二个参数为target_str。
import re
name=re.sub("\\s+", "_", name)
web篇
1. HTTP的基本交互流程?
答:
(1)输入网址并按Enter键,比如访问http://mysite:8080/app/index.html。
(2)浏览器通过域名系统查询mysite的真实IP,比如212.34.98.20。
(3)向服务器212.34.98.20的8080端口发起TCP连接请求并建立连接。
(4)发送HTTP请求的内容,包括访问的地址/app/index.html、访问方式GET、浏览器本身的产品名等。
(5)服务器返回/app/index.html中的数据作为Response发送给客户端。如果请求的不是一个文件,则服务器需要执行相应的代码,动态生成且返回给客户端。
(6)浏览器接收到结果后关闭与服务器的TCP链接。
(7)浏览器将接收到的结果呈现在显示器上。