深入了解python生成器(generator)

生成器

生成器是 Python 中一种特殊类型的迭代器。生成器允许你定义一个函数来动态产生值,而不是一次性生成所有值并将它们存储在内存中。生成器使用 yield 关键字来逐个返回值。每次调用生成器函数时,函数会在 yield 语句暂停,并记住当前的执行状态,以便下次从该点继续执行。

生成器的特点

  1. 惰性求值:生成器会在需要时生成值,而不是一次性生成所有值,节省内存。
  2. 保持状态:生成器记住上次返回值的位置,并从该点继续执行。
  3. 简洁易读:使用生成器表达式可以在单行代码中生成复杂的数据流。

如何定义生成器

生成器通过定义一个包含 yield 语句的函数来创建。当该函数被调用时,返回一个生成器对象。

def my_generator():yield 1yield 2yield 3gen = my_generator()
print(next(gen))  # 输出:1
print(next(gen))  # 输出:2
print(next(gen))  # 输出:3

使用 yield 语句

yield 语句用于生成一个值,并暂停函数的执行。函数状态会被保留,以便下次调用生成器函数时从暂停点继续。

def countdown(n):while n > 0:yield nn -= 1for num in countdown(5):print(num)

生成器表达式

生成器表达式是一种简洁的方式来创建生成器,类似于列表推导式,但使用圆括号而不是方括号。

gen_expr = (x * x for x in range(5))
for num in gen_expr:print(num)

内置生成器函数

Python 提供了一些内置函数,返回生成器对象,例如 range(), map(), filter()zip()

# range() 返回一个生成器
for i in range(5):print(i)# map() 返回一个生成器
squared = map(lambda x: x * x, range(5))
for num in squared:print(num)# filter() 返回一个生成器
evens = filter(lambda x: x % 2 == 0, range(10))
for num in evens:print(num)

生成器与内存效率

生成器在处理大量数据时特别有用,因为它们不需要一次性加载所有数据,而是按需生成数据,从而大大节省了内存

# 使用列表处理大数据
large_list = [x * x for x in range(10**6)]
# 使用生成器处理大数据
large_gen = (x * x for x in range(10**6))

yieldreturn 的区别

  • yield 生成一个值并暂停函数的执行,保留函数的状态。
  • return 结束函数的执行并返回一个值。
def simple_generator():yield "Hello"yield "World"def simple_function():return "Hello"return "World"gen = simple_generator()
print(next(gen))  # 输出:Hello
print(next(gen))  # 输出:Worldfunc = simple_function()
print(func)  # 输出:Hello

生成器的方法

生成器对象有以下方法:

  • __next__(): 返回生成器的下一个值,或在没有更多值时引发 StopIteration
  • send(value): 向生成器发送一个值,并返回下一个 yield 表达式的值。
  • throw(type, value=None, traceback=None): 在生成器中引发异常。
  • close(): 关闭生成器,终止其执行。
def generator():try:while True:value = (yield)print(f'Received: {value}')except GeneratorExit:print('Generator closed')gen = generator()
next(gen)
gen.send(10)
gen.send(20)
gen.close()

总结

生成器是 Python 中强大的工具,用于高效地处理大量数据或流数据。它们通过 yield 关键字生成值,保持函数状态,支持惰性求值,并且内存效率高。了解生成器的工作原理和用法,对于编写高效、可维护的 Python 代码至关重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/30658.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

静态网页发送基本请求

目录 一、 发送 GET 请求 1.不携带 url 参数的 GET 请求 2.携带 url 参数的 GET 请求 二、发送 POST 请求 三、处理响应 1.获取网页源代码 2.获取图片 一、 发送 GET 请求 当用户在浏览器的地址栏中直接输入某个 URL 地址…

海量数据处理利器 Roaring BitMap 原理介绍

作者:来自 vivo 互联网服务器团队- Zheng Rui 本文结合个人理解梳理了BitMap及Roaring BitMap的原理及使用,分别主要介绍了Roaring BitMap的存储方式及三种container类型及Java中Roaring BitMap相关API使用。 一、引言 在进行大数据开发时,…

网络安全,怎么搭建Python防范环境

注意:本文的下载教程,与以下文章的思路有相同点,也有不同点,最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程: Python网络安全项目开发实战_搭建Python防范环境_编程案例解析实例详解课程教程.pdf 构建一个Python环境下的网络安全防范体系是一个涉及多个层面和步…

公域+私域运营思路框架

本次分享公域私域运营思路框架,内容包括私域原则、公域引流、让利思维、价值体系等内容,让你的流量保持高留存、高活跃。

常用的特征分析和特征工程

案例背景 我们将使用一个公开数据集,数据集中包含客户的画像、行为以及标签。我们的目标是通过特征工程提升模型的预测准确性。 数据加载与初步探索 首先,我们需要加载数据并进行初步探索,以了解数据的基本情况。 import pandas as pd import numpy as np# 加载数据集 d…

idea 创建properties文件,解决乱码

设置properties文件编码 点击file->Settings File Encodings->设置utf-8 重新创建.properties文件才生效

【Java学习笔记】异常处理

生活中我们在使用一些产品的时候,经常会碰到一些异常情况。例如,使用ATM机取钱的时,机器会突然出现故障导致无法完成正常的取钱业务,甚至吞卡;在乘坐地铁时,地铁出现异常无法按时启动和运行;使用…

本科且非专业学历|艺术自由职业者成功赴美国威斯康星大学麦迪逊分校自费访学

R老师只有本科学历且不是艺术专业,但有独创的艺术作品,其希望在一年的访问学者期间,拓宽艺术视野,同时学习艺术理论,以弥补学术背景薄弱的短板。最终我们为其落实了美国威斯康星大学麦迪逊分校访问学者职位。 R老师背景…

IAR stack usage

c - IAR Stack Usage for STM32 in the map File - Stack Overflow

7、PHP 实现矩形覆盖

题目&#xff1a; 矩形覆盖 描述&#xff1a; 我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。 请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形&#xff0c;总共有多少种方法&#xff1f; <?php function rectCover($number) {$prePreNum 1;$preNum 2;$temp 0;i…

vscode格式化c代码

参考链接&#xff1a; Clang-Format 用法详解 https://blog.csdn.net/wan212000/article/details/131709197 # 左花括号后面不换行 BreakBeforeBraces: Attach # 缩进 IndentWidth: 4 # 行宽&#xff0c;不自动换行 ColumnLimit: 0在设置界面&#xff0c;Extensions > C/C …

Maven安装与配置、入门教程

Maven是一款基于Java平台的项目管理和整合工具&#xff0c;它主要通过项目对象模型&#xff08;POM&#xff09;来管理项目的构建、报告和文档。以下是一个清晰的Maven教程概述&#xff0c;参考了多篇文章的内容&#xff1a; 一、Maven简介 诞生背景&#xff1a;Maven的创始人…

SAP FICO 下载文件报错【调用数据提供商错误】

报错如下图所示&#xff1a; 解决办法&#xff1a; 当弹出保存文件的提示时&#xff0c;不要点击“记住我的决定”

BufferedReader和BufferedWriter

概念 BufferedReader&#xff1a;是一个从字符输入流中读取文本的类。它提供了一个缓冲区&#xff0c;可以一次性读取大量数据&#xff0c;从而减少实际读取操作的次数&#xff0c;提高读取效率。 BufferedWriter&#xff1a;是一个将文本写入字符输出流的类。它提供了一个缓…

【MATLAB】语法

MATLAB 基本语法(%{和%}) 赋值 函数名值&#xff1b;for for i1:10循环语句 end//while x0; sum0; while x<100sumsumx;x; end//if if x > 1f x^2 1; elsef 2 * x endswitch onum input(请输入一个数); switch num case -1 //注意case后面没有冒号disp(I am…

【Linux】Linux简介

Linux是一种自由和开放源码的类Unix操作系统&#xff0c;其核心由林纳斯本纳第克特托瓦兹&#xff08;Linus Benedict Torvalds&#xff09;于1991年10月5日首次发布。 起源与发展&#xff1a; Linux最初是作为Unix操作系统的一种克隆系统而诞生的&#xff0c;旨在提供一个免费…

[杂项:书籍]《生命的品质》

第八辑&#xff1a; 书 * 对于忙&#xff0c;我始终有一种警惕。我确立了两个界限&#xff0c;第一要么忙得愉快&#xff0c;只为自己真正喜欢的事忙&#xff0c;第二要忙得有分寸&#xff0c;做多么喜欢的事也不让自己忙昏了头。 我 * 对于第一点&#xff0c;我做不到&#…

PostgreSQL17优化器改进(5)GROUP BY优化

PostgreSQL17优化器改进(5)GROUP BY优化 我们知道GROUP BY聚集有两种常见实现方式&#xff0c;一种是基于哈希表&#xff0c;我们称为哈希聚集&#xff08;Hash agg&#xff09;&#xff1b;另一种则要求先对元组进行排序&#xff0c;我们称为分组聚集&#xff08;Group Agg&a…

昇思25天学习打卡营第1天|基本介绍及快速入门

1.第一天学习总体复盘 1&#xff09;成功注册昇思大模型平台&#xff0c;并成功申请算力&#xff1b; 2)在jupyter环境下学习初学入门/初学教程的内容&#xff1b; 在基本介绍部分&#xff0c;快速撸了一边内容&#xff0c;有了一个基本的了解&#xff08;没理解到位的计划采用…

win11使用qemu安装arm64 openEuler虚拟机 并虚拟机中在安装docker

1、安装openEuler教程&#xff1a;Windows11 上使用 QEMU 创建 aarch64&#xff08;ARM64&#xff09;虚拟机_tap-windows-9.24.7-i601-win10.exe-CSDN博客 2、虚拟机安装docker&#xff1a;Windows11 上使用 QEMU 创建 aarch64&#xff08;ARM64&#xff09;虚拟机_tap-windo…