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
相关推荐
MC何失眠11 分钟前
vulnhub靶场之momentum-2
网络·python·学习·网络安全
测试秃头怪13 分钟前
自动化测试框架实战(超详细总结)
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
24203021 分钟前
在VSCode中搭建Python开发环境
python
KevinAha32 分钟前
django 实战(python 3.x/django 3/sqlite)
python·django·sqlite
是十一月末1 小时前
Python语法之正则表达式详解以及re模块中的常用函数
开发语言·python·正则表达式
灵封~2 小时前
PythonQt练习
python
pzx_0013 小时前
【时间序列预测】基于Pytorch实现CNN_LSTM算法
人工智能·pytorch·python·算法·cnn·lstm
@半良人3 小时前
Python迭代器-大数据量的处理
python
hakesashou3 小时前
python中什么是驼峰法
python
工业互联网专业4 小时前
Python毕业设计选题:基于大数据的淘宝电子产品数据分析的设计与实现-django+spark+spider
大数据·python·数据分析·spark·django·课程设计·spider