在 Python 中,yield
是一个关键字,用于定义生成器函数(generator function)。它的作用是将一个普通函数转变为可迭代的生成器,具有惰性计算的特性。以下是关键要点:
核心概念
-
生成器函数:
- 当函数中包含
yield
语句时,调用该函数会返回一个生成器对象,而不会立即执行函数体。 - 每次通过
next()
或迭代(如for
循环)从生成器获取值时,函数会执行到yield
处暂停,并返回yield
后的值。 - 下次再请求值时,函数从暂停处继续执行,直到遇到下一个
yield
或函数结束。
- 当函数中包含
-
与
return
的区别:return
会终止函数并返回单个值;yield
会暂停函数,返回一个值,并保留函数状态以便后续继续执行。
示例代码
基础用法
def simple_generator():
yield 1
yield 2
yield 3
gen = simple_generator() # 返回生成器对象,不会执行函数体
print(next(gen)) # 输出: 1
print(next(gen)) # 输出: 2
print(next(gen)) # 输出: 3
# print(next(gen)) # 抛出 StopIteration 异常
实际应用场景
# 生成斐波那契数列(无限序列)
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
fib = fibonacci()
print(next(fib)) # 0
print(next(fib)) # 1
print(next(fib)) # 1
print(next(fib)) # 2
# 可以无限调用 next()
优势与用途
-
内存高效:
- 生成器按需生成值,不会一次性存储所有数据。
(例如处理大文件时,可以逐行读取而不加载整个文件到内存)
- 生成器按需生成值,不会一次性存储所有数据。
-
惰性计算:
- 适合处理无限序列或大规模数据流。
-
协程支持:
- 结合
send()
方法可以实现双向通信(用于协程编程)。
- 结合
在爬虫中的典型应用
您之前代码中的 generate_page_urls()
就是生成器的典型应用:
def generate_page_urls(base_url, max_pages):
for page in range(1, max_pages + 1):
yield f"{base_url}/{page}" # 每次迭代生成一个URL,而不是一次性返回所有URL
# 使用时:
for url in generate_page_urls("https://example.com", 100):
scrape(url) # 逐页处理,节省内存
常见问题
-
生成器只能遍历一次:
gen = simple_generator() list(gen) # [1, 2, 3] list(gen) # [] (因为生成器已耗尽)
-
yield from
:- 用于简化嵌套生成器的委托:
def chain(*iterables): for it in iterables: yield from it # 等价于 for item in it: yield item
总结:yield
是 Python 实现惰性计算的核心机制,能显著提升代码的内存效率和可读性,特别适合处理流式数据或大规模数据集。
英文意思:
“yield” 是一个动词,意思是“产生”、“生产”、“让步”或“允许”。它的具体含义取决于上下文,以下是它的常见解释和用法:
- 作为“产生”或“生产”的意思
• 表示某物或某人生产、产生或制造出某种结果或产品。
• 例句:
• The factory yields high-quality cars.(这家工厂生产高质量的汽车。)
• The tree yields delicious apples.(这棵树结出美味的苹果。)
- 作为“让步”或“让行”的意思
• 表示让步或让出优先权。
• 例句:
• Drivers must yield to pedestrians at crosswalks.(司机在人行横道前必须让行。)
• He yielded to her request.(他答应了她的请求。)
- 作为“允许”或“准许”的意思
• 表示允许或准许某事发生。
• 例句:
• The new policy yields more flexibility for employees.(新政策允许员工有更多的灵活性。)
• The law yields certain rights to citizens.(法律赋予公民某些权利。)
- 在编程中的特殊用法
• 在编程语言(如 Python)中,yield 是一个关键字,用于生成器函数中,表示返回一个值并暂停函数的执行,以便后续继续执行。
• 例句:
• def my_generator():
yield 1
yield 2
- 在金融中的用法
• 在金融领域,yield 可以表示收益率或回报率。
• 例句:
• This bond offers a yield of 5%.(这只债券的收益率为5%。)
常用场景
• 交通场景: 如交通标志“YIELD”表示让行。
• 工业或生产场景: 如工厂的产量。
• 金融场景: 如债券的收益率。
• 编程场景: 用于生成器函数。
希望这些解释对你有帮助!如果有其他问题,随时告诉我!