Python_Mix*生成器,生成器函数,推导式,生成器表达式

  • 生成器:
    • 生成器的本质就是迭代器
    • 生成器一般由生成器函数或者生成器表达式来创建,其实就是手写的迭代器
  •  1 def func():
     2     print('abc')
     3     yield 222     #由于函数中有了yield 
     4 
     5 ret = func()        
     6 print(ret)       #我们执行函数的时候实际上是获取生成器 
     7 
     8 结果:
     9 <generator object func at 0x10567ff68>
    10  这个叫func的生成器的内存地址0x10567ff68
    • 在Python中可以通过三种方式来获取生成器:
      • 1.通过生成器函数
      • 2.通过各种推导式来实现生成器
      • 3.通过数据的转换也可以获取生成器
    • yield:
      • 将函数中的return换成yield就是生成器,由于函数中存在了yield,我们再执行这个函数的时候就不再是函数的执行了,而是获取这个生成器.
    • return和yield的区别:
      • yield是分段来执行一个函数,return是直接停止执行函数.
    • 特点:
      • 生成器的特点和迭代器一样,取值方式和迭代器一样(__next__( ),send( ):给上一个yield传值)
  • 生成器函数:
    • 和普通函数没有区别,里面有yield的函数就是生成器函数
    • 生成器函数在执行的时候,默认不会执行函数体,返回生成器
    • 通过生成器的__next__( )分段执行这个函数
    • send( )给上一个yield传值,不能在开头(因为没有上一个yiel),最后一个yield也不可以用send(因为没有下一个yield)
  •  1 def eat():
     2     print('吃什么呢')
     3     a = yield '馒头'
     4     print('a=',a)
     5     b = yield '面条'
     6     print('b=',b)
     7     c = yield '水果'
     8     print('c=',c)
     9     yield '安排一下!'
    10 eats = eat()          #获取生成器
    11 ret1 = eats.__next__()
    12 print(ret1)
    13 ret2 = eats.send('胡辣汤')
    14 print(ret2)
    15 ret3 = eats.send('冰激凌')
    16 print(ret3)
    17 ret4 = eats.send('蛋挞')
    18 print(ret4)
  • 推导式:
    • 1)列表推导式[结果 for循环 条件筛选]
    • 2)字典推导式{结果 for循环 条件筛选}
    • 3)集合推导式{key for循环 条件}
  • 生成器表达式
    • (结果 for循环 条件)
    • 特点:
      • 1.惰性机制
      • 2.只能向前
      • 3.节省内存

猜你喜欢

转载自www.cnblogs.com/mixw/p/9469718.html