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】生成器和生成器函数相关推荐

  1. python中如何调用函数_我写了一个函数,如何在python中调用

    匿名用户 1级 2015-03-06 回答 Python的特色简单 Python是一种代表简单主义思想的语言.阅读一个良好的Python程序就感觉像是在读英语一样,尽管这个英语的要求非常严格!Pyth ...

  2. python计算执行时间的函数_[python] 统计函数运行时间

    第一种: import time def time_me(fn): #fn 是要修饰/修改 的函数 def _wrapper(*args, **kwargs): #这个 _wrapper(*args, ...

  3. python imshow参数_用matplotlib中imshow()函数绘图

    matplotlib 是python最著名的2D绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中.通过简单的绘图语 ...

  4. 小甲鱼python课件源代码_[Python基础] 小甲鱼零基础入门Python学习视频+全套源码课件 Python视频教程 96讲...

    资源介绍 课程简介: 小甲鱼的Python课程,对初学者来说相当不错!97讲完全解读,会让大家对Python的认识从无到有,推荐给大家! 课程目录------------------- 第000讲 愉 ...

  5. python 病毒 基因_#Python#提取基因对应的蛋白质名

    提取基因对应的蛋白质官方名 最开始,是需要将基因跟其编码的蛋白质对应起来,找遍了各种数据库都没发现有相关的注释文件,Uniprot作为处理蛋白质的大佬,结果里都有,肯定有办法能够满足需求. 搜索TP5 ...

  6. python keyboard模块_[python] PyMouse、PyKeyboard用python操作鼠标和键盘

    1.PyUserInput 简介 PyUserInput是一个使用python的跨平台的操作鼠标和键盘的模块,非常方便使用.支持的平台及依赖如下: Linux - Xlib Mac - Quartz, ...

  7. python编写递归函数_[ python ] 递归函数

    递归函数 描述: 如果一个函数在内部调用自身本身,这个函数就是递归函数 递归函数特性: (1)必须有一个明确的结束条件 (2)每次进入更深一层递归时,问题规模相比上次递归都应有所减少 (3)相邻两次重 ...

  8. hive substr函数_数据分析工具篇——HQL函数及逻辑

    本篇文章我们梳理一下hive常用的函数,对于hive而言,常用的函数并不是特别多,往往记住关键几个,就可以解决80%的问题,这也是大家喜欢hive的原因,那么,常用的函数有哪些呢? 时间函数 1)时间 ...

  9. decode函数_「实践」云函数 + API,你也可以做个天气信息系统

    为什么要把云函数 SCF 与 API 网关进行结合?本文告诉你答案! 通常,我们用云函数 SCF 写一个函数应用,这个应用可能多种多样.例如之前介绍过的 OJ 系统判题功能,通过 NLP 实现文本摘要 ...

  10. subtotal函数_用SUBTOTAL更改Excel函数

    subtotal函数 We looked at the Excel SUBTOTAL function on Friday, and saw how it works with hidden rows ...

最新文章

  1. 了解这些,你就可以在Spring启动时为所欲为了
  2. 微服务架构设计模式 pdf_六种常用的微服务架构设计模式之一: 入门级模式...
  3. 【Protocol Buffer】Protocol Buffer入门教程(五):repeated限定修饰符
  4. 如何在JUnit 5中替换规则
  5. C# 特性 Attribute
  6. 【SDOI 2011】Paint 染色
  7. 蜂鸟开发板 linux,蜂鸟E203系列——Linux下运行hello world例程
  8. pmc订单表格_复工了,读一则“如何提升订单准交率和生产效率”的真实故事
  9. STM32H743+CubeMX-ADC+DMA采样四路AD
  10. maven mirror 优先级
  11. VS2010 VS2012版最常用的快捷键
  12. 8.Linux的LVM使用详解
  13. postgresql 数据库路径迁移
  14. Android中ail的作用和使用说明
  15. VR家装:智慧家装“黑科技”
  16. Wannafly挑战赛4,C题割草机,(模拟)
  17. 解决时间输出格式带 T 带 000+00:00 输出时间多了个T 返回时间格式带T
  18. 测试高考体育成绩的软件,高考体育成绩查询
  19. 5735. 雪糕的最大数量
  20. 西游记中13大高手排名

热门文章

  1. 十年研发经验嵌入式工程师书籍推荐
  2. 马克.扎克伯格的执行力
  3. Django之入门 CMDB系统 (一) 基础环境
  4. 以后版本网卡命名规则
  5. Linux/Centos Mondo 一键部署、镜像恢复,快速部署
  6. 洛谷1527(bzoj2738)矩阵乘法——二维树状数组+整体二分
  7. 【laravel5.4】laravel5.4系列之生成_ide_helper.php文件
  8. 3-4 第三天 Generator生成器
  9. [20160725]MyComparableTest
  10. android高仿微信UI点击头像显示大图片效果