博客
关于我
python进阶(8):yield函数
阅读量:800 次
发布时间:2023-03-05

本文共 2417 字,大约阅读时间需要 8 分钟。

yield函数

1. yield函数的特点

1.1懒惰求值

生成器函数在执行时不会一次性计算所有结果,而是每次被调用时生成一个值。这种特性可以有效节省内存资源。

1.2状态保持

生成器函数会记住上一次返回值时的状态,允许生成器函数在多次调用时从上一次停止的地方继续执行。

1.3无限序列

生成器函数可以生成无限序列,这种做法不会占用大量内存。

2. yield函数的使用示例

2.1定义生成器函数

带有yield关键字的函数是Python中的生成器函数。当调用这个函数时,函数内部的代码不会立即执行,而是返回一个生成器对象。

示例代码:

```python def generator(): for i in range(10): yield i gen = generator() print(gen) ```

2.2生成器函数生成值

生成器函数使用yield关键字生成值,而不是使用return。每次调用yield时,函数暂停并返回一个值,等待下一次调用继续执行。

示例代码:

```python def simple_generator(): yield 1 yield 2 yield 3 gen = simple_generator() print(next(gen)) # 输出: 1 print(next(gen)) # 输出: 2 print(next(gen)) # 输出: 3 ```

2.3使用for循环遍历生成器

生成器可以直接被for循环遍历,自动获取生成器函数返回的每个值。

示例代码:

```python def simple_generator(): yield 1 yield 2 yield 3 for value in simple_generator(): print(value) ```

2.4生成器表达式

生成器表达式是基于生成器的简洁方式,可以直接用于for循环。

示例代码:

```python gen_expr = (x * x for x in range(5)) for value in gen_expr: print(value) ```

2.5使用yield实现协程

协程允许生成器在生成值的同时接收外部数据。使用send方法可以向生成器发送数据。

示例代码:

```python def coroutine(): while True: received = yield print(f"接收到的数据: {received}") co = coroutine() next(co) # 预激生成器 co.send(10) # 输出: 接收到的数据: 10 co.send(20) # 输出: 接收到的数据: 20 ```

2.6实现无限序列

生成器特别适合实现无限序列,因为它们只在需要时生成值,不会占用大量内存。

示例代码:

```python def infinite_sequence(): num = 0 while True: yield num num += 1 gen = infinite_sequence() for i in range(10): print(next(gen)) ```

3. 常见场景

3.1读取大文件

生成器可以用于读取大文件,逐行读取文件内容,避免一次性加载整个文件到内存中。

示例代码:

```python def read_large_file(file_path): with open(file_path, 'r') as file: while True: line = file.readline() if not line: break yield line for line in read_large_file('large_file.txt'): print(line, end='') ```

3.2实现管道处理

生成器可以用作数据处理的管道,每个生成器函数负责一个处理步骤。

示例代码:

```python def pipeline_stage1(data): for item in data: yield item * 2 def pipeline_stage2(data): for item in data: yield item + 1 data = range(5) stage1 = pipeline_stage1(data) stage2 = pipeline_stage2(stage1) for value in stage2: print(value) ```

4. 注意事项

4.1使用try-finally块进行清理

在生成器中可以使用try-finally块进行必要的清理操作。

示例代码:

```python def generator_with_cleanup(): print("生成器开始") try: yield "Hello" finally: print("生成器结束") gen = generator_with_cleanup() print(next(gen)) gen.close() # 触发 finally 块 ```

4.2异常处理

生成器中可以使用try-except块处理异常。

示例代码:

```python def generator_with_exception_handling(): try: yield 1 yield 2 raise ValueError("发生错误") yield 3 except ValueError as e: print(f"捕获异常: {e}") gen = generator_with_exception_handling() for value in gen: print(value) ```

转载地址:http://yiafk.baihongyu.com/

你可能感兴趣的文章
pringBoot Controller接收参数的几种常用方式
查看>>
printf()函数
查看>>
PyTorch中的自定义权重初始化
查看>>
printf格式字符串和输出列表个数及类型不匹配案例
查看>>
printf的格式控制字符串
查看>>
PrintStream概述
查看>>
Prismix:Prisma 架构混合器,为复杂项目而生
查看>>
Private Destructor
查看>>
private和protected能同时修饰成员变量吗_天天用注解你了解注解是怎么实现的吗?...
查看>>
privoxy Invalid header received from client.
查看>>
Privoxy代码下载
查看>>
Progress Kemp LoadMaster 远程命令执行漏洞复现(CVE-2024-1212)
查看>>
Project configuration is not up-to-date with pom.xml. Run Maven->Update Project
查看>>
Project Euler 15 Lattice paths
查看>>
Project Euler 48 Self powers( 大数求余 )
查看>>
Project Euler Problem 12: Highly divisible triangular number
查看>>
ProjectEuler 2
查看>>
projection介绍及EPSG:4326和EPSG:3857的投射转换
查看>>
project打开文件时,显示无法识别此文件格式?
查看>>
Prometheus + Grafana on Kubernetes部署
查看>>