type
status
date
slug
summary
tags
category
icon
password
📝 匿名函数
1、定义
lambda 参数列表: 单表达式 会即时返回一个函数对象,没有名字,通常作为一次性、短小逻辑的“即用即弃”函数。2、基本语法
位置 | 写法举例 | 说明 |
无参 | lambda: 42 | 直接返回 42 |
单参 | lambda x: x*2 | 输入乘以 2 |
多参 | lambda x, y, z=10: x+y+z | 支持默认参数 |
可变参 | lambda *a, **kw: len(a)+len(kw) | 支持 *args、**kwargs |
注意:
- 只能有一个表达式,不能出现赋值、for、if-else 语句(三元表达式可以)。
- 返回值就是表达式的值,无需
return。
3、作用域规则(与 def 完全一致)
遵循 LEGB;
同样形成闭包:
lambda 闭包的语法就是:
只要表达式里出现外层局部变量,就形成闭包;
在循环里务必用“默认参数”把值钉死,否则所有匿名函数共享同一个变量。
4、与 def 的对比
维度 | lambda | def |
名称 | 匿名 | 必须显式命名 |
主体 | 单表达式 | 多语句块 |
结果 | 隐式 return | 可显式 return |
可读性 | 极短逻辑 | 长逻辑更清晰 |
调试 | 栈跟踪显示 <lambda> | 显示函数名 |
注解 | 无法直接写注解 | 支持完整的函数签名 |
5、常见误区
5.1、“lambda 比 def 快”
执行速度几乎一样;lambda 只是省去了栈帧名字绑定。
5.2、循环变量陷阱
5.3、试图写多行
6、进阶技巧
- 立即调用:
(lambda x: x**2)(5)
- 与高阶函数搭配:
map、filter、sorted的key参数
- 柯里化:
7、典型场景
7.1、sorted 的 key 函数
7.2、GUI 回调 / CLI 框架
7.3、小脚本中的过滤
📝 三元运算符
1、语法结构
condition:一个布尔表达式,其结果为 True 或 False。value_if_true:如果 condition 为 True,则返回这个值。value_if_false:如果 condition 为 False,则返回这个值。2、基本用法
在这个例子中,
x > y 是条件。因为 x 不大于 y,所以条件为 False,返回 y。3、更复杂的表达式
4、与传统 if-else 的对比
4.1、传统 if-else
4.2、三元运算符
三元运算符在表达简单逻辑时更加简洁,但当逻辑复杂时,建议使用传统的
if-else 结构,以提高代码的可读性。5、注意事项
- 可读性:虽然三元运算符很简洁,但嵌套使用时可能会降低代码的可读性。尽量避免过度嵌套。
- 短路行为:三元运算符具有短路行为。如果条件为 True,则不会计算
value_if_false;如果条件为 False,则不会计算value_if_true。
- 类型一致性:虽然 Python 允许
value_if_true和value_if_false是不同类型,但为了代码的可读性和一致性,建议它们是相同类型。
6、实际应用场景
6.1、设置默认值
6.2、简化逻辑
6.3、条件赋值
📝 生成器(Generator)
1、定义
生成器是一种可迭代对象,它逐个生成值,而不是一次性返回所有值。生成器函数通过
yield 关键字返回一个生成器对象。2、生成器的核心特点
- 惰性求值:值在需要时才生成
- 内存高效:不需要存储整个序列在内存中
- 可恢复状态:每次调用从上次暂停处继续执行
- 无限序列:可以表示无限长的数据流
3、创建生成器的两种方式
3.1、生成器函数
使用
def 定义函数,并在函数体内使用 yield 语句3.2、生成器表达式
类似列表推导式,但使用圆括号
()4、生成器的工作流程(图示)
5、生成器函数 vs 普通函数
特性 | 普通函数 | 生成器函数 |
返回值 | 使用 return | 使用 yield |
执行方式 | 一次执行完成 | 可暂停和恢复 |
返回值 | 单次返回值 | 可多次返回值 |
状态 | 每次调用独立 | 保持上次执行状态 |
内存使用 | 可能占用大量内存 | 内存高效 |
6、生成器的内存模型(图示)
7、生成器的生命周期(代码演示)
8、生成器next()、for 循环取值比较
8.1、一段最小生成器
8.2、三种拿值方式对比
方式 | 语法 | 得到 StopIteration 时的行为 | 常见场景 |
next() | next(gen) | 抛出 StopIteration | 手动驱动,一次拿一个 |
for 循环 | for x in gen: | 自动捕获并结束循环 | 遍历整个序列 |
列表/集合推导式 | [x for x in gen] | 自动捕获并结束推导 | 一次性收集 |
8.3、运行流程逐帧图
for 循环 把“异常→结束”这一步隐藏掉了,所以用户无感。
每次
next() 或 for 循环的迭代都会让生成器从上次 yield 处继续往下跑。8.4、代码示例:三种写法效果相同
8.5、一句话总结
next(gen) 是“手摇发动机”,每转一圈拿一个值;for 循环是“自动发动机”,直到油尽(StopIteration)为止;两者背后都是同一条
yield 管道,只是谁负责关掉水龙头。9、注意事项
- 生成器是一次性对象,遍历后不能重用
- 使用
yield后函数返回生成器对象,不立即执行
- 需要手动调用
next()或使用循环启动生成器
- 生成器不存储所有值,不能随机访问
📝 内置函数
ㅤ | ㅤ | built-in functions | ㅤ | ㅤ |
abs() | delattr() | hash() | memoryview() | set() |
all() | dict() | help() | min() | setattr() |
any() | dir() | hex() | next() | slice() |
ascii() | divmod() | id() | object() | sorted() |
bin() | enumerate() | input() | oct() | staticmethod() |
bool() | eval() | int() | open() | str() |
breakpoint() | exec() | isinstance() | ord() | sum() |
bytearray() | filter() | issubclass() | pow() | super() |
bytes() | float() | iter() | print() | tuple() |
callable() | format() | len() | property() | type() |
chr() | frozenset() | list() | range() | vars() |
classmethod() | getattr() | locals() | repr() | zip() |
compile() | globals() | map() | reversed() | __import__() |
complex() | hasattr() | max() | round() | ㅤ |
abs(x):返回数字x的绝对值。
all(iterable):如果可迭代对象iterable中的所有元素都为真(truthy),则返回True。
any(iterable):如果可迭代对象iterable中有任何元素为真(truthy),则返回True。
ascii(obj):返回对象obj的可打印字符表示形式。
bin(x):将整数x转换为二进制字符串。
bool(x):将x转换为布尔值,非零数值、非空序列等为True,否则为False。
bytearray(iterable):返回一个可变的字节数组,由iterable中的元素构成。
bytes(iterable):返回一个不可变的字节序列,由iterable中的元素构成。
callable(obj):如果obj是可调用对象(如函数、方法等),则返回True。
chr(i):返回整数i对应的 Unicode 字符。
classmethod(func):将函数func转换为类方法。
compile(source, filename, mode):将源代码source编译成代码对象。
complex(real, imag):创建一个复数,其实部为real,虚部为imag。
delattr(obj, name):删除对象obj的属性name。
dict(**kwargs):创建并返回一个字典。
dir():不带参数时,返回当前局部符号表的列表。带参数时,返回对象的属性列表。
divmod(a, b):返回a除以b的商和余数。
enumerate(iterable, start=0):返回一个枚举对象,它产生(index, value)对。
eval(expression, globals=None, locals=None):计算字符串expression中的表达式,并返回结果。
exec(object, globals=None, locals=None):执行动态生成的 Python 代码。
filter(function, iterable):构造一个迭代器,返回使函数function返回值为真的那些元素。
float(x):将x转换为浮点数。
format(value, format_spec):将value格式化为字符串。
frozenset(iterable):返回一个不可变的集合,由iterable中的元素构成。
getattr(object, name[, default]):返回对象object的属性name,如果没有该属性则返回default。
globals():返回当前全局符号表的字典。
hasattr(object, name):如果对象object有属性name,则返回True。
hash(object):返回对象object的哈希值。
help(object):显示对象object的帮助信息。
hex(x):将整数x转换为十六进制字符串。
id(object):返回对象object的唯一标识符。
input(prompt=''):显示提示信息prompt并返回用户输入的字符串。
int(x[, base]):将x转换为整数,可选参数base指定进制。
isinstance(object, classinfo):如果object是classinfo的实例或其子类的实例,则返回True。
issubclass(C, B):如果类C是类B的子类,则返回True。
iter(iterable, sentinel):返回迭代器对象,可选参数sentinel指定迭代结束条件。
len(object):返回对象object的长度。
list(iterable):返回列表,由iterable中的元素构成。
locals():返回当前局部符号表的字典。
map(function, iterable, ...):将函数function应用于iterable中的每个元素,并返回结果的迭代器。
max(iterable, *args, key=None, default=None):返回iterable中的最大值。
memoryview(object):返回对象的内存视图。
min(iterable, *args, key=None, default=None):返回iterable中的最小值。
next(iterator[, default]):返回迭代器的下一个元素,如果没有更多元素则返回default。
object():返回一个新的、未命名的对象。
oct(x):将整数x转换为八进制字符串。
open(file, mode='r', ...):打开文件并返回文件对象。
ord(c):返回字符c的 Unicode 码点。
pow(base, exp[, mod]):返回base的exp次幂,可选参数mod指定取模。
print(*args, sep=' ', end='\\n', file=sys.stdout, flush=False):打印args中的值,用sep分隔,以end结尾。
property(fget=None, fset=None, fdel=None, doc=None):返回一个属性对象。
range(start, stop[, step]):返回一个整数序列。
repr(object):返回对象的“官方”字符串表示形式。
reversed(seq):返回一个反向迭代器。
round(number[, ndigits]):返回浮点数number四舍五入到小数点后ndigits位的值。
set(iterable):返回一个集合,由iterable中的元素构成。
setattr(object, name, value):设置对象object的属性name为value。
slice(stop):返回一个切片对象。
sorted(iterable, *, key=None, reverse=False):返回iterable的排序列表。
staticmethod(function):将函数function转换为静态方法。
str(object='):将object转换为字符串。
sum(iterable, start=0):返回iterable中元素的总和。
super():返回一个代理对象,用于调用父类的方法。
tuple(iterable):返回一个元组,由iterable中的元素构成。
type(name, bases, dict):返回一个新的类型对象。
vars(object):返回对象的__dict__属性。
zip(iter1, ..., iterN):将多个迭代器中对应的元素打包成一个个元组,然后返回由这些元组组成的迭代器。
__import__(name, globals=None, locals=None, fromlist=(), level=0):动态导入模块。
📝 推导式
Python 推导式(Comprehensions)是一种构建列表(list)、集合(set)、字典(dict)和生成器表达式(generator expressions)的简洁方式。推导式不仅代码更简洁,而且通常比等价的普通代码执行得更快,因为它们是专为迭代优化的。
1、列表推导式(List Comprehensions)
列表推导式提供了一种从其他列表构建新列表的简便方式。
1.1、基本语法:
1.2、示例:
2、集合推导式(Set Comprehensions)
集合推导式与列表推导式类似,但它生成的是集合。
2.1、基本语法:
2.2、示例:
3、字典推导式(Dict Comprehensions)
字典推导式用于从键值对构建字典。
3.1、基本语法:
3.2、示例:
4、生成器表达式(Generator Expressions)
生成器表达式与列表推导式类似,但它生成的是一个生成器对象,该对象在迭代时才生成值,这使得它们在处理大数据集时更加内存高效。
4.1、基本语法:
4.2、示例:
5、推导式中的循环和条件
推导式可以包含多个
for 或 if 子句,以支持更复杂的逻辑。6、推导式与普通循环的性能对比
推导式通常比等价的普通循环代码执行得更快,因为 Python 在内部对推导式进行了优化。然而,对于非常简单的迭代,两者的性能差异可能不明显。
7、注意事项
推导式应该用于使代码更清晰、更简洁的情况。如果推导式过于复杂,可能会降低代码的可读性,这时应考虑使用普通的循环结构。
推导式中的变量作用域:在推导式中定义的变量(如循环变量)在推导式外部是不可见的。
拓展:使用列表推导式创建元组
列表推导式可以生成列表,然后我们可以使用
tuple() 函数将这个列表转换为元组。这种方式在需要从推导式生成的数据创建元组时非常有用。