yield 与 lambda 的理解与使用

yield 与 lambda

lambda 匿名函数

Python中,lambda 是一个关键字,用于创建匿名函数,也就是那些没有具体名称的函数。这种函数通常用于编写简单的、临时的函数,它们在定义后立即被调用,或者作为参数传递给其他函数。

lambda 的基本使用方法

python 复制代码
lambda arguments: expression
  • arguments:这是传递给 lambda 函数的参数,可以是一个或多个。
  • expression:这是 lambda 函数返回的表达式的结果。

示例

python 复制代码
add = lambda x, y: x + y
print(add(3, 4))  # 输出 7

lambda 的高级用法

1. 作为高阶函数参数

lambda 函数经常作为参数传递给其他函数,这些函数被称为高阶函数。例如,filter()map()reduce() 都是高阶函数。

python 复制代码
# 使用 filter 过滤偶数
numbers = [1, 2, 3, 4, 5, 6]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)  # 输出 [2, 4, 6]

# 使用 map 应用函数
squared_numbers = list(map(lambda x: x ** 2, numbers))
print(squared_numbers)  # 输出 [1, 4, 9, 16, 25, 36]
2. 与排序函数结合

lambda 函数可以用于 sorted()list.sort() 方法中,以自定义排序逻辑。

python 复制代码
# 根据元素的第一个值排序
pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
sorted_pairs = sorted(pairs, key=lambda pair: pair[0])
print(sorted_pairs)  # 输出 [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]

# 根据字符串长度排序
words = ['apple', 'fig', 'banana']
sorted_words = sorted(words, key=lambda word: len(word))
print(sorted_words)  # 输出 ['fig', 'apple', 'banana']
3. 作为默认函数参数
python 复制代码
def repeat_action(action=lambda: print("Default action")):
    action()

# 调用函数时不传递参数,执行默认的 lambda 函数
repeat_action()  # 输出 Default action

# 调用函数时传递新的 lambda 函数
repeat_action(lambda: print("New action"))
# 输出 New action
4. 函数柯里化

lambda 函数可以用于实现函数柯里化(Currying),即把接受多个参数的函数转换成接受一个单一参数(第一个参数)的函数,返回接受余下参数的函数。

python 复制代码
def curried_add(a):
    return lambda b: a + b

add_five = curried_add(5)			# 先固定一个参数,然后形成一个新的函数
print(add_five(3))  # 输出 8
5. 装饰器
python 复制代码
def simple_decorator(f):
    def wrapper():						# 此处只是定义了一个函数,并没有使用
        print("Before function call")
        f()
        print("After function call")
    return wrapper						# 此处使用了一次 wrapper 函数

@simple_decorator
def greet():
    print("Hello, World!")

greet()

'''
输出:

Before function call
Hello, World!
After function call
'''

代码解释:首先调用greet()函数时,会将该函数传入装饰器中作为参数,然后在装饰器中执行代码逻辑。

6. 与 functools.partial 结合
python 复制代码
from functools import partial

def add(a, b):
    return a + b

add_five = partial(add, 5)			# partial 允许固定函数的一个或部分参数,从而创建一个新的函数。
add_five_with_lambda = lambda b: add(5, b)		# 也可以使用lambda来固定部分参数,并以此来创建一个新的函数。

print(add_five(3))  # 输出 8
print(add_five_with_lambda(3))  # 输出 8

yield 生成器

yield 是 Python 中的一个关键字,用于在函数中生成值。当一个函数包含 yield 语句时,它就变成了一个生成器(generator)。生成器是一种迭代器,它允许你逐个产生值,而不是一次性计算并返回所有值。

函数行为的改变 :使用 yield 的函数不再是传统意义上的函数,它们更像是迭代器的工厂。每次函数执行到 yield 语句时,它会生成一个值并暂停执行,保留当前状态,等待下一次迭代。

使用yield的两种形式,第一种:使用 next() 进行访问,第二种:使用 for - in 语句进行访问。

yield 的基本使用方法

定义

python 复制代码
def simple_generator():
    yield 1
    yield 2
    yield 3

使用

python 复制代码
gen = simple_generator()		# 相当于是一个迭代器
for value in gen:
    print(value)  # 输出 1, 然后是 2, 最后是 3

yield 的高级用法

1. 生成器的链式调用

使用 yield from 可以在一个生成器中调用另一个生成器,这使得代码更加简洁,并且可以递归地生成数据。

python 复制代码
def chain_generator(*gens):
    for gen in gens:
        yield from gen

gen1 = (x for x in range(3))
gen2 = (x**2 for x in range(3))
for value in chain_generator(gen1, gen2):
    print(value)  # 输出 0, 1, 2, 0, 1, 4
2. 递归生成器

生成器可以递归调用自身,这在处理树状结构或需要深度遍历的数据结构时非常有用。

yield from:允许一个生成器函数将控制权委托给另一个生成器函数,从而在其迭代过程中迭代另一个生成器的功能。

python 复制代码
def recursive_generator(n):
    if n > 0:
        yield n
        yield from recursive_generator(n-1)

for value in recursive_generator(5):
    print(value)  # 输出 5, 4, 3, 2, 1
3. 发送值到生成器

生成器不仅可以产生值,还可以接收外部发送的值,这使得生成器可以作为协程使用。

python 复制代码
def echo():
    while True:
        received = yield
        print(f"Received: {received}")

gen = echo()
next(gen)  # 启动生成器
gen.send('Hello')  # 发送值到生成器
gen.send('World')
4. 异常处理

生成器可以处理异常,并且可以在异常发生时通过 send 方法发送异常给生成器。

python 复制代码
def gen():
    try:
        yield 1
        yield 2
        raise ValueError('Test')
    except ValueError as e:
        yield str(e)

for value in gen():
    print(value)  # 输出 1, 然后是 ValueError 的消息
5. 生成器的 __next__ 方法

生成器对象有一个 __next__ 方法,可以通过它来获取下一个值。

python 复制代码
def simple_gen():
    yield 'hello'
    yield 'world'

gen = simple_gen()
print(gen.__next__())  # 输出 'hello'
print(next(gen))      # 输出 'world'
6. 与 for 循环的集成

生成器可以与 for 循环无缝集成,使得迭代生成器变得简单。

python 复制代码
def gen():
    yield from range(3)

for i in gen():
    print(i)  # 输出 0, 1, 2
7. 装饰器和元生成器

可以创建装饰器来增强生成器的功能,或者创建元生成器来生成其他生成器。

python 复制代码
def generator_decorator(gen_func):
    def wrapper(*args, **kwargs):
        gen = gen_func(*args, **kwargs)
        yield from gen
    return wrapper

@generator_decorator
def gen_func():
    yield 1
    yield 2

for value in gen_func():
    print(value)  # 输出 1, 2
相关推荐
鹏码纵横6 小时前
已解决:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 异常的正确解决方法,亲测有效!!!
java·python·mysql
仙人掌_lz6 小时前
Qwen-3 微调实战:用 Python 和 Unsloth 打造专属 AI 模型
人工智能·python·ai·lora·llm·微调·qwen3
猎人everest6 小时前
快速搭建运行Django第一个应用—投票
后端·python·django
猎人everest7 小时前
Django的HelloWorld程序
开发语言·python·django
chusheng18407 小时前
2025最新版!Windows Python3 超详细安装图文教程(支持 Python3 全版本)
windows·python·python3下载·python 安装教程·python3 安装教程
别勉.7 小时前
Python Day50
开发语言·python
xiaohanbao098 小时前
day54 python对抗生成网络
网络·python·深度学习·学习
爬虫程序猿8 小时前
利用 Python 爬虫按关键字搜索 1688 商品
开发语言·爬虫·python
英杰.王8 小时前
深入 Java 泛型:基础应用与实战技巧
java·windows·python
安替-AnTi8 小时前
基于Django的购物系统
python·sql·django·毕设·购物系统