一, 生成器函数
1.yield 关键字
定义: 含义 yield 关键字的函数, 是生成器函数
作用: 返回值, 不终止函数, 若 yield 后无值, 则返回 None
用法: 与 return 关键字不能共存, 必须在函数内部
2. 调用函数
调用生成器函数返回的是生成器
3. 常用方法
1)__next__()
格式: 生成器.__next__()
作用: 执行生成器函数内部代码, 遇到 yeild 关键字停止, 并返回值, 若没有 yield 作为结尾, 会报错
- # 生成器函数
- def generator():
- print(1)
- yield 'a'
- print(2)
- yield 'c'
- g = generator() # g 是生成器
- print(g)
- ret = g.__next__() # 执行生成器函数内部代码直到遇到 yield
- print(ret)
2)for 循环
作用: 执行生成器内部代码, 结尾不是 yield 关键字, 不会报错
- # 生成器函数
- def generator():
- print(1)
- yield 'a'
- print(2)
- yield 'c'
- g = generator() # g 是生成器
- for i in g:
- print(i)
- 3)send()
格式: send(传递的数据)
作用: 执行下面的代码, 给上一个 yield 位置传递数据
注意: 不能在初始或最后使用 send() 方法
- def generator():
- print(1)
- count = yield 'a'
- print(count)
- print(2)
- yield 'c'
- g = generator() # g 是生成器
- ret1 = g.__next__()
- print('>>>{}'.format(ret1)) # str 格式输出 format
- # g.__next__()
- ret2 = g.send('a123')
- print('***%s' % ret2) # 格式化输出
- 4)yield from
作用: 简化代码
格式: yield from 可迭代对象
- def generator():
- # for i in range(10):
- # yield i
- yield from range(10) # 和 for 循环的作用一样
- g = generator()
- for i in g:
- print(i)
二, 生成器表达式
1. 格式: 生成器 = (为 True 操作 for i in 可迭代对象 if 条件)
2. 分类
遍历
筛选
- # 遍历, 1-10
- g = (i for i in range(1, 11))
- for i in g:
- print(i)
- # 筛选
- g = (i**2 for i in range(10) if i> 5)
- for i in g:
- print(i)
三, 推导式
1. 列表推导式
- # 遍历, 1-10
- li1 = [i for i in range(1, 11)]
- print(li1)
- # 筛选
- li2 = [i**2 for i in range(10) if i> 5]
- print(li2)
列表推导式和生成器表达式的区别:
1) 格式: 列表推导式 [], 生成器表达式 ()
2) 内存消耗: 生成器表达式消耗内存少
2. 字典推导式
- # 把 value 值变成大写
- dic = {
- 'k1': 'v1', 'k2': 'v2', 'k3': 'v3'
- }
- dic1 = {
- k: dic[k].upper() for k in dic
- }
- print(dic1)
- # 筛选
- dic2 = {
- k: dic[k] for k in dic if dic[k] == 'v3'
- }
- print(dic2)
3. 集合推导式
- # 遍历
- set1 = {
- -1, 1, -2, 2
- }
- set2 = {
- i**2 for i in set1
- } # 集合, 去重
- print(set2)
- # 筛选
- set3 = {
- i*i for i in set1 if i == 2
- }
- print(set3)
来源: http://www.bubuko.com/infodetail-3055068.html