42个实时Python面试问题和答案 [2022]

目录

你是否正在为Python面试做准备?或者只是想了解你对Python的掌握程度?没问题。在这里,我们通过一系列问答来解答你的疑惑。

本文旨在帮助你了解在面试中可能会遇到的问题类型,或者帮助你评估自身的Python技能水平。请务必在查看答案之前先尝试自行解答,以便更准确地评估自己。事不宜迟,让我们立即开始探索这些问题。

这些问题按照主题类别进行了分类,每个部分都包含问题以及精心准备的答案。你可以用自己的语言来复述答案,只要意思表达一致即可。这样,面试官就不会觉得你只是在照本宣科。

Python 语言

#1. 什么是 Python?

Python 是一种高级的、解释型的通用编程语言。我们可以利用Python及其丰富的第三方库和框架来构建几乎任何类型的应用程序。Python在人工智能、数据科学等前沿技术领域是最受欢迎的编程语言之一。

#2. 解释器和编译器之间的主要区别是什么?

解释器逐条将代码语句翻译成机器代码,而编译器则将整个代码块一次性翻译成机器代码。

#3. Python 是静态类型语言还是动态类型语言?

Python 是一种动态类型语言。

#4. 动态类型语言是什么意思?

动态类型语言会在程序运行时检查变量的数据类型。一些常见的动态类型语言包括 Python、JavaScript 和 Ruby等。

额外提示:静态类型语言则是在编译时检查变量的数据类型。一些静态类型语言包括 C++、C 和 Java 等。

#5. 列举一些 Python 的应用场景。

Python 拥有简洁易学的语法,这使得它看起来很像英文。此外,Python 的开发者社区非常庞大,我们可以找到各种各样的第三方库来支持不同类型的应用程序开发。 在应用开发方面,我们可以创建 Web 应用程序、图形用户界面(GUI)应用程序、命令行界面(CLI)应用程序等等。

Python 最流行的应用之一是自动化。我们可以轻松地使用 Python 编写脚本来自动执行各种任务,比如清理磁盘、发送电子邮件,或者获取产品价格信息等。

Python 也是数据科学领域最常用的语言之一。

#6. 你用 Python 构建过哪些应用程序?

我编写过多个自动化脚本来处理重复和繁琐的任务,例如获取产品价格和库存信息的脚本。

我还使用 Django 和 Flask 等框架构建过一些 Web 应用程序。

注意:上述答案仅供参考,你的回答可能与上述完全不同。试着介绍你使用Python所涉足的不同领域,并展示你所开发的应用实例。

数据类型

#7. Python 中有哪些内置数据类型?

Python 拥有多种内置数据类型,包括:整数 (int)、浮点数 (float)、复数 (complex)、布尔值 (bool)、列表 (list)、元组 (tuple)、集合 (set)、字典 (dict) 以及字符串 (str)。

注意:你不必列出Python中所有的内置数据类型,只需提及你最常用的几种即可。面试官可能会根据你的回答进一步提问。

#8. 列表 (list) 和元组 (tuple) 有什么区别?

列表和元组都用于存储对象的集合。它们的主要区别在于:列表是可变对象,而元组是不可变对象。

#9. 什么是可变和不可变数据类型?

可变数据类型在创建后可以被修改。在 Python 中,一些可变对象包括列表 (list)、集合 (set) 和字典 (dict)。

不可变数据类型在创建后无法被修改。Python 中,一些不可变对象包括字符串 (str) 和元组 (tuple)。

#10. 解释一下列表的一些常用方法。

1. append – 这个方法用于向列表末尾添加一个元素。

    >>> a = [1, 2]
    >>> a.append(3)
    >>> a
    [1, 2, 3]

2. pop – 这个方法用于删除列表中的一个元素。 如果不指定索引,它将删除最后一个元素;如果指定索引,则删除该索引处的元素。

    >>> a = [1, 2, 3, 4, 5]
    >>> a.pop()
    5
    >>> a
    [1, 2, 3, 4]
    >>> a.pop(1)
    2
    >>> a
    [1, 3, 4]

3. remove – 这个方法用于从列表中删除指定的元素。我们需要提供要删除的元素作为参数。它会删除列表中第一次出现的该元素。

    >>> a = [1, 2, 2, 3, 4]
    >>> a = [1, 2, 3, 2, 4]
    >>> a.remove(1)
    >>> a
    [2, 3, 2, 4]
    >>> a.remove(2)
    >>> a
    [3, 2, 4]

4. sort – 这个方法用于对列表进行升序或降序排序。

    >>> a = [3, 2, 4, 1]
    >>> a.sort()
    >>> a
    [1, 2, 3, 4]
    >>> a.sort(reverse=True)
    >>> a
    [4, 3, 2, 1]

5. reverse – 这个方法用于反转列表中的元素。

    >>> a = [3, 2, 4, 1]
    >>> a.reverse()
    >>> a
    [1, 4, 2, 3]

注意:还有 clear、insert、count 等其他方法……你不必向面试官解释列表中的所有方法,只需解释你最常用的两三种方法即可。

#11. 解释一下字符串的一些常用方法。

1. split – 这个方法用于在指定的位置拆分字符串。它会返回一个列表作为结果。默认情况下,它会按照空格拆分字符串。我们可以提供分隔符作为方法的参数。

    >>> a = "This is techblik.com"
    >>> a.split()
    ['This', 'is', 'Geekflare']
    >>> a = "1, 2, 3, 4, 5, 6"
    >>> a.split(", ")
    ['1', '2', '3', '4', '5', '6']

2. join – 这个方法用于将一个字符串对象列表组合成一个字符串。它会将字符串对象与我们提供的分隔符组合在一起。

    >>> a = ['This', 'is', 'Geekflare']
    >>> ' '.join(a)
    'This is techblik.com'
    >>> ', '.join(a)
    'This, is, techblik.com'

注意:字符串的其他一些方法还包括:capitalize、isalnum、isalpha、isdigit、lower、upper、center 等。

#12. 列表中的负索引是什么?

索引用于访问列表中的元素。列表的正常索引从 0 开始。

与普通索引类似,负索引也用于访问列表中的元素。但是,负索引允许我们从列表末尾开始访问索引。负索引的起始值是 -1。它会像 -2、-3、-4 等那样递减,直到列表的长度。

    >>> a = [1, 2, 3, 4, 5]
    >>> a[-1]
    5
    >>> a[-3]
    3
    >>> a[-5]
    1

#13. 解释一下字典的一些常用方法。

1. items – 这个方法返回一个包含字典中键值对的元组列表。

    >>> a = {1: 'techblik.com', 2: 'techblik.com Tools', 3: 'techblik.com Online Compiler'}
    >>> a.items()
    dict_items([(1, 'Geekflare'), (2, 'Geekflare Tools'), (3, 'Geekflare Online Compiler')])

2. pop – 这个方法用于从字典中删除一个键值对。它接受键作为参数,并将其从字典中删除。

    >>> a = {1: 2, 2: 3}
    >>> a.pop(2)
    3
    >>> a
    {1: 2}

注意:字典的其他一些方法还包括:get、keys、values、clear 等。

#14. Python 中的切片是什么?

切片用于从序列数据类型中提取子集。它会根据我们提供的参数从序列数据类型返回数据,并返回与源数据类型相同的数据类型。

切片接受三个参数:起始索引、结束索引和步长。切片的语法是`variable[start:end:step]`。 这些参数不是必须的。你可以只指定一个空冒号 (:),它会返回整个数据作为结果。

    >>> a = [1, 2, 3, 4, 5]
    >>> a[:]
    [1, 2, 3, 4, 5]
    >>> a[:3]
    [1, 2, 3]
    >>> a[3:]
    [4, 5]
    >>> a[0:5:2]
    [1, 3, 5]

#15. 哪些数据类型支持切片操作?

我们可以在列表 (list)、元组 (tuple) 和字符串 (str) 数据类型上使用切片操作。

#16. Python 中的解包运算符是什么?如何使用它们?

`*` 和 `**` 运算符是 Python 中的解包运算符。

`*` 解包运算符用于一次性将多个值从序列数据类型分配给不同的变量。

    >>> items = [1, 2, 3]
    >>> a, b, c = items
    >>> a
    1
    >>> b
    2
    >>> c
    3
    >>> a, *b = items
    >>> a
    1
    >>> b
    [2, 3]

`**` 解包运算符主要用于字典数据类型。字典中的解包不像序列数据类型那样直接工作。

字典中的解包主要用于将键值对从一个字典复制到另一个字典。

    >>> a = {1:2, 3:4}
    >>> b = {**a}
    >>> b
    {1: 2, 3: 4}
    >>> c = {3:5, 5:6}
    >>> b = {**a, **c}
    >>> b
    {1: 2, 3: 5, 5: 6}

注意:你可以参考这篇文章以获取关于这些运算符的更多信息。

条件和循环

#17. Python 有 switch 语句吗?

不,Python 没有 switch 语句。

#18. 如何在 Python 中实现 switch 语句的功能?

我们可以使用 if 和 elif 语句来实现 switch 语句的功能。

    >>> if a == 1:
    ...     print(...)
    ... elif a == 2:
    ...     print(....)

#19. 什么是 break 和 continue 语句?

break – break 语句用于终止当前正在执行的循环。 程序执行会跳转到 break 语句所在循环之外。

    >>> for i in range(5):
    ...     if i == 3:
    ...             break
    ...     print(i)
    ...
    0
    1
    2

continue – continue 语句用于跳过当前迭代中剩余代码的执行。程序会直接跳到下一个迭代。

    >>> for i in range(5):
    ...     if i == 3:
    ...             continue
    ...     print(i)
    ...
    0
    1
    2
    4

#20. else 语句中的代码何时会在 while 和 for 循环中执行?

带有 else 语句的 while 和 for 循环,其 else 块中的代码会在所有迭代执行完毕后执行。当我们在循环过程中使用 break 语句跳出循环时,else 块中的代码不会执行。

#21. 什么是列表和字典推导式?

列表和字典推导式是 for 循环的语法糖,可以更简洁地创建列表和字典。

    >>> a = [i for i in range(10)]
    >>> a
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> a = {i: i + 1 for i in range(10)}
    >>> a
    {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10}
    >>>

#22. range 函数如何工作?

range 函数以指定的步长生成一个从起始值到结束值的数字序列。range 函数的语法是 `range(start, stop[, step])`。

`stop` 参数是必须的。而参数 `start` 和 `step` 是可选的。`start` 和 `step` 的默认值分别为 0 和 1。

    >>> list(range(10))
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> list(range(1, 10))
    [1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> list(range(1, 10, 2))
    [1, 3, 5, 7, 9]
    >>>

函数

#23. 参数 (parameter) 和实参 (argument) 是什么?

参数是在函数定义中列出的变量名称。

实参是在调用函数时传递给函数的值。

#24. Python 中有哪些不同类型的参数?

参数主要有四种类型:位置参数、默认参数、关键字参数和可变参数。

位置参数:我们在用户自定义函数中定义的常规参数称为位置参数。调用函数时,必须提供所有位置参数。

    >>> def add(a, b):
    ...     return a + b
    ...
    >>> add(1, 2)
    3
    >>> add(1)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: add() missing 1 required positional argument: 'b'
    >>>

默认参数:我们可以在函数定义中为参数指定默认值。当用户没有传递对应的值时,函数将使用默认值。

    >>> def add(a, b=3):
    ...     return a + b
    ...
    >>> add(1, 2)
    3
    >>> add(1)
    4

关键字参数:在调用函数时,我们可以指定参数的名称,并为其赋值。关键字参数有助于我们避免位置参数的强制排序。

    >>> def add(a, b):
    ...     print("a ", a)
    ...     print("b ", b)
    ...     return a + b
    ...
    >>> add(b=4, a=2)
    a  2
    b  4
    6

可变参数:当我们不知道函数将接收多少个参数时,可以使用可变参数来收集多个值。我们在函数定义中使用 `*` 和 `**` 运算符来收集可变参数。

    >>> def add(*args):
    ...     return sum(args)
    ...
    >>> add(1, 2, 3, 4, 5)
    15
    >>> def dict_args(**kwargs):
    ...     print(kwargs)
    ...
    >>> dict_args(a="techblik.com", b='techblik.com Tools', c="techblik.com Online Compiler")
    {'a': 'techblik.com', 'b': 'techblik.com Tools', 'c': 'techblik.com Online Compiler'}

#25. 什么是 lambda 函数?

Lambda 函数是 Python 中的小型匿名函数。它只包含一个表达式,但可以接收多个参数。

    >>> add = lambda a, b: a + b
    >>> add(1, 3)
    4

#26. 普通函数和 lambda 函数有什么区别?

普通函数和 lambda 函数的功能类似。但是,与功能相同的 lambda 函数相比,我们需要在普通函数中编写一些额外的代码。

当函数只有一个表达式时,Lambda 函数会非常方便。

#27. pass 关键字有什么用?

pass 关键字用于在代码中表示一个空的代码块。Python 不允许代码块为空。因此,pass 语句允许我们定义一个空的代码块,以便在稍后需要时再填充代码。

    >>> def add(*args):
    ...
    ...
      File "<stdin>", line 3

        ^
    IndentationError: expected an indented block
    >>> def add(*args):
    ...     pass
    ...
    >>>

#28. 什么是递归函数?

调用自身的函数称为递归函数。

Python 中的打包运算符是什么?如何使用它们?

打包运算符用于在函数中收集多个参数。 它们也被称为可变参数。

注意:你可以参考这篇文章来了解更多关于Python中打包操作符的信息。

#29. Python 中的 OOP

在 Python 中创建类使用什么关键字?

`class` 关键字用于在 Python 中创建类。 按照行业惯例,我们应该遵循 Pascal 命名法来命名 Python 类。

    >>> class Car:
    ...     pass
    ...

#30. 如何在 Python 中实例化一个类?

在 Python 中创建一个类的实例,就像调用一个函数一样。我们可以像传递函数参数一样,传递对象所需的属性。

    >>> class Car:
    ...     def __init__(self, color):
    ...             self.color = color
    ...
    >>> red_car = Car('red')
    >>> red_car.color
    'red'
    >>> green_car = Car('green')
    >>> green_car.color
    'green'
    >>>

#31. Python 中的 `self` 是什么?

`self` 代表类的对象本身。 它用于访问特定对象的类中的对象属性和方法。

#32. __init__ 方法是什么?

`__init__` 方法类似于其他面向对象编程语言中的构造函数。 当我们创建该类的对象时,它会立即执行。 它用于初始化实例的初始数据。

#33. Python 中的文档字符串 (docstring) 是什么?

文档字符串(或 docstring)用于记录代码块。它们也可以用作多行注释。

这些文档字符串通常在类的方法中使用,用来描述某个方法的作用。我们可以使用 help 方法查看方法的文档字符串。

    >>> class Car:
    ...     def __init__(self, color):
    ...             self.color = color
    ...
    ...     def change_color(self, updated_color):
    ...             """This method changes the color of the car"""
    ...             self.color = updated_color
    ...
    >>> car = Car('red')
    >>> help(car.change_color)
    Help on method change_color in module __main__:

    change_color(updated_color) method of __main__.Car instance
        This method changes the color of the car

    >>>

#34. 什么是 dunder 或 magic 方法?

具有前后双下划线的方法被称为 dunder 或 magic 方法。它们主要用于方法重写。我们可以在类中重写的一些方法包括 `__str__`、`__len__`、`__setitem__`、`__getitem__` 等。

    >>> class Car:
    ...     def __str__(self):
    ...             return "This is a Car class"
    ...
    >>> car = Car()
    >>> print(car)
    This is a Car class
    >>>

注意:你可以重写许多其他方法。 当你需要深入自定义代码时,这些方法会很有用。浏览官方文档可以获取更多信息。

#35. 如何在 Python 中实现继承?

我们可以将父类作为参数传递给子类。并且我们可以在子类中调用父类的 `__init__` 方法。

    >>> class Animal:
    ...     def __init__(self, name):
    ...             self.name = name
    ...
    >>> class Animal:
    ...     def __init__(self, name):
    ...             self.name = name
    ...
    ...     def display(self):
    ...             print(self.name)
    >>> class Dog(Animal):
    ...     def __init__(self, name):
    ...             super().__init__(name)
    ...
    >>> doggy = Dog('Tommy')
    >>> doggy.display()
    Tommy
    >>>

#36. 如何在 Python 中访问子类中的父类?

我们可以使用 `super()` 来引用子类中的父类。 我们可以使用它访问父类的属性和方法。

杂项

#37. 如何在 Python 中使用单行和多行注释?

我们使用井号 ( `#` ) 表示单行注释。使用三个单引号 (`”’comment”’`) 或三个双引号 (`”””comment”””`) 表示多行注释。

#38. Python 中的对象是什么?

在 Python 中,一切皆对象。所有的数据类型、函数和类都是对象。

#39. `is` 和 `==` 有什么区别?

`==` 运算符用于检查两个对象是否具有相同的值。`is` 运算符用于检查两个对象是否引用相同的内存位置。

    >>> a = []
    >>> b = []
    >>> c = a
    >>> a == b
    True
    >>> a is b
    False
    >>> a is c
    True
    >>>

#40. 什么是浅拷贝和深拷贝?

浅拷贝:创建一个与原始对象完全相同的副本,但不改变对象的引用。复制的对象和原始对象都引用相同的内存地址。因此,修改其中一个对象会影响另一个对象。

`copy` 模块中的 `copy` 方法用于执行浅拷贝。

    >>> from copy import copy
    >>> a = [1, [2, 3]]
    >>> b = copy(a)
    >>> a[1].append(4)
    >>> a
    [1, [2, 3, 4]]
    >>> b
    [1, [2, 3, 4]]

深拷贝:它将原始对象的值递归地复制到新对象中。我们必须使用 `copy` 模块中的 `deepcopy` 方法进行深拷贝。

    >>> from copy import deepcopy
    >>> a = [1, [2, 3]]
    >>> b = deepcopy(a)
    >>> a[1].append(4)
    >>> a
    [1, [2, 3, 4]]
    >>> b
    [1, [2, 3]]
    >>> b[1].append(5)
    >>> a
    [1, [2, 3, 4]]
    >>> b
    [1, [2, 3, 5]]

#41. 什么是迭代器?

迭代器是 Python 中记住其迭代状态的对象。 它使用 `__iter__` 方法初始化数据,并使用 `__next__` 方法返回下一个元素。

我们需要调用 `next(iterator)` 从迭代器中获取下一个元素。 我们可以使用 `iter` 内置方法将序列数据类型转换为迭代器。

    >>> a = [1, 2]
    >>> iterator = iter(a)
    >>> next(iterator)
    1
    >>> next(iterator)
    2
    >>> next(iterator)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration
    >>>

#42. 什么是生成器?

生成器是像生成器对象一样返回迭代器的函数。它使用 `yield` 关键字来生成数据。

    >>> def numbers(n):
    ...     for i in range(1, n + 1):
    ...             yield i
    ...
    >>> _10 = numbers(10)
    >>> next(_10)
    1
    >>> next(_10)
    2
    >>> next(_10)
    3
    >>> next(_10)
    4

结论 👨‍💻

正如我们在本文中看到的那样,问题是多种多样的。本文展示了从Python的各个主题中提出不同类型问题的方式。但是,这些问题并不仅限于我们在此讨论的范围。

在学习过程中,一种有效的准备方式就是针对不同的主题进行自我提问。尝试从一个概念出发提出不同类型的问题,并自己尝试解答。通过这种方式,你可能不会对面试中出现的问题感到惊讶。你也可以利用在线Python编译器来练习代码。

祝你接下来的Python面试一切顺利! 👍