python生成器函数_【python】生成器和生成器函数
1、生成器函数:
普通函数:
def func():
print("周杰伦")
return "昆凌"
func() #执行func()函数,"周杰伦"
print(func()) #执行结果:昆凌
生成器函数:
def func():
print("周杰伦")
yield "昆凌" # 函数中包含了yield, 当前这个函数就不再是普通的函数了. 是生成器函数
func() #通过func()函数生成一个生成器,非执行,没结果
print(func()) #打印的是该生成器函数所在的内存地址
#return 和yield的区别:
return: 执行到return时函数结束执行
yield:函数分段执行,从(当前yield到下一个yield]的内容
举例:
def func():
print("周杰伦")
yield "昆凌"
print("王力宏")
yield "李云迪"
#print("大家好才是真的好") #最后一个yield后不要写东西,因为__next__()找不到下一个yield时会报错StopIteration
g=func() #生成一个生成器
print(g.__next__()) #周杰伦 昆凌
print(g.__next__()) #王力宏 李云迪
2、send()
#__next__()和send()区别:
__next__() 可以让生成器向下执行一次;
send() 也可以让生成器向下执行一次, 给上一个yield传一个值, 第一个和最后一个yield不需要传值(最后一个值可以传进去但会报错)。
举例1:
def eat():
print("我吃什么啊")
a = yield "馒头"
print("a=",a)
b = yield "大饼"
print("b=",b)
c = yield "韭菜盒子"
print("c=",c)
yield "GAME OVER"
gen = eat() # 获取生成器
ret1 = gen. __next__ ()
print(ret1)
ret2 = gen.send("胡辣汤")
print(ret2)
ret3 = gen.send("狗粮")
print(ret3)
ret4 = gen.send("猫粮")
print(ret4)
执行结果:
我吃什么啊
馒头--------------第一次__next__()获取的内容
a= 胡辣汤----第一次send赋值,并打印
大饼-------第一次send获取的内容
b= 狗粮---第二次send赋值
韭菜盒子---第二次send获取的内容
c= 猫粮
GAME OVER
举例2:
def func():
print('0')
yield 1
print('2')
yield 3
yield 4
g1 = func()
lst = list(g1) #把生成器转换成列表
print(lst)
执行结果:
0
2
[1, 3, 4]
3、列表推倒式
语法:[最终结果 for 变量 in 可迭代对象 if 条件]
lst = [i for i in range(1,101) if i%2==0]
print(lst)
4、生成器表达式
#生成器表达式和列表推倒式基本是一样的,只是把[]换成()
语法:(最终结果 for 变量 in 可迭代对象 if 条件)
g = (i for i in range(10))
print(g) #打印的是通过表达式生成的生成器所在的内存地址
print(g.__next__()) #获取的第一个元素是0
print(list(g)) #获取的是列表 [0,1,2,3,4,5,6,7,8,9]
5、其他推倒式
5.1 字典推倒式:
语法:[结果(key:value) for 变量 in 可迭代对象 if 筛选]
#把字典中的key:value互换 .{"b":"a", "d":"c"}
dic = {"a":"b", "c":"d"}
new_dic = {dic[key]:key for key in dic}
print(new_dic)
5.2 集合推倒式:
语法:{结果(key) for 变量 in 可迭代对象 if 筛选}
lst = ["马化腾", "马化腾", "王建忠", "张建忠", "张雪峰", "张雪峰"]
s = {i for i in lst} # 集合推倒式,无序且不重复,自动去重
print(s)
注:没有元组推倒式(因为元组不可变,小括号括起来的是生成器表达式)
总结:
1、生成器的本质就是迭代器
2、生成器3种生成方法:
1)通过生成器函数
2)通过生成器表达式
3)通过数据转换
3、生成器函数被执行,如func()是拿到一个生成器函数,不是获取里面的内容
4、生成器取值:
1)__next__()
2)send()
3)for循环
4)list(g)
5、return 和yield的区别:
return: 执行到return时函数结束执行
yield:函数分段执行,从(当前yield到下一个yield]的内容
6、生成器惰性机制应用
举例1:
def func():
print(111)
yield 222
g = func() #生成器g
g1 = (i for i in g) #生成器g1,但数据来源g
g2 = (i for i in g1)#生成器g2,但数据来源g1
print(list(g)) #获取生成器g数据,此时func()才会被执行,打印111,获取到222
print(list(g1))#获取g1数据,来源g,但g数据已被取完,所以返回是空
print(list(g2))#同g1
执行结果:
111
[222]
[]
[]
举例2:若把print(list(g))注释了,得到的结果怎样?
def func():
print(111)
yield 222
g = func() #生成器g
g1 = (i for i in g) #生成器g1,但数据来源g
g2 = (i for i in g1)#生成器g2,但数据来源g1
#print(list(g))
print(list(g1))
print(list(g2))
执行结果:
111
[222]
[]
举例3:
def add(a,b):
return a + b
def test():
for i in range(4):
yield i
g = test() #0,1,2,3,
for n in [2,10]: #n 取值2,10 表示共循环2次
g=(add(n,i) for i in g)
print(list(g))
#list(g)时才会执行,生成器惰性特质
#g=(add(n,i) for i in g) 循环2次,相当于最后g=(add(n,i) for i in (add(n,i) for i in g))
#g=(add(n,i) for i in (add(n,i) for i in (0,1,2,3)))
#生成器不到最后不执行,最后一次n=10,那么g=(add(10,i) for i in (10,11,12,13))
#g=[20,21,22,23]
python生成器函数_【python】生成器和生成器函数相关推荐
- python中如何调用函数_我写了一个函数,如何在python中调用
匿名用户 1级 2015-03-06 回答 Python的特色简单 Python是一种代表简单主义思想的语言.阅读一个良好的Python程序就感觉像是在读英语一样,尽管这个英语的要求非常严格!Pyth ...
- python计算执行时间的函数_[python] 统计函数运行时间
第一种: import time def time_me(fn): #fn 是要修饰/修改 的函数 def _wrapper(*args, **kwargs): #这个 _wrapper(*args, ...
- python imshow参数_用matplotlib中imshow()函数绘图
matplotlib 是python最著名的2D绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中.通过简单的绘图语 ...
- 小甲鱼python课件源代码_[Python基础] 小甲鱼零基础入门Python学习视频+全套源码课件 Python视频教程 96讲...
资源介绍 课程简介: 小甲鱼的Python课程,对初学者来说相当不错!97讲完全解读,会让大家对Python的认识从无到有,推荐给大家! 课程目录------------------- 第000讲 愉 ...
- python 病毒 基因_#Python#提取基因对应的蛋白质名
提取基因对应的蛋白质官方名 最开始,是需要将基因跟其编码的蛋白质对应起来,找遍了各种数据库都没发现有相关的注释文件,Uniprot作为处理蛋白质的大佬,结果里都有,肯定有办法能够满足需求. 搜索TP5 ...
- python keyboard模块_[python] PyMouse、PyKeyboard用python操作鼠标和键盘
1.PyUserInput 简介 PyUserInput是一个使用python的跨平台的操作鼠标和键盘的模块,非常方便使用.支持的平台及依赖如下: Linux - Xlib Mac - Quartz, ...
- python编写递归函数_[ python ] 递归函数
递归函数 描述: 如果一个函数在内部调用自身本身,这个函数就是递归函数 递归函数特性: (1)必须有一个明确的结束条件 (2)每次进入更深一层递归时,问题规模相比上次递归都应有所减少 (3)相邻两次重 ...
- hive substr函数_数据分析工具篇——HQL函数及逻辑
本篇文章我们梳理一下hive常用的函数,对于hive而言,常用的函数并不是特别多,往往记住关键几个,就可以解决80%的问题,这也是大家喜欢hive的原因,那么,常用的函数有哪些呢? 时间函数 1)时间 ...
- decode函数_「实践」云函数 + API,你也可以做个天气信息系统
为什么要把云函数 SCF 与 API 网关进行结合?本文告诉你答案! 通常,我们用云函数 SCF 写一个函数应用,这个应用可能多种多样.例如之前介绍过的 OJ 系统判题功能,通过 NLP 实现文本摘要 ...
- subtotal函数_用SUBTOTAL更改Excel函数
subtotal函数 We looked at the Excel SUBTOTAL function on Friday, and saw how it works with hidden rows ...
最新文章
- 了解这些,你就可以在Spring启动时为所欲为了
- 微服务架构设计模式 pdf_六种常用的微服务架构设计模式之一: 入门级模式...
- 【Protocol Buffer】Protocol Buffer入门教程(五):repeated限定修饰符
- 如何在JUnit 5中替换规则
- C# 特性 Attribute
- 【SDOI 2011】Paint 染色
- 蜂鸟开发板 linux,蜂鸟E203系列——Linux下运行hello world例程
- pmc订单表格_复工了,读一则“如何提升订单准交率和生产效率”的真实故事
- STM32H743+CubeMX-ADC+DMA采样四路AD
- maven mirror 优先级
- VS2010 VS2012版最常用的快捷键
- 8.Linux的LVM使用详解
- postgresql 数据库路径迁移
- Android中ail的作用和使用说明
- VR家装:智慧家装“黑科技”
- Wannafly挑战赛4,C题割草机,(模拟)
- 解决时间输出格式带 T 带 000+00:00 输出时间多了个T 返回时间格式带T
- 测试高考体育成绩的软件,高考体育成绩查询
- 5735. 雪糕的最大数量
- 西游记中13大高手排名
热门文章
- 十年研发经验嵌入式工程师书籍推荐
- 马克.扎克伯格的执行力
- Django之入门 CMDB系统 (一) 基础环境
- 以后版本网卡命名规则
- Linux/Centos Mondo 一键部署、镜像恢复,快速部署
- 洛谷1527(bzoj2738)矩阵乘法——二维树状数组+整体二分
- 【laravel5.4】laravel5.4系列之生成_ide_helper.php文件
- 3-4 第三天 Generator生成器
- [20160725]MyComparableTest
- android高仿微信UI点击头像显示大图片效果