Q 1:Python 有哪些特点和优点?
作为一门编程入门语言,Python 主要有以下特点和优点:
- 可解释:代码无需编译即可运行。
Python 面试常见问题涵盖基础特性、数据结构、内存管理、面向对象编程及运算符等。内容包含深拷贝与浅拷贝区别、列表元组差异、多线程机制、继承类型、Flask 框架简介、内置函数用法、猴子补丁、字典操作、参数传递方式、文件处理、字符串方法及各类运算符详解。适合新手复习基础概念及有经验者查漏补缺。

作为一门编程入门语言,Python 主要有以下特点和优点:
实际上 Python 的优点远不止如此,建议阅读官方文档详细了解。
答:深拷贝就是将一个对象拷贝到另一个对象中,这意味着如果你对一个对象的拷贝做出改变时,不会影响原对象。在 Python 中,我们使用函数 deepcopy() 执行深拷贝,导入模块 copy,如下所示:
>>> import copy
>>> b = copy.deepcopy(a)
而浅拷贝则是将一个对象的引用拷贝到另一个对象上,所以如果我们在拷贝中改动,会影响到原对象。我们使用函数 copy.copy() 执行浅拷贝,使用如下所示:
>>> b = copy.copy(a)
答:二者的主要区别是列表是可变的,而元组是不可变的。举个例子,如下所示:
>>> 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。
关于列表和元组的更多内容,建议查阅相关数据结构文档。
不像 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")
运行结果:
Hi
一个线程就是一个轻量级进程,多线程能让我们一次执行多个线程。我们都知道,Python 是多线程语言,其内置有多线程工具包。
Python 中的 GIL(全局解释器锁)确保一次执行单个线程。一个线程保存 GIL 并在将其传递给下个线程之前执行一些操作,这会让我们产生并行运行的错觉。但实际上,只是线程在 CPU 上轮流运行。当然,所有的传递会增加程序执行的内存压力。对于 I/O 密集型任务,多线程有效;但对于 CPU 密集型任务,建议使用多进程。
当一个类继承自另一个类,它就被称为一个子类/派生类,继承自父类/基类/超类。它会继承/获取所有类成员(属性和方法)。
继承能让我们重新使用代码,也能更容易的创建和维护应用。Python 支持如下种类的继承:
更多关于继承的内容,参见官方文档关于类的章节。
Flask 是 Python 编写的一款轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug,模板引擎则使用 Jinja2。Flask 使用 BSD 授权。其中两个环境依赖是 Werkzeug 和 jinja2,这意味着它不需要依赖外部库。正因如此,我们将其称为轻量级框架。
Flask 会话使用签名 cookie 让用户查看和修改会话内容。它会记录从一个请求到另一个请求的信息。不过,要想修改会话,用户必须有密钥 Flask.secret_key。
Python 有一个私有堆空间来保存所有的对象和数据结构。作为开发者,我们无法访问它,是解释器在管理它。但是有了核心 API 后,我们可以访问一些工具。Python 内存管理器控制内存分配。
另外,内置垃圾回收器会回收使用所有的未使用内存,所以使其适用于堆空间。Python 使用引用计数作为主要的内存管理机制,当对象的引用计数降为 0 时,内存会被释放。循环引用问题则由垃圾回收器处理。
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() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。
以下实例展示了 dir 的使用方法:
>>> dir(copy.copy)
运行结果为:
['__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__']
答案是 No。循环引用其它对象或引用自全局命名空间的对象的模块,在 Python 退出时并非完全释放。
另外,也不会释放 C 库保留的内存部分。这在某些嵌入式或长期运行的脚本中需要注意。
在运行期间动态修改一个类或模块。这通常用于测试或扩展功能。
>>> class A:
... def func(self):
... print("Hi")
...
>>> def monkey(self):
... print("Hi, monkey")
...
>>> A.func = monkey
>>> a = A()
>>> a.func()
运行结果为:
Hi, monkey
字典是 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}
当我们不知道向函数传递多少参数时,比如我们向传递一个列表或元组,我们就使用 *args。
>>> def func(*args):
... for i in args:
... print(i)
>>> func(3, 2, 1, 4, 7)
运行结果为:
3
2
1
4
7
在我们不知道该传递多少关键字参数时,使用 **kwargs 来收集关键字参数。
>>> def func(**kwargs):
... for i in kwargs:
... print(i, kwargs[i])
>>> func(a=1, b=2, c=7)
运行结果为:
a 1
b 2
c 7
>>> import os
>>> # 注意:实际使用时请替换为有效路径
>>> # os.chdir('C:\\Users\\lifei\\Desktop')
>>> with open('Today.txt', encoding='utf-8') as today:
... count = 0
... for char in today.read():
... if char.isupper():
... count += 1
>>> print(count)
运行结果取决于文件内容,示例输出为:
26
我们先创建这样一个列表:
>>> mylist = [0, 1, 2, 3, 4, 5, 6, 7, 8]
负索引和正索引不同,它是从右边开始检索。
>>> mylist[-3]
运行结果:
6
它也能用于列表中的切片:
>>> mylist[-6:-1]
结果:
[3, 4, 5, 6, 7]
为了达到这个目的,我们从 random 模块中导入 shuffle() 函数。
>>> from random import shuffle
>>> shuffle(mylist)
>>> mylist
运行结果可能为:
[3, 4, 8, 0, 5, 7, 6, 2, 1]
Join() 能让我们将指定字符添加至字符串中。
>>> ','.join('12345')
运行结果:
'1,2,3,4,5'
Split() 能让我们用指定字符分割字符串。
>>> '1,2,3,4,5'.split(',')
运行结果:
['1', '2', '3', '4', '5']
如果能区分像 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 是区分大小写的。
在 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
字符串中的前导空格就是出现在字符串中第一个非空格字符前的空格。我们使用方法 lstrip() 可以将它从字符串中移除。
>>> ' Ayushi '.lstrip()
结果:
'Ayushi '
可以看到,该字符串既有前导字符,也有后缀字符,调用 lstrip() 去除了前导空格。如果我们想去除后缀空格,就用 rstrip() 方法。
>>> ' Ayushi '.rstrip()
结果:
' Ayushi'
我们使用 lower() 方法。
>>> 'AyuShi'.lower()
结果:
'ayushi'
使用 upper() 方法可以将其转换为大写。
>>> 'AyuShi'.upper()
结果:
'AYUSHI'
另外,使用 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
在用 Python 写代码时,有时可能还没想好函数怎么写,只写了函数声明,但为了保证语法正确,必须输入一些东西,在这种情况下,我们会使用 pass 语句。
>>> def func(*args):
... pass
同样,break 语句能让我们跳出循环。
>>> for i in range(7):
... if i == 3: break
>>> print(i)
结果:
2
最后,continue 语句能让我们跳到下个循环。
>>> for i in range(7):
... if i == 3: continue
... print(i)
结果:
0
1
2
4
5
6
当一个嵌套函数在其外部区域引用了一个值时,该嵌套函数就是一个闭包。其意义就是会记录这个值。
>>> def A(x):
... def B():
... print(x)
... return B
>>> A(7)()
结果:
7
更多关于闭包的知识,建议参考 Python 作用域规则文档。
// 运算符执行地板除法(向下取整除),它会返回整除结果的整数部分。
>>> 7 // 2
3
这里整除后会返回 3.5 的整数部分 3。
同样地,** 执行取幂运算。a**b 会返回 a 的 b 次方。
>>> 2 ** 10
1024
最后,% 执行取模运算,返回除法的余数。
>>> 13 % 7
6
>>> 3.5 % 1.5
0.5
在 Python 中,我们有 7 种运算符:算术运算符、关系运算符、赋值运算符、逻辑运算符、位运算符、成员运算符、身份运算符。
我们有 7 个算术运算符,能让我们对数值进行算术运算:
>>> 7 + 8
15
>>> 7 - 8
-1
>>> 7 * 8
56
>>> 7 / 8
0.875
>>> 1 / 1
1.0
关系运算符用于比较两个值。
>>> 'hi' < 'Hi'
False
>>> 1.1 + 2.2 > 3.3
True
>>> 3.0 <= 3
True
>>> True >= False
True
>>> {1, 3, 2, 2} == {1, 2, 3}
True
>>> True != 0.1
True
>>> False != 0.1
True
这在 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
Python 中有 3 个逻辑运算符:and,or,not。
>>> False and True
False
>>> 7 < 7 or True
True
>>> not 2 == 2
False
通过成员运算符'in'和'not in',我们可以确认一个值是否是另一个值的成员。
>>> 'me' in 'disappointment'
True
>>> 'us' not in 'disappointment'
True
这也是一个在 Python 面试中常问的问题。
通过身份运算符'is'和'is not',我们可以确认两个值是否相同(即内存地址是否一致)。
>>> 10 is '10'
False
>>> True is not False
True
该运算符按二进制位对值进行操作。
>>> 0b110 & 0b010
2
>>> 3 | 2
3
>>> 3 ^ 2
1
>>> ~2
-3
>>> 1 << 2
4
>>> 4 >> 2
1
我们在 Python 中,除十进制外还可以使用二进制、八进制和十六进制。
>>> int(0b1010)
10
>>> bin(0xf)
'0b1111'
>>> oct(8)
'0o10'
>>> hex(16)
'0x10'
>>> hex(15)
'0xf'
使用 keys() 获取字典中的所有键。
>>> mydict = {'a': 1, 'b': 2, 'c': 3, 'e': 5}
>>> mydict.keys()
dict_keys(['a', 'b', 'c', 'e'])
因为 Python 并没有私有变量的概念,所以约定速成以下划线为开头来声明一个变量为私有。所以如果你不想让变量私有,就不要使用下划线开头。
一共有两种方式:
>>> a, b, c = 3, 4, 5 # This assigns 3, 4, and 5 to a, b, and c respectively
>>> a = b = c = 3 # This assigns 3 to a, b, and c
首先我们来看解封装:
>>> mytuple = 3, 4, 5
>>> mytuple
(3, 4, 5)
这将 3,4,5 封装到元组 mytuple 中。
现在我们将这些值解封装到变量 x,y,z 中:
>>> x, y, z = mytuple
>>> x + y + z
得到结果 12。
本文涵盖了 Python 基础面试的核心考点,包括数据类型、内存机制、面向对象及常用内置函数。建议在准备面试时,不仅要记忆答案,更要理解背后的原理,例如 GIL 对多线程的影响、深浅拷贝的内存模型差异等。同时,动手实践代码片段有助于加深记忆。对于进阶开发者,还需关注装饰器、生成器、异步编程等高级主题。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online