Python函数-匿名函数、生成器、内置函数和推导式
2025-8-31
| 2025-8-31
Words 4592Read Time 12 min
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)
  • 与高阶函数搭配mapfiltersortedkey 参数
  • 柯里化

    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、注意事项

    1. 可读性:虽然三元运算符很简洁,但嵌套使用时可能会降低代码的可读性。尽量避免过度嵌套。
    1. 短路行为:三元运算符具有短路行为。如果条件为 True,则不会计算 value_if_false;如果条件为 False,则不会计算 value_if_true
    1. 类型一致性:虽然 Python 允许 value_if_truevalue_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、注意事项

    1. 生成器是一次性对象,遍历后不能重用
    1. 使用 yield 后函数返回生成器对象,不立即执行
    1. 需要手动调用 next() 或使用循环启动生成器
    1. 生成器不存储所有值,不能随机访问

    📝 内置函数

    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()
    1. abs(x):返回数字 x的绝对值。
    1. all(iterable):如果可迭代对象 iterable 中的所有元素都为真(truthy),则返回 True
    1. any(iterable):如果可迭代对象 iterable 中有任何元素为真(truthy),则返回 True
    1. ascii(obj):返回对象 obj 的可打印字符表示形式。
    1. bin(x):将整数 x 转换为二进制字符串。
    1. bool(x):将 x转换为布尔值,非零数值、非空序列等为 True,否则为 False
    1. bytearray(iterable):返回一个可变的字节数组,由 iterable 中的元素构成。
    1. bytes(iterable):返回一个不可变的字节序列,由 iterable 中的元素构成。
    1. callable(obj):如果 obj 是可调用对象(如函数、方法等),则返回 True
    1. chr(i):返回整数 i 对应的 Unicode 字符。
    1. classmethod(func):将函数 func 转换为类方法。
    1. compile(source, filename, mode):将源代码 source 编译成代码对象。
    1. complex(real, imag):创建一个复数,其实部为 real,虚部为 imag
    1. delattr(obj, name):删除对象 obj 的属性 name
    1. dict(**kwargs):创建并返回一个字典。
    1. dir():不带参数时,返回当前局部符号表的列表。带参数时,返回对象的属性列表。
    1. divmod(a, b):返回 a 除以 b 的商和余数。
    1. enumerate(iterable, start=0):返回一个枚举对象,它产生 (index, value) 对。
    1. eval(expression, globals=None, locals=None):计算字符串 expression 中的表达式,并返回结果。
    1. exec(object, globals=None, locals=None):执行动态生成的 Python 代码。
    1. filter(function, iterable):构造一个迭代器,返回使函数 function 返回值为真的那些元素。
    1. float(x):将 x 转换为浮点数。
    1. format(value, format_spec):将 value 格式化为字符串。
    1. frozenset(iterable):返回一个不可变的集合,由 iterable中的元素构成。
    1. getattr(object, name[, default]):返回对象 object的属性 name,如果没有该属性则返回 default
    1. globals():返回当前全局符号表的字典。
    1. hasattr(object, name):如果对象 object 有属性 name,则返回 True
    1. hash(object):返回对象 object 的哈希值。
    1. help(object):显示对象 object 的帮助信息。
    1. hex(x):将整数 x 转换为十六进制字符串。
    1. id(object):返回对象 object 的唯一标识符。
    1. input(prompt=''):显示提示信息 prompt 并返回用户输入的字符串。
    1. int(x[, base]):将 x 转换为整数,可选参数 base 指定进制。
    1. isinstance(object, classinfo):如果 objectclassinfo 的实例或其子类的实例,则返回 True
    1. issubclass(C, B):如果类 C 是类 B 的子类,则返回 True
    1. iter(iterable, sentinel):返回迭代器对象,可选参数 sentinel 指定迭代结束条件。
    1. len(object):返回对象 object 的长度。
    1. list(iterable):返回列表,由 iterable 中的元素构成。
    1. locals():返回当前局部符号表的字典。
    1. map(function, iterable, ...):将函数 function 应用于 iterable 中的每个元素,并返回结果的迭代器。
    1. max(iterable, *args, key=None, default=None):返回 iterable 中的最大值。
    1. memoryview(object):返回对象的内存视图。
    1. min(iterable, *args, key=None, default=None):返回 iterable 中的最小值。
    1. next(iterator[, default]):返回迭代器的下一个元素,如果没有更多元素则返回 default
    1. object():返回一个新的、未命名的对象。
    1. oct(x):将整数 x 转换为八进制字符串。
    1. open(file, mode='r', ...):打开文件并返回文件对象。
    1. ord(c):返回字符 c 的 Unicode 码点。
    1. pow(base, exp[, mod]):返回 baseexp 次幂,可选参数 mod 指定取模。
    1. print(*args, sep=' ', end='\\n', file=sys.stdout, flush=False):打印 args 中的值,用 sep 分隔,以 end 结尾。
    1. property(fget=None, fset=None, fdel=None, doc=None):返回一个属性对象。
    1. range(start, stop[, step]):返回一个整数序列。
    1. repr(object):返回对象的“官方”字符串表示形式。
    1. reversed(seq):返回一个反向迭代器。
    1. round(number[, ndigits]):返回浮点数 number 四舍五入到小数点后 ndigits 位的值。
    1. set(iterable):返回一个集合,由 iterable 中的元素构成。
    1. setattr(object, name, value):设置对象 object 的属性 namevalue
    1. slice(stop):返回一个切片对象。
    1. sorted(iterable, *, key=None, reverse=False):返回 iterable 的排序列表。
    1. staticmethod(function):将函数 function 转换为静态方法。
    1. str(object='):将 object 转换为字符串。
    1. sum(iterable, start=0):返回 iterable 中元素的总和。
    1. super():返回一个代理对象,用于调用父类的方法。
    1. tuple(iterable):返回一个元组,由 iterable 中的元素构成。
    1. type(name, bases, dict):返回一个新的类型对象。
    1. vars(object):返回对象的 __dict__ 属性。
    1. zip(iter1, ..., iterN):将多个迭代器中对应的元素打包成一个个元组,然后返回由这些元组组成的迭代器。
    1. __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、推导式中的循环和条件

    推导式可以包含多个 forif 子句,以支持更复杂的逻辑。

    6、推导式与普通循环的性能对比

    推导式通常比等价的普通循环代码执行得更快,因为 Python 在内部对推导式进行了优化。然而,对于非常简单的迭代,两者的性能差异可能不明显。

    7、注意事项

    推导式应该用于使代码更清晰、更简洁的情况。如果推导式过于复杂,可能会降低代码的可读性,这时应考虑使用普通的循环结构。
    推导式中的变量作用域:在推导式中定义的变量(如循环变量)在推导式外部是不可见的。

    拓展:使用列表推导式创建元组

    列表推导式可以生成列表,然后我们可以使用 tuple() 函数将这个列表转换为元组。这种方式在需要从推导式生成的数据创建元组时非常有用。
  • 开发
  • Python
  • Python函数-函数高级Python函数-闭包拓展
    Loading...
    Catalog
    0%