源本科技 | 码上会

Python 语法与特性

2026/04/05
1
0

生成器和迭代器的区别

迭代器是 Python 实现迭代的基础对象,必须手动实现 __iter__ 和 __next__ 魔法方法,编写繁琐,定义好后需手动调用 next() 取值。生成器是简化版的特殊迭代器,用 yield 关键字或生成器表达式就能创建,核心是惰性计算,不会一次性生成所有数据,只有遍历取值时才计算,极致节省内存。迭代器需要自定义类实现,生成器是 Python 的语法糖,功能完全包含迭代器。日常处理大数据、无限序列时,生成器比普通迭代器更轻便、更易用,是迭代器的首选写法。

生成器表达式和列表推导式的区别

二者都是简化循环创建序列的语法糖,核心差异在语法、内存和用法。列表推导式用中括号 [],会一次性计算所有元素并存入内存,支持索引、切片,读取快但占内存,不适合海量数据。生成器表达式用小括号 (),采用惰性计算,只保存计算规则,遍历才逐个生成值,内存占用极低。生成器只能迭代一次,无法索引切片,列表可反复使用、随意操作。小数据量追求便捷用列表推导式,大数据量追求省内存用生成器表达式。

列表推导式和字典推导式

列表推导式是创建列表的极简写法,格式为[表达式 for 变量 in 可迭代对象],还能加 if 条件过滤,一行替代 for 循环 +append,简洁高效,比如[x*2 for x in range(10) if x%2==0]。字典推导式用大括号 {},格式为{键表达式:值表达式 for 变量 in 可迭代对象},同样支持条件过滤,能快速将序列转为字典,比如{x:x**2 for x in range(5)}。二者都是语法糖,替代繁琐的循环赋值,唯一区别是生成的数据类型不同,语法符号和键值对格式略有差异。

闭包是什么,有什么作用

闭包是 Python 的嵌套函数:外层函数定义变量和内层函数,内层函数引用外层的非全局变量,最后外层函数返回内层函数对象。闭包能让外层变量常驻内存,不会随函数调用结束销毁,实现数据持久化。它的核心作用是封装私有数据,不用创建类就能隐藏数据、保存状态,比类更轻便。闭包能避免全局变量污染,适合实现计数器、缓存等简单状态保留场景,是 Python 函数式编程的核心用法,代码简洁且实用性极强。

魔法方法有哪些常见用途

魔法方法是双下划线开头结尾的方法,是 Python 定制对象行为的核心。__init__ 用于初始化对象属性,创建实例时自动调用;__str__ 定制 print 打印对象的内容,让输出更易懂;__len__ 让对象支持 len() 函数;__getitem__ 让对象支持索引、切片;__call__ 让对象能像函数一样调用;enter/__exit__ 实现 with 上下文管理。魔法方法让自定义对象适配 Python 内置语法和操作符,简化对象操作,让代码更符合 Python 的设计习惯,是面向对象编程的基础。

命名空间和作用域的区别

命名空间是存储变量名和值的容器,本质是字典,分内置、全局、局部、非局部四类,不同命名空间的变量名互不冲突,专门负责变量的存储。作用域是变量能被访问的有效范围,遵循 LGB 规则:局部 > 嵌套 > 全局 > 内置。简单说,命名空间是“存变量的地方”,作用域是“变量能用的范围”。比如函数内的局部变量存在局部命名空间,只能在局部作用域使用,二者一个管存储、一个管访问权限,共同构成 Python 的变量管理机制。

鸭子类型是什么,它如何影响代码设计

鸭子类型是 Python 核心设计思想:不关注对象类型,只关注对象是否有对应方法,即“走像鸭子、叫像鸭子,就是鸭子”。它不要求继承特定父类或实现接口,只要有需要的方法,就能参与对应操作。比如只要有 __iter__ 方法,就是可迭代对象。这让代码设计彻底解耦,无需繁琐的继承关系,代码更简洁。优势是通用性、扩展性极强,新增对象只要实现对应方法,就能适配现有代码,大幅提升开发效率。

多继承和MRO方法解析顺序

多继承指一个类同时继承多个父类,可直接复用多个父类的方法,但容易引发方法冲突(菱形继承问题)。MRO 是方法解析顺序,Python 用 C3 算法计算出唯一的查找顺序,彻底解决多继承的方法调用冲突。调用子类方法时,会严格按照 MRO 顺序依次查找父类,直到找到目标方法。可通过类名.__mro__查看具体顺序。MRO 保证了多继承下方法调用的确定性,避免混乱,是 Python 多继承的核心规则。

如何在Python中实现函数重载

Python原生不支持传统函数重载,因为重名函数会直接覆盖,且不区分参数类型、个数。想实现重载效果,有三种方式:用默认参数处理不同个数的参数;用可变参数 *args/**kwargs 接收任意参数;最规范的是用functools.singledispatch装饰器,实现单分派泛函数,根据传入参数的类型,自动分发到对应处理函数。这是 Python 官方推荐的方案,代码清晰,完美实现不同类型参数的差异化处理,最接近重载效果。

动态属性和property如何使用

动态属性是 Python 的灵活特性,运行时可直接给对象新增属性,无需提前在类中定义,自由便捷,但无法控制属性的读写和数据校验。property 是装饰器,能将类的方法伪装成普通属性,实现属性的获取、修改、删除,还能添加校验逻辑。用@property装饰获取方法,@属性名.setter装饰修改方法,外部调用时直接像普通属性一样读写,内部可严格管控。动态属性适合临时加属性,property 适合需要校验、管控的属性,二者结合可灵活管理对象属性。