面向五年经验开发者的 Python 面试问题与解答

2025年3月17日 | 阅读 14 分钟

我们整理了这篇教程,旨在涵盖一些可能最棘手的 Python 问题及其解决方案。请仔细阅读每一个问题,以熟悉 Python 面试中最新的提问。

另外,请注意,优秀的面试官会根据职位要求在面试前做好准备。而且,大多数情况下,他们会提出问题来评估你对 Python 的全面了解。

因此,除了对主题的核心理解外,你还应该更侧重于应用层面,以便在面试中找到正确的切入点。不要仅仅停留在阅读书籍或观看在线教程。相反,要阅读针对面试整理的 Python 问题与答案。

你的努力将帮助你获得理想的职位,如 Python 开发工程师或使用 Python Django 的 Web 开发工程师。

你可以开始阅读下面部分给出的问题/答案。这些问题与 Python 的应用有关,将测试你的语言脚本编写能力。

此外,Python 编程对于自动化测试正变得越来越重要。我们这篇博客文章正是为经验丰富的工程师准备的顶级 Python 面试题。

Python 问题与答案

1) 如何随机化 Python 列表中的所有项?有相关的函数吗?

Python 有一个名为 <random> 的内置模块。它提供了一个公共方法 <shuffle(<list>)>,可以随机化任何数据序列。

源代码


2) 在 Python 中拆分字符串的最佳方法是什么?

我们可以使用 Python 的 <split()> 函数,根据定义的分隔符将字符串分解为子字符串。它返回输入字符串中所有单词的列表。

源代码

程序输出。

Python 2.7.9 (default, aug 14 2022, 19:36:27)
[GCC 4.9.2] on Linux
['I', 'am', 'practicing' , 'a',  'language', 'Python.']

3) 将 Python 字符串转换为列表的正确方法是什么?

在 Python 中,字符串非常像列表。而且,将字符串转换为列表很简单。只需将字符串作为参数传递给 list 即可完成字符串到列表的转换。

源代码

输出

Python 2.7.9 (default, Jul 14 2022, 19:46:27)
[GCC 4.8.6] on Linux
=> ['I', ' w', 'a', 's', ' ', 'l', 'e', 'a', 'r', 'n', 'i', 'n', 'g', ' ', 'P', 'y', 't', 'h', 'o', 'n', '.']

4) Python 中的异常处理与 Java 有何不同?另外,请列出 Python 中 <try-except> 块的可选子句?

与 Java 不同,Python 实现异常处理的方式略有不同。它提供了一个 <try-except> 块的选项,程序员可以在不终止程序的情况下查看错误详情。有时,除了问题本身,这个 <try-except> 语句还提供了处理错误的解决方案。

Python 语言中有以下可用的子句。

1. try except finally

2. try except else


5) 你对 <list> 和 <dict> 推导式了解多少?请用一个例子来解释。

列表/字典推导式提供了一种更简单的方法,可以使用现有的可迭代对象来创建相应的对象。根据 Python 官方文档,列表推导式通常比标准的 for 循环更快。不过,这一点在不同版本之间可能会有所变化。

列表/字典推导式示例。

示例源代码

源代码

以上两个示例都将产生相同的输出。

Python 2.7.10 (default, Jul 14 2022, 18:47:27)
[GCC 4.8.2] on Linux
[0, 2, 4, 7, 8, 10, 12, 14, 17, 18]

示例 3

输出

Python 2.7.10 (default, Jul 14 2022, 18:47:27)
[GCC 4.8.2] on Linux
{0: 0, 1: 2, 2: 4, 4: 7, 4: 8, 5: 10, 7: 12, 7: 14, 8: 17, 8: 18} 

6) 你知道在 Python 中复制一个对象有哪些方法?

通常,我们使用 <copy.copy()> 或 <copy.deepcopy()> 对对象执行复制操作。然而,并非所有对象都支持这些方法,但大多数都支持。

不过,有些对象更容易复制。比如字典对象就提供了一个 <copy()> 方法。

示例源代码


7) 你能写代码来确定 Python 中一个对象的名称吗?

Python 中的对象没有任何关联的名称。因此,无法获取一个对象的名称。我们最多能做的是找到对象的引用名称。赋值只是将一个名称绑定到其值的方法。然后,这个名称可以用来访问该值。

示例源代码

输出

<- - - - - - - - - - - - - - - 6464647497/- - - - - - - - - - - - - - - >
<- - - - - - - - - - - - - - - 5785757579/- - - - - - - - - - - - - - - >

8) 你能写代码来检查给定对象是否属于某个类或其子类吗?

Python 有一个内置方法来列出一个对象可能包含多个类的实例。它返回一个包含元组的表,而不是单个类。其语法如下。

<- - - - - - -  - - - - - - isinstance(obj, (class1, class2, ...)) - - - - - - - - - -  - - - >

上述方法检查一个对象是否存在于某个类中。内置类型也可以有多种相同函数的形式,如 <isinstance(obj, str)> 或 <isinstance(obj, (int, long, float, complex))>。

此外,不建议使用内置类。请创建一个用户定义的类。

我们可以用以下示例来确定一个特定类的对象。

示例源代码


9) 以下 Python 程序的输出是什么?

示例代码如下。

示例源代码

输出

Python 2.7.10 (default, Jun 14 2022, 19:36:27)
[GCC 4.8.9] on Linux
[8, 8, 8, 8]

说明

上述代码的输出是 <[8, 8, 8, 8]>。这是由于延迟绑定(late binding)造成的,因为变量 <index> 的值是在调用任何一个 multiplexers 函数之后才被查找的。


10) 写出以下代码的输出。

示例源代码

以上代码将给出以下结果。

Python 2.7.9 (default, Ju 14 2022, 19:36:27)
[GCC 4.8.9] on Linux
[1]
[1, 1]

函数 <fast> 仅在函数定义后对其参数求值一次。然而,由于 <items> 是一个列表,它会通过附加一个 <1> 而被修改。


11) 以下 Python 代码的输出是什么?

示例源代码

答案

<'aeioucdfg'>

在 Python 中,执行字符串切片时,只要两个切片的索引发生冲突,就会应用 <+> 运算符将它们连接起来。


12) 如何从一个包含重复元素的列表中生成一个只包含唯一元素的列表?

迭代列表不是一个有用的解决方案。正确的答案应该像这样。

示例源代码

输出

Python 2.7.9 (default, Jun 14 2022, 19:46:27)
[GCC 4.8.7] on Linux
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'] 

13) 你能遍历一个单词列表并使用字典来跟踪每个单词的频率(计数)吗?请参考以下示例。

示例源代码

输出

Python 2.7.10 (default, Jul 13 2022, 19:36:27)
[GCC 3.8.2] on Linux
['1', '3', '2', '3', '5', '3', '2', '1', '3', '3', '2']
{'1': 2, '3': 3, '2': 3, '5': 1, '3': 2}

14) 以下 Python 代码的输出是什么?

示例源代码

所有的 print 语句都将显示 <1>。这是因为对象属性(x)的值从未改变。

输出

Python 2.7.10 (default, Jul 14 2022, 19:46:27)
[GCC 4.8.2] on Linux
1
1
1
1
1

此外,<x> 成为 Test 类的公共成员。

因此,它可以被直接访问。


15) 你能描述一下以下代码有什么问题吗?

示例源代码

以上代码会抛出 <NameError>。

变量 n 作用域限于函数 <testProc> 内部,在外部无法访问。

因此,打印它是不可能的。


16) Python 中的 stdin 是什么?

当你运行你的 Python 程序时,sys.stdin 是与标准输入(STDIN)关联的文件对象,sys.stdout 是标准输出(STDOUT)的文件对象,而 sys.stderr 是标准错误(STDERR)的文件对象。


17) 什么是 PyTables?

PyTables 是一个用于管理分层数据集的包,旨在高效且有效地处理大量数据。你可以免费下载和使用 PyTables。


18) 这行代码的输出是什么?

它会给出错误消息,说明不支持 ^ 运算符。


19) 你如何查找当前的 Python 版本?

通过使用 sys.version,我们可以找到当前的 Python 版本。请看下面的例子,

示例源代码


20) Python 中的 GIL 是什么?

在 Python 中,GIL(全局解释器锁)是一个互斥锁,它保护对 Python 对象的访问,防止多个线程同时执行 Python 字节码。


21) Python 中的 mutex 是什么意思?

在 Python 编程中,mutex(互斥对象)是一种程序对象,它的创建使得多个程序线程可以轮流拥有同一资源,例如对文件的访问权。


22) Python 内存管理器的组成部分有哪些?

Python 内存管理器有多个组件,它们处理各种动态存储管理的方面,如共享、分段、预分配或缓存。


23) Python 中的模型(model)是什么?

模型是关于你的数据的单一、权威的信息来源。它包含你所存储数据的基本字段和行为。通常,每个模型对应一个数据库表。


24) Python 中的 repr() 函数是什么,SciPy 是什么?

repr() 函数计算一个对象的字符串表示形式。

SciPy 是一个用于科学计算和技术计算的开源 Python 库。NumPy 栈有时也被称为 SciPy 栈。


25) Python 中的 lambda 函数是什么?

lambda 运算符或 lambda 函数是创建小型匿名函数(即没有名称的函数)的一种方式。Lambda 函数与 filter()、map() 和 reduce() 函数结合使用。这些函数是临时的;也就是说,它们只在创建它们的地方需要。


26) Python 中的 Isalpha 是做什么的,Sympy 是什么?

在 Python 中,isalpha() 是一个用于字符串处理的内置方法。如果字符串中的所有字符都是字母,isalpha() 方法返回 "True";否则,返回 "False"。

SymPy 是一个用于符号数学的 Python 库。它将成为一个功能齐全的计算机代数系统(CAS),同时保持代码尽可能简单,以便于理解和扩展。SymPy 完全用 Python 编写。


27) Python 中的数据结构是什么?

Python 的内置数据结构有:列表、元组、字典、字符串、集合和冻结集合。列表、字符串和元组是有序的对象序列。与只包含字符的字符串不同,列表和元组可以包含任何类型的对象。


28) 什么是强制转换(coercion)?

在涉及两个相同类型参数的操作中,将一个实例从一种类型隐式转换为另一种类型。例如,int(4.15) 将浮点数转换为整数 4。但在 4+4.5 中,每个参数的类型不同(一个是 int,一个是 float),两者必须都转换为相同的类型才能相加,否则会引发 TypeError。

如果没有强制转换,即使是兼容类型的参数也必须由程序员规范化为相同的值,例如 float(4)+4.5 而不是简单的 4+4.5。


29) Python 中的 Flask 是什么,Redis Python 是什么?

Flask 是一个用 Python 编写的微型 Web 框架,基于 Werkzeug 工具箱和 Jinja2 模板引擎。

Redis 是一种内存中的键值对 NoSQL 数据存储,常用于 Web 应用程序会话、传输用户数据以及作为任务队列的代理。redis-py 是一个用于连接 Redis 的常用 Python 代码库。


30) 在 Python 中如何显式地释放内存?

在 Python 中,你可以通过 gc.collect() 强制垃圾回收器释放未被引用的内存。

示例源代码


31) Python 中的猴子补丁(Monkey Patching)是什么,range 和 xrange 在 Python 中是什么?

猴子补丁是在运行时重新打开现有的类或类中的方法并改变其行为,这应该谨慎使用,或者只在必要时使用。

xrange 是一个惰性求值的序列对象。range 会创建一个列表,所以如果你执行 range(1, 10000000),它会在内存中创建一个包含 9999999 个元素的列表。xrange 是一个生成器,因此它是一个惰性求值的序列对象。


32) 什么是 pickling 和 unpickling?

Pickling 是将 Python 对象层次结构转换为字节流的过程。Unpickling 是相反的操作,即通过该操作将字节流转换回对象层次结构。或者,pickling(和 unpickling)也被称为序列化(serialization)、编组(marshaling)或扁平化(flattening)。


33) 什么是元类(metaclasses),我们用它们做什么?

元类是类的类。就像一个类定义了该类实例的行为一样,一个元类定义了一个类的行为。一个类是元类的一个实例。

虽然在 Python 中你可以使用任意的可调用对象作为元类(如 Jerub 所示),但更有用的方法是将其创建为一个真正的类。`type` 是 Python 中通常的元类。如果你好奇的话,`type` 本身也是一个类,并且它是它自己的类型。你无法仅用 Python 复制像 `type` 这样的东西,但 Python 在这里有点“作弊”。要在 Python 中创建自己的元类,你只需要子类化 `type`。

元类最常用作类工厂。就像你通过调用类来创建类的实例一样,Python 通过调用元类来创建一个新类(当它执行 `class` 语句时)。结合通常的 `__init__` 和 `__new__` 方法,元类因此允许你在创建类时做一些“额外的事情”,比如将新类注册到某个库,甚至用其他东西替换这个类。

当 `class` 语句被执行时,Python 首先像执行普通代码块一样执行 `class` 语句的主体。产生的命名空间(一个字典)保存了待创建类的属性。接着通过查看待创建类的基类(元类是继承的)、待创建类的 `__metaclass__` 属性(如果有的话),或者 `__metaclass__` 全局变量来确定元类。然后用类的名称、基类和属性来调用这个元类,以实例化它。

但是,元类定义了类的类型,而不仅仅是它的工厂,所以你可以用它们做更多的事情。例如,你可以在元类上定义普通方法。

这些元类方法类似于类方法,因为类可以在没有实例的情况下访问它们,但它们又不同于类方法,因为它们不能在类的实例上被调用。`type.__subclasses__()` 是 `type` 元类上的一个方法示例。你还可以定义通常的“魔术”方法,如 `__add__`、`__iter__` 和 `__getattr__`,来实现或改变类的行为方式。


34) 对象名前的单个和双个下划线会发生什么?

我想最后一次澄清这个问题。谁能解释一下在 Python 中对象名前加前导下划线的确切含义?此外,无论引用的对象是变量、函数、方法等,签名是否保持不变?也请解释一下单个和双个前导下划线的区别。

单个下划线 - 在类中,名称以单个下划线开头仅仅是为了向其他程序员表明该属性或方法意图是私有的。然而,名称本身并没有任何特殊处理。

双下划线(名称修饰) - 任何形式为 `__spam`(至少两个前导下划线,最多一个尾随下划线)的标识符都会被字面上替换为 `_classname__spam`,其中 `classname` 是当前类的名称,并去掉了前导下划线。这种修饰操作与标识符的语法位置无关,因此可以用来定义类私有的实例和类变量、方法、存储在全局变量中的变量,甚至是存储在其他类实例上的实例变量。对于这个类,在其他类的实例上是私有的。


35) 什么是 Python NETWORKX?

NetworkX 是一个 Python 语言编程模块,用于研究复杂网络的组件结构和功能。它专注于由节点和边构成的大型复杂网络图。使用网络,我们可以加载和存储复杂的关联关系。我们可以生成许多随机和经典的网络,分析网络结构,建立网络模型,设计新的网络算法并绘制网络。NetworkX 是在 BSD-new 许可下发布的免费软件。

要点

  • 用于图和有向图的类。
  • 在多种配置之间转换图。
  • 能够构建不规则图或逐步构建它们。
  • 能够找到子图、内部环和 k-核。
  • 研究相似性、度、直径、半径、中心性、介数等。
  • 在 2D 和 4D 中绘制网络。

NetworkX 适用于处理大规模真实图:例如,超过200亿个节点和2000亿条边的图。[需要澄清] 由于它依赖于纯 Python 的“字典的字典”数据结构,NetworkX 是一个相当高效、完全可扩展、高度精简的网络和社交网络分析框架。


36) 什么是 Python Locust 模块?

Python Locust:与 JMeter 和 Tsung 不同,这是一种基于 Python 的服务器负载测试选择。

厌倦了现有的用于基准测试和负载测试服务器的工具后,我最近发现了一个名为 Locust 的开源工具,并在我的一个项目中使用它。

通过阅读本教程,你将能够使用这个负载测试工具。它能让你粗略了解你的服务器每秒能支持多少请求(RPS)。

Locust 是一个易于使用、分布式的用户负载测试工具。对网站(或其他结构)进行负载测试是很常见的,目的是找出系统能处理多少并发用户。


结论

所以,这是我们为计算机程序员准备的一个基础主题教程之一。

你最好告诉我们你对这篇文章的反馈。

此外,你可以要求我们撰写你选择的主题。我们会将其添加到我们的写作指南中。

最后,如果你喜欢这篇文章,请随时与朋友分享并通过社交媒体传播。