博客
关于我
python进阶(8):yield函数
阅读量:802 次
发布时间: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/

你可能感兴趣的文章
python if,循环的练习
查看>>
Python in open course (week3)
查看>>
Python IO编程
查看>>
Python IO编程详解
查看>>
Python IPL
查看>>
python join split
查看>>
python json文件传输图片
查看>>
python kivy AttributeError:‘super‘对象没有属性‘__getattr__‘
查看>>
Python Kivy ListView:如何删除选定的 ListItemButton?
查看>>
Python kivy 入口点 inflateRest2 无法定位 libpng16-16.dll
查看>>
Python Kivy库:跨平台应用开发
查看>>
python lambda表达式
查看>>
Python ldap3 代码从 SID 获取用户名
查看>>
Python list += iterable 的行为是否记录在任何地方?
查看>>
python list,str的拼接与转换
查看>>
python list函数使用总结_史上最全的Python数据结构:列表和元组用法总结
查看>>
python locust 性能测试:locust参数-保证并发测试数据唯一性,循环取数据
查看>>
python locust 性能测试:locust安装和一些参数介绍
查看>>
python log
查看>>
python logging basicconfig_python之logging.basicConfig
查看>>