博客
关于我
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/

你可能感兴趣的文章
Pycharm 对容器中的 Python 程序断点远程调试
查看>>
Pycharm 常用快捷键大全【快查字典版】
查看>>
Pycharm 常用快捷键大全,全网最全!
查看>>
PyCharm 常用的技巧完全指南
查看>>
PyCharm 快捷键与效率编码详解
查看>>
pycharm 怎么添加python依赖的包, requirements.txt文件如何导入python库
查看>>
PyCharm 插件工具使用
查看>>
PyCharm 搜索与导航栏详解
查看>>
PyCharm 搭建 Selenium + Python 的自动化测试环境
查看>>
PyCharm 数据库操作详解
查看>>
PyCharm 版本与管理详解
查看>>
PyCharm 界面排版详解
查看>>
pycharm 配置qt
查看>>
Pycharm+Django搭建第一个Python Web程序
查看>>
pycharm+pyqt5配置
查看>>
PyCharm不突出显示错误
查看>>
pycharm中windows找不到chrome解决办法
查看>>
Pycharm中基于Ollama和Proxy AI使用本地算力进行AI辅助编程
查看>>
Pycharm中配置项目的打开方式(This Window,New Window)
查看>>
PyCharm为什么这么牛?
查看>>