跳到主要内容
2023 年常见 Python 面试题及答案(上篇) | 极客日志
Python AI 算法
2023 年常见 Python 面试题及答案(上篇) Python 面试常见问题涵盖基础特性、数据结构、内存管理、面向对象编程及运算符等。内容包含深拷贝与浅拷贝区别、列表元组差异、多线程机制、继承类型、Flask 框架简介、内置函数用法、猴子补丁、字典操作、参数传递方式、文件处理、字符串方法及各类运算符详解。适合新手复习基础概念及有经验者查漏补缺。
锁机制 发布于 2025/2/7 更新于 2026/6/3 23 浏览Q 1:Python 有哪些特点和优点?
作为一门编程入门语言,Python 主要有以下特点和优点:
可解释 :代码无需编译即可运行。
具有动态特性 :支持运行时修改对象属性。
面向对象 :支持类、继承和多态。
简明简单 :语法接近自然语言,易读易写。
开源 :社区活跃,资源丰富。
具有强大的社区支持 :拥有大量第三方库和文档。
实际上 Python 的优点远不止如此,建议阅读官方文档详细了解。
Q 2:深拷贝和浅拷贝之间的区别是什么?
答:深拷贝就是将一个对象拷贝到另一个对象中,这意味着如果你对一个对象的拷贝做出改变时,不会影响原对象。在 Python 中,我们使用函数 deepcopy() 执行深拷贝,导入模块 copy,如下所示:
>>> import copy
>>> b = copy.deepcopy(a)
而浅拷贝则是将一个对象的引用拷贝到另一个对象上,所以如果我们在拷贝中改动,会影响到原对象。我们使用函数 copy.copy() 执行浅拷贝,使用如下所示:
>>> b = copy.copy(a)
Q 3. 列表和元组之间的区别是?
答:二者的主要区别是列表是可变的,而元组是不可变的。举个例子,如下所示:
>>> mylist = [1 , 3 , 3 ]
>>> mylist[1 ] = 2
>>> mytuple = (1 , 3 , 3 )
>>> mytuple[1 ] = 2
Traceback (most recent call last):
File "<pyshell#97>" , line 1 , in <module>
mytuple[1 ]=2
TypeError: 'tuple' object does not support item assignment
会出现以下报错:TypeError: 'tuple' object does not support item assignment。
关于列表和元组的更多内容,建议查阅相关数据结构文档。
Q 4. 解释一下 Python 中的三元运算子
不像 C++,我们在 Python 中没有 ?:,但我们有这个语法:
[on true] if [expression] else [on false]
如果表达式为 True,就执行 [on true] 中的语句。否则,就执行 [on false] 中的语句。
>>> a, b = 2 , 3
>>> min_val = a if a < b else b
>>> min_val
2
>>> print ("Hi" ) if a < b else print ("Bye" )
Q 5. 在 Python 中如何实现多线程? 一个线程就是一个轻量级进程,多线程能让我们一次执行多个线程。我们都知道,Python 是多线程语言,其内置有多线程工具包。
Python 中的 GIL(全局解释器锁)确保一次执行单个线程。一个线程保存 GIL 并在将其传递给下个线程之前执行一些操作,这会让我们产生并行运行的错觉。但实际上,只是线程在 CPU 上轮流运行。当然,所有的传递会增加程序执行的内存压力。对于 I/O 密集型任务,多线程有效;但对于 CPU 密集型任务,建议使用多进程。
Q 6. 解释一下 Python 中的继承 当一个类继承自另一个类,它就被称为一个子类/派生类,继承自父类/基类/超类。它会继承/获取所有类成员(属性和方法)。
继承能让我们重新使用代码,也能更容易的创建和维护应用。Python 支持如下种类的继承:
单继承 :一个类继承自单个基类。
多继承 :一个类继承自多个基类。
多级继承 :一个类继承自单个基类,后者则继承自另一个基类。
分层继承 :多个类继承自单个基类。
混合继承 :两种或多种类型继承的混合。
Q 7. 什么是 Flask? Flask 是 Python 编写的一款轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug,模板引擎则使用 Jinja2。Flask 使用 BSD 授权。其中两个环境依赖是 Werkzeug 和 jinja2,这意味着它不需要依赖外部库。正因如此,我们将其称为轻量级框架。
Flask 会话使用签名 cookie 让用户查看和修改会话内容。它会记录从一个请求到另一个请求的信息。不过,要想修改会话,用户必须有密钥 Flask.secret_key。
Q 8. 在 Python 中是如何管理内存的? Python 有一个私有堆空间来保存所有的对象和数据结构。作为开发者,我们无法访问它,是解释器在管理它。但是有了核心 API 后,我们可以访问一些工具。Python 内存管理器控制内存分配。
另外,内置垃圾回收器会回收使用所有的未使用内存,所以使其适用于堆空间。Python 使用引用计数作为主要的内存管理机制,当对象的引用计数降为 0 时,内存会被释放。循环引用问题则由垃圾回收器处理。
Q 9. 解释 Python 中的 help() 和 dir() 函数 Help() 函数是一个内置函数,用于查看函数或模块用途的详细说明:
>>> import copy
>>> help (copy.copy)
Help on function copy in module copy :
copy (x)
Shallow copy operation on arbitrary Python objects.
See the module 's __doc__ string for more info.
Dir() 函数也是 Python 内置函数,dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。
['__annotations__' , '__call__' , '__class__' , '__closure__' , '__code__' , '__defaults__' , '__delattr__' , '__dict__' , '__dir__' , '__doc__' , '__eq__' , '__format__' , '__ge__' , '__get__' , '__getattribute__' , '__globals__' , '__gt__' , '__hash__' , '__init__' , '__init_subclass__' , '__kwdefaults__' , '__le__' , '__lt__' , '__module__' , '__name__' , '__ne__' , '__new__' , '__qualname__' , '__reduce__' , '__reduce_ex__' , '__repr__' , '__setattr__' , '__sizeof__' , '__str__' , '__subclasshook__' ]
Q 10. 当退出 Python 时,是否释放全部内存? 答案是 No。循环引用其它对象或引用自全局命名空间的对象的模块,在 Python 退出时并非完全释放。
另外,也不会释放 C 库保留的内存部分。这在某些嵌入式或长期运行的脚本中需要注意。
Q 11. 什么是猴子补丁? 在运行期间动态修改一个类或模块。这通常用于测试或扩展功能。
>>> class A :
... def func (self ):
... print ("Hi" )
...
>>> def monkey (self ):
... print ("Hi, monkey" )
...
>>> A.func = monkey
>>> a = A()
>>> a.func()
Q 12. Python 中的字典是什么? 字典是 C++ 和 Java 等编程语言中所没有的东西,它具有键值对。它是无序的集合(Python 3.7+ 保持插入顺序)。
>>> roots = {25 : 5 , 16 : 4 , 9 : 3 , 4 : 2 , 1 : 1 }
>>> type (roots)
<class 'dict' >
>>> roots[9 ]
3
字典是不可变的键,但值是可变对象。我们也能用一个推导式来创建它。
>>> roots = {x**2 : x for x in range (5 , 0 , -1 )}
>>> roots
{25 : 5 , 16 : 4 , 9 : 3 , 4 : 2 , 1 : 1 }
Q 13. 请解释使用*args 和**kwargs 的含义 当我们不知道向函数传递多少参数时,比如我们向传递一个列表或元组,我们就使用 *args。
>>> def func (*args ):
... for i in args:
... print (i)
>>> func(3 , 2 , 1 , 4 , 7 )
在我们不知道该传递多少关键字参数时,使用 **kwargs 来收集关键字参数。
>>> def func (**kwargs ):
... for i in kwargs:
... print (i, kwargs[i])
>>> func(a=1 , b=2 , c=7 )
Q 14. 请写一个 Python 逻辑,计算一个文件中的大写字母数量 >>> import os
>>>
>>>
>>> with open ('Today.txt' , encoding='utf-8' ) as today:
... count = 0
... for char in today.read():
... if char.isupper():
... count += 1
>>> print (count)
Q 15. 什么是负索引? >>> mylist = [0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ]
Q 16. 如何以就地操作方式打乱一个列表的元素? 为了达到这个目的,我们从 random 模块中导入 shuffle() 函数。
>>> from random import shuffle
>>> shuffle(mylist)
>>> mylist
[3, 4, 8, 0, 5, 7, 6, 2, 1 ]
Q 17. 解释 Python 中的 join() 和 split() 函数 >>> '1,2,3,4,5' .split(',' )
['1' , '2' , '3' , '4' , '5' ]
Q 18. Python 区分大小写吗? 如果能区分像 myname 和 Myname 这样的标识符,那么它就是区分大小写的。也就是说它很在乎大写和小写。我们可以用 Python 试一试:
>>> myname = 'Ayushi'
>>> Myname
Traceback (most recent call last):
File "<pyshell#3>" , line 1 , in <module>
NameError: name 'Myname' is not defined
可以看到,这里出现了 NameError,所以 Python 是区分大小写的。
Q 19. Python 中的标识符长度能有多长? 在 Python 中,标识符可以是任意长度。此外,我们在命名标识符时还必须遵守以下规则:
只能以下划线或者 A-Z/a-z 中的字母开头
其余部分可以使用 A-Z/a-z/0-9
区分大小写
关键字不能作为标识符,Python 中共有如下关键字:
False, None, True, and, as, assert, async, await, break, class, continue, def, del, elif, else, except, finally, for, from, global, if, import, in, is, lambda, nonlocal, not, or, pass, raise, return, try, while, with, yield
Q 20. 怎么移除一个字符串中的前导空格? 字符串中的前导空格就是出现在字符串中第一个非空格字符前的空格。我们使用方法 lstrip() 可以将它从字符串中移除。
可以看到,该字符串既有前导字符,也有后缀字符,调用 lstrip() 去除了前导空格。如果我们想去除后缀空格,就用 rstrip() 方法。
Q 21. 怎样将字符串转换为小写? 另外,使用 isupper() 和 islower() 方法检查字符是否全为大写或小写。
>>> 'AyuShi' .isupper()
False
>>> 'AYUSHI' .isupper()
True
>>> 'ayushi' .islower()
True
>>> '@yu$hi' .islower()
True
>>> '@YU$HI' .isupper()
True
那么,像@和$这样的字符既满足大写也满足小写条件(因为它们不是字母)。
istitle() 能告诉我们一个字符串是否为标题格式。
>>> 'The Corpse Bride' .istitle()
True
Q 22. Python 中的 pass 语句是什么? 在用 Python 写代码时,有时可能还没想好函数怎么写,只写了函数声明,但为了保证语法正确,必须输入一些东西,在这种情况下,我们会使用 pass 语句。
>>> def func (*args ):
... pass
>>> for i in range (7 ):
... if i == 3 : break
>>> print (i)
最后,continue 语句能让我们跳到下个循环。
>>> for i in range (7 ):
... if i == 3 : continue
... print (i)
Q 23. Python 中的闭包是什么? 当一个嵌套函数在其外部区域引用了一个值时,该嵌套函数就是一个闭包。其意义就是会记录这个值。
>>> def A (x ):
... def B ():
... print (x)
... return B
>>> A(7 )()
更多关于闭包的知识,建议参考 Python 作用域规则文档。
Q 24. 解释一下 Python 中的//,%和**运算符 // 运算符执行地板除法(向下取整除),它会返回整除结果的整数部分。
同样地,** 执行取幂运算。a**b 会返回 a 的 b 次方。
>>> 13 % 7
6
>>> 3.5 % 1.5
0.5
Q 25. 在 Python 中有多少种运算符?解释一下算数运算符。 在 Python 中,我们有 7 种运算符:算术运算符、关系运算符、赋值运算符、逻辑运算符、位运算符、成员运算符、身份运算符。
我们有 7 个算术运算符,能让我们对数值进行算术运算:
>>> 7 / 8
0.875
>>> 1 / 1
1.0
Q 26. 解释一下 Python 中的关系运算符
小于号(<),如果左边的值较小,则返回 True。
大于号(>),如果左边的值较大,则返回 True。
小于等于号(<=),如果左边的值小于或等于右边的值,则返回 Ture。
大于等于号(>=),如果左边的值大于或等于右边的值,则返回 True。
等于号(==),如果符号两边的值相等,则返回 True。
>>> {1 , 3 , 2 , 2 } == {1 , 2 , 3 }
True
不等于号(!=),如果符号两边的值不相等,则返回 True。
>>> True != 0.1
True
>>> False != 0.1
True
Q 27. 解释一下 Python 中的赋值运算符 >>> a = 7
>>> a += 1
>>> a
8
>>> a -= 1
>>> a
7
>>> a *= 2
>>> a
14
>>> a /= 2
>>> a
7.0
>>> a **= 2
>>> a
49
>>> a //= 3
>>> a
16.0
>>> a %= 4
>>> a
0.0
Q 28. 解释一下 Python 中的逻辑运算符 Python 中有 3 个逻辑运算符:and,or,not。
>>> False and True
False
>>> 7 < 7 or True
True
>>> not 2 == 2
False
Q 29. 解释一下 Python 中的成员运算符 通过成员运算符'in'和'not in',我们可以确认一个值是否是另一个值的成员。
>>> 'me' in 'disappointment'
True
>>> 'us' not in 'disappointment'
True
Q 30. 解释一下 Python 中的身份运算符 通过身份运算符'is'和'is not',我们可以确认两个值是否相同(即内存地址是否一致)。
>>> 10 is '10'
False
>>> True is not False
True
Q 31. 讲讲 Python 中的位运算符
与(&),按位与运算符:参与运算的两个值,如果两个相应位都为 1,则该位的结果为 1,否则为 0
或(|),按位或运算符:只要对应的二个二进位有一个为 1 时,结果位就为 1。
异或(^),按位异或运算符:当两对应的二进位相异时,结果为 1
取反(~),按位取反运算符:对数据的每个二进制位取反,即把 1 变为 0,把 0 变为 1
左位移(<<),运算数的各二进位全部左移若干位,由 << 右边的数字指定了移动的位数,高位丢弃,低位补 0
右位移(>>),把 >> 左边的运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数
Q 32. 在 Python 中如何使用多进制数字? 我们在 Python 中,除十进制外还可以使用二进制、八进制和十六进制。
二进制数字由 0 和 1 组成,我们使用 0b 或 0B 前缀表示二进制数。
使用 bin() 函数将一个数字转换为它的二进制形式。
八进制数由数字 0-7 组成,用前缀 0o 或 0O 表示 8 进制数。
十六进数由数字 0-15 组成,用前缀 0x 或者 0X 表示 16 进制数。
>>> hex (16 )
'0x10'
>>> hex (15 )
'0xf'
Q 33. 怎样获取字典中所有键的列表? >>> mydict = {'a' : 1 , 'b' : 2 , 'c' : 3 , 'e' : 5 }
>>> mydict.keys()
dict_keys(['a' , 'b' , 'c' , 'e' ])
Q 34. 为何不建议以下划线作为标识符的开头 因为 Python 并没有私有变量的概念,所以约定速成以下划线为开头来声明一个变量为私有。所以如果你不想让变量私有,就不要使用下划线开头。
Q 35. 怎样声明多个变量并赋值? >>> a, b, c = 3 , 4 , 5
>>> a = b = c = 3
Q 36. 元组的解封装是什么? >>> mytuple = 3 , 4 , 5
>>> mytuple
(3 , 4 , 5 )
这将 3,4,5 封装到元组 mytuple 中。
>>> x, y, z = mytuple
>>> x + y + z
总结与建议 本文涵盖了 Python 基础面试的核心考点,包括数据类型、内存机制、面向对象及常用内置函数。建议在准备面试时,不仅要记忆答案,更要理解背后的原理,例如 GIL 对多线程的影响、深浅拷贝的内存模型差异等。同时,动手实践代码片段有助于加深记忆。对于进阶开发者,还需关注装饰器、生成器、异步编程等高级主题。
相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
RSA密钥对生成器 生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
Mermaid 预览与可视化编辑 基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
随机西班牙地址生成器 随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
Gemini 图片去水印 基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online