首页 > 编程语言 >详解Python生成器函数和生成器对象的原理和用法

详解Python生成器函数和生成器对象的原理和用法

时间:2023-06-09 20:04:07浏览次数:44  
标签:__ 语句 函数 Python 生成器 yield next 详解


包含yield语句的函数可以用来创建生成器对象,这样的函数也称生成器函数。yield语句与return语句的作用相似,都是用来从函数中返回值。与return语句不同的是,return语句一旦执行会立刻结束函数的运行,而每次执行到yield语句并返回一个值之后会暂停后面代码的执行,下次通过生成器对象的__next__()方法、内置函数next()、for循环遍历生成器对象元素或其他方式显式“索要”数据时继续执行。生成器具有惰性求值的特点,适合大数据处理。下面的代码演示了如何使用生成器来生成斐波那契数列:

>>> def f():
 a, b = 1, 1    #序列解包,同时为多个元素赋值
 while True:
 yield a  #返回一个值,暂停执行,需要时再产生一个新元素
 a, b = b, a+b #序列解包,继续生成新元素
>>> a = f()   #创建生成器对象
>>> for i in range(10):   #斐波那契数列中前10个元素
 print(a.__next__(), end=' ')
1 1 2 3 5 8 13 21 34 55 
>>> for i in f():  #斐波那契数列中第一个大于100的元素
 if i > 100:
 print(i, end=' ')
 break
144
>>> a = f()
>>> next(a)  #使用内置函数next()获取生成器对象中的元素
1
>>> next(a)  #每次索取新元素时,由yield语句生成
1
>>> a.__next__()  #也可以调用生成器对象的__next__()方法
2
>>> a.__next__()
3

Python标准库itertools提供了一个count(start, step)函数,用来连续不断地生成无穷个数,这些数中的第一个数是start,相邻两个数的差是step。下面的代码使用生成器模拟了标准库itertools中的count()函数。

>>> def count(start, step):
 num = start
 while True:
 yield num
 num += step
>>> x = count(3, 5)
>>> for i in range(10):
 print(next(x), end=' ')
3 8 13 18 23 28 33 38 43 48 
>>> for i in range(10):
 print(next(x), end=' ')
53 58 63 68 73 78 83 88 93 98

标签:__,语句,函数,Python,生成器,yield,next,详解
From: https://blog.51cto.com/u_9653244/6450969

相关文章

  • Python 3.6+Django开发入门小案例(自动变化的问候)完整步骤
    第一步:在命令提示符环境使用pipinstalldjango命令安装django第二步:在命令提示符环境使用pythondjango-admin.pystartprojectdjango_greeting命令创建网站django_greeting第三步:利用资源管理器在网站目录django_greeting中创建子文件夹templates,并在该子文件夹中创建文件gree......
  • Python批量提取PDF文件中的文本
    首先需要执行命令pipinstallpdfminer3k来安装处理PDF文件的扩展库。importosimportsysimporttimepdfs=(pdfsforpdfsinos.listdir('.')ifpdfs.endswith('.pdf'))forpdf1inpdfs:pdf=pdf1.replace('','_').replace('-......
  • 基于Python+tkinter+pygame的音乐播放器完整源码
    importosimporttkinterimporttkinter.filedialogimportrandomimporttimeimportthreadingimportpygamefolder=''defplay():#folder用来表示存放MP3音乐文件的文件夹globalfoldermusics=[folder+'\\'+musicfo......
  • 最优的素数判断代码(Python)是这样写出来的
    素数判断是个很经典的问题,各种语言的程序设计课程都会涉及到,按照素数定义(除了1和自身,素数没有其他因数)很容易写出下面的代码:defisPrime1(n):foriinrange(2,n):ifn%i==0:returnFalsereturnTrue功能完全没有问题,就是非常非常非常非常慢。......
  • Python代码覆盖性测试入门
    覆盖测试通过代码分析工具和跟踪钩子来判断哪些代码可执行以及哪些代码被执行了,是对单元测试的有效补充,可以用来判断测试的有效性。Python扩展库coverage可以实现对Python代码的覆盖测试,使用pip工具安装之后,可以使用命令“coveragerunfile.py”对Python程序file.py进行覆盖测试,然......
  • 改造Python中文拼音扩展库pypinyin补充自定义声母全过程
    问题要从昨天说起,应根球老师发给我一个代码问可能是啥原因,如下:该函数的第二个参数3含义为只保留声母,为啥“应”的声母丢了呢?因为当时正是课间休息,一会儿还要上课,没时间多想,感觉或许是lazy_pinyin()函数的问题,毕竟是个懒惰的函数嘛,于是告诉应老师试试其他函数。今天早上来教研室以后......
  • Python运算符is与==的区别
    在Python中,关系运算符==用来测试两个对象的值是否相等,而同一性测试运算符is用来测试两个对象是否是同一个对象,如果两个变量是同一个对象,那么它们的内存地址是一样的,当然它们的值肯定也是一样的。并且,如果两个变量是同一个列表或其他类型的可变序列,在某些操作中通过一个变量可以影响......
  • 使用Python提取JPEG图像文件dpi并计算物理尺寸
    感谢浙江省浦江中学方春林老师提供的问题、测试图像和第一版本的代码!下面的代码需要安装Python图像处理库pillow,由于不同公司对JPEG压缩算法和格式的实现不完全一样,有些类型的jpg文件暂时无法提取dpi信息,如果找到好的办法的话后期会再进行补充。fromosimportlistdirfromPILim......
  • Python中的枚举类型及其用法
    >>>fromenumimportEnum#导入模块中的类>>>classColor(Enum):#创建自定义枚举类red=1blue=2green=3>>>Color.red#访问枚举类的成员<Color.red:1>>>>type(Color.green)#查看枚举类成员的类型<enum'Color'>>&g......
  • 几行Python代码打造自己的磁盘垃圾文件清理器
    本文假设某些特定类型的文件和大小为0的文件为垃圾文件,可以自由扩展代码的列表,也就是垃圾文件的类型。fromos.pathimportisdir,join,splitextfromosimportremove,listdir,chmod,statimportsys#指定要删除的文件类型filetypes=['.tmp','.log','.obj','.txt']d......