一、基础语法类
1. Python的可变对象和不可变对象有哪些?区别是什么?
答案:
- 不可变(创建后值不可改):int、str、float、tuple、bool、frozenset;
- 可变(创建后值可改):list、dict、set; - 核心区别:不可变对象修改会生成新对象(内存地址变),可变对象修改不改变内存地址。
2. Python中range()和xrange()的区别?
答案*:
- Python2:range()返回列表(一次性生成所有数据),xrange()返回生成器(惰性计算,省内存)
- Python3:移除xrange(),range()等价于Python2的`xrange()`。
3. 解释Python的三元表达式,写一个示例。
答案:
- 语法:值1 if 条件 else 值2(条件为True返回值1,否则返回值2);
- 示例:result = "及格" if score >= 60 else "不及格"`。
4. Python中如何交换两个变量的值?至少两种方法。
答案:
- 方法1(简洁):a, b = b, a;
- 方法2(临时变量):temp = a; a = b; b = temp;
- 方法3(算术运算):a = a + b; b = a - b; a = a - b(仅适用于数值)。
5. break、continue、pass的区别?
答案:
- break:终止整个循环(跳出当前循环体);
- continue:跳过当前循环剩余代码,进入下一次循环;
- pass:空语句,仅占位(无任何操作)。
6. Python中字符串常用的格式化方式有哪些?
答案:
- 方式1:%格式化("姓名:%s,年龄:%d" % (name, age));
- 方式2:str.format("姓名:{},年龄:{}".format(name, age));
- 方式3:f-string(f"姓名:{name},年龄:{age}",效率最高)。
7. 什么是Python的内置函数?列举5个常用内置函数。
答案:
- 定义:Python自带、无需导入即可使用的函数;
- 示例:`len()`(长度)、`range()`(序列生成)、`type()`(类型判断)、`sorted()`(排序)、`enumerate()`(枚举)
8. Python中如何判断一个变量是否为列表?
答案:
- 方法1:isinstance(var, list)(支持继承);
- 方法2:type(var) == list(仅判断精确类型,不支持继承) ##
二、数据结构类
9. 字典(dict)的常用方法有哪些?如何避免取不存在的key时报错?
答案:
- 常用方法:keys()(所有key)、values()(所有值)、items()(所有键值对)、get()(取值)、pop()(删除);
- 避免报错:用dict.get(key, 默认值)
10. 集合(set)的核心作用?如何给列表去重?
答案:
- 核心作用:去重、成员判断(O(1)效率)、集合运算(交集/并集/差集);
- 列表去重:new_list = list(set(old_list))(无序);如需保持顺序:new_list = list(dict.fromkeys(old_list))。
11. 列表的sort()方法和sorted()函数的区别?
答案:
- list.sort():原地排序(修改原列表),无返回值;
- sorted():返回新列表(不修改原列表),可排序任意可迭代对象(如字典、元组);
- 示例:sorted(dict)返回字典key的排序列表。
12. 如何高效合并两个字典?
答案:
- 方法1:dict3 = {**dict1, **dict2};
- 方法2:dict1.update(dict2)(原地合并,修改dict1);
- 方法3:dict3 = dict1 | dict2。
13. 什么是有序字典?Python3.7+的字典有什么变化?
答案:
- 有序字典:collections.OrderedDict,记录key的插入顺序;
- Python3.7+:普通字典默认保留插入顺序,无需再用`OrderedDict`。
14. 如何实现列表的逆序遍历?
**答案**:
- 方法1:`for i in reversed(lst)`(推荐,不修改原列表);
- 方法2:`for i in lst[::-1]`(生成逆序列表,占内存);
- 方法3:`lst.reverse()`(原地逆序,修改原列表)。
15. 元组可以作为字典的key吗?为什么?
**答案**:
- 可以(前提:元组内元素都是不可变对象);
- 原因:字典的key必须是不可变对象(哈希able),元组不可变且可哈希,因此可作为key;若元组包含list等可变对象,则不可作为key。
三、高级特性类
16. 什么是Python的闭包?满足哪些条件?
**答案**:
- 定义:嵌套函数中,内层函数引用外层函数的变量,且外层函数返回内层函数;
- 条件:① 内层函数嵌套在外层函数中;② 内层引用外层非全局变量;③ 外层返回内层函数;
- 应用:装饰器、缓存函数。
17. 装饰器的执行顺序?举例说明。
**答案**:
- 顺序:装饰器按“从下到上”装饰,按“从上到下”执行;
- 示例:
@decorator1
@decorator2
def func():
pass
# 等价于 func = decorator1(decorator2(func))
18. 什么是协程?async/await的作用?
**答案**:
- 协程:轻量级线程(用户态),通过`async/await`实现异步编程,切换开销远低于线程;
- `async`:定义协程函数(返回协程对象);
- `await`:挂起协程执行,等待异步任务完成(如IO操作),期间可执行其他协程;
- 应用:IO密集型任务(爬虫、接口调用)。
19. 如何捕获Python中的异常?简述`try-except-else-finally`的作用。
**答案**:
- 语法:`try`(执行可能报错的代码)→`except`(捕获异常并处理)→`else`(无异常时执行)→`finally`(无论是否异常都执行,用于释放资源);
- 示例:文件操作中`finally`关闭文件句柄。
20. 什么是模块和包?如何导入模块?
**答案**:
- 模块:`.py`文件(包含函数/类/变量);包:包含`__init__.py`的文件夹(多个模块的集合); - 导入方式:`import 模块`、`from 模块 import 函数`、`from 包 import 模块`、`import 模块 as 别名
21. `__init__`和`__new__`的区别?
**答案**:
- `__new__`:创建实例的方法(构造方法),返回实例对象,优先于`__init__`执行;
- `__init__`:初始化实例的方法(初始化方法),接收`__new__`创建的实例,给实例赋值;
- 应用:`__new__`用于单例模式,`__init__`用于初始化属性。
22. 什么是Python的魔法方法?列举3个常用的。
**答案**:
- 定义:以`__`开头和结尾的方法(如`__init__`),自动触发执行;
- 常用: - `__str__`:打印对象时返回字符串(`print(obj)`触发); - `__len__`:获取对象长度(`len(obj)`触发); - `__call__`:让对象可调用(`obj()`触发)。
四、工程实践类
23. 如何读取大文件(如10GB)?避免OOM的方法?
**答案**:
- 方法1:逐行读取(`for line in open("file.txt", "r")`,Python逐行加载,内存占用低); - - 方法2:分块读取(`while True: chunk = f.read(1024*1024); if not chunk: break`);
- 注意:用`with`语句自动释放文件句柄,避免资源泄露。
24. Python中如何操作JSON数据?
**答案**:
- 导入`json`模块: - 序列化(Python→JSON):`json.dumps(data, ensure_ascii=False, indent=4)`; - 反序列化(JSON→Python):`json.loads(json_str)`;
- 文件操作:`json.dump(data, f)`(写入文件)、`json.load(f)`(读取文件)
25. 如何实现Python代码的单元测试?
**答案**:
- 使用内置`unittest`模块或第三方`pytest`库;
- 步骤:① 定义测试类继承`unittest.TestCase`;② 编写以`test_`开头的测试方法;③ 用`assert`断言结果;
- 示例:`self.assertEqual(func(1), 2)`。
26. 如何在Python中实现多进程?为什么多进程能规避GIL?
**答案**:
- 方法:使用`multiprocessing.Process`创建进程,或`multiprocessing.Pool`进程池;
- 原因:GIL是进程级锁,每个进程有独立的Python解释器和GIL,多进程可真正并行执行CPU密集型任务。
27. 如何处理Python中的编码问题?
**答案**:
- 核心:统一编码为UTF-8; - 文件编码:在`.py`文件开头加`# -*- coding: utf-8 -*-`;
- 字符串处理:`str.encode("utf-8")`(字符串→字节)、`bytes.decode("utf-8")`(字节→字符串);
- 避免乱码:读取文件时指定编码(`open("file.txt", "r", encoding="utf-8")`)。
五、性能优化类
28. 如何优化Python循环的效率?
**答案**:
- 方法1:用列表推导式/生成器表达式替代普通for循环(底层C实现,快10~20倍);
- 方法2:用`map/filter`替代循环(内置函数,效率更高);
- 方法3:关键循环用`Numba`/`Cython`加速(编译为机器码)
29. 什么是缓存?如何用Python实现函数缓存?
**答案**:
- 缓存:存储函数重复计算的结果,避免重复执行;
- 实现:用`functools.lru_cache`装饰器(限定缓存大小,自动缓存函数返回值);
- 示例:
from functools import lru_cache
@lru_cache(maxsize=128)
def calc(x):
return x*2
30. 列举3种Python性能分析工具及使用场景。
**答案**:
- `cProfile`:内置性能分析工具,分析函数执行时间、调用次数(定位慢函数);
- `line_profiler`:行级性能分析,定位函数内慢代码行;
- `memory_profiler`:内存分析工具,定位内存泄漏/高内存占用代码。