1. 生成器
  本质就是迭代器.
  一个一个的创建对象
  创建生成器的方式:
    1. 生成器函数
    2. 通过生成器表达式来获取生成器
    3. 类型转换(看不到)
2. 生成器函数 
生成器函数中包含 yield , 返回数据和return差不多.
return会立即结束这个函数的执行
yield 可以分段的执行一个函数

生成器函数在执行的时候返回生成器. 而不是直接执行此函数

能向下执行的两个条件:
  __next__(), 执行到下一个yield

def func():
    print(\'今天是12.11\', end=\' \')
    yield \'today\'
    print(\'昨天是12.10\', end=\' \')
    yield \'yesterday\'
    print(\'明天是12.13\', end=\' \')
    yield \'tomorrow\'

ret = func()
print(ret) # <generator   func at 0x0000000001DFB7D8>
print(ret.__next__()) # 今天是12.11 today
print(ret.__next__()) # 昨天是12.10 yesterday
print(ret.__next__()) # 明天是12.13 tomorrow

send(), 执行到下一个yield, 给上一个yield位置传值

def func():
    print(\'今天是12.11\', end=\' \')
    a = yield \'today\'
    print(\'a\',a, end=\' \')
    print(\'昨天是12.10\', end=\' \')
    b = yield \'yesterday\'
    print(\'b\', b,  end=\' \')
    print(\'明天是12.13\', end=\' \')
    c = yield \'tomorrow\'
    print(\'c\', c,  end=\' \')

gen = func()
print(gen.__next__())  # 第一个位置用send()没有意义  今天是12.11 today
print(gen.send(\'1\')) # 给上一个yield传 值  a 1 昨天是12.10 yesterday
print(gen.send(\'2\')) # b 2 明天是12.13 tomorrow

所有的生成器都是迭代器都可以直接使用for循环, 都可以使用list()函数来获取到生成器内所有的数据

lst = []
for i in range(1, 13):
    lst.append(\'今天是第%s天\' % i)
print(lst) # [\'今天是第1天\', \'今天是第2天\', \'今天是第3天\', \'今天是第4天\', \'今天是第5天\', \'今天是第6天\', \'今天是第7天\', \'今天是第8天\', \'今天是第9天\', \'今天是第10天\', \'今天是第11天\', \'今天是第12天\']
lst = [\'今天是第%s天\' % i for i in range(1, 13)]
print(lst) # [\'今天是第1天\', \'今天是第2天\', \'今天是第3天\', \'今天是第4天\', \'今天是第5天\', \'今天是第6天\', \'今天是第7天\', \'今天是第8天\', \'今天是第9天\', \'今天是第10天\', \'今天是第11天\', \'今天是第12天\']

gen = func() # 创建生成器. 此时运行会把生成器函数中的代码记录在内存
当执行到__next__(), 运行此空间中的代码, 运行到yield结束.

优点: 节省内存, 生成器本身就是代码. 几乎不占用内存
特点: 惰性机制, 只能向前. 不能反复


3. 各种推导式 (诡异)
列表推导式 [结果 for循环 if]

# 生成列表,内容是1-100之间所有偶数的平方
lst = [i**2 for i in range(1, 101) if i % 2 ==0]
print(lst)

字典推导式 {结果(k:v) for循环 if}

#练习: {\"主食\":\'炒面\',\'副食\':\'酸辣土豆粉\', \'汤\':\'鸡蛋汤\'}
dic = {\"主食\":\'炒面\',\'副食\':\'酸辣土豆粉\', \'\':\'鸡蛋汤\'}
dic = {v:k for k,v in dic.items()}
print(dic)

 

收藏 打印