020.Python生成器和生成器函数,,一 生成器1.1 基
020.Python生成器和生成器函数,,一 生成器1.1 基
一 生成器
1.1 基本概念
元组推导式是是生成器(generator)
生成器定义
生成器可以实现自定义,迭代器是系统内置的,不能够更改生成器的本质就是迭代器,只不过可以自定义.生成器有两种定义的方式:
生成器表达式 (里面是推导式,外面用圆括号)生成器函数1.2 元组推导式的形式来写生成器
gen = (i * 2 for i in range(5))print(gen)from collections import Iteratorprint(isinstance(gen,Iterator))
执行
[root@node10 python]# python3 test.py<generator object <genexpr> at 0x7fb5ec2e6200>True
1.3 使用for调用生成器
gen = (i * 2 for i in range(5))print(gen)from collections import Iteratorprint(isinstance(gen,Iterator))for i in gen: print (i)
执行
[root@node10 python]# python3 test.py<generator object <genexpr> at 0x7fd817c1f200>True02468
1.4 用next进行调用生成器
gen = (i * 2 for i in range(5))print(gen)from collections import Iteratorprint(isinstance(gen,Iterator))for i in gen: print (i)gen = (i * 2 for i in range(5))res = next(gen)print(res)res = next(gen)print(res)res = next(gen)print(res)res = next(gen)print(res)res = next(gen)print(res)
执行
[root@node10 python]# python3 test.py<generator object <genexpr> at 0x7f0b564d0200>True0246802468
越界错误
gen = (i * 2 for i in range(5))print(gen)from collections import Iteratorprint(isinstance(gen,Iterator))for i in gen: print (i)gen = (i * 2 for i in range(5))res = next(gen)print(res)res = next(gen)print(res)res = next(gen)print(res)res = next(gen)print(res)res = next(gen)print(res)#在添加一个会出现越界错误res = next(gen)print(res)
执行
1.5 利用for 和next 配合使用 调用生成器
gen = (i * 2 for i in range(5))print(gen)from collections import Iteratorprint(isinstance(gen,Iterator))gen = (i * 2 for i in range(5))for i in range(3): res = next(gen) print(res)
执行
[root@node10 python]# python3 test.py<generator object <genexpr> at 0x7f5e78ef1200>True024
二 生成器函数
2.1 yield 生成器函数
yield 类似于 return共同点在于:执行到这句话都会把值返回出去不同点在于:yield每次返回时,会记住上次离开时执行的位置 , 下次在调用生成器 , 会从上次执行的位置往下走 而return直接终止函数,每次重头调用.yield 6 和 yield(6) 2种写法都可以 yield 6 更像 return 6 的写法 推荐使用
定义一个生成器
def func(): print("one") yield 1 print("two") yield 2 print("three") yield 3# 初始化生成器函数 => 返回一个生成器对象 简称生成器gen = func()res = next(gen)print(res)res = next(gen)print(res)res = next(gen)print(res)
执行
[root@node10 python]# python3 test.pyone1two2three3
执行过程
首先初始化生成器函数 返回生成器对象,简称生成器 有了生成器之后 可以使用next进行依次的调用 第一次 print(one) 记录当前的状态,暂停等待下一次调用 通过yield 1 返回1 ,阻塞代码 第二次 print(two) 记录当前的状态,暂停等待下一次调用 通过yield 2 返回2 ,阻塞代码 第三次 print(three) 记录当前的状态,暂停等待下一次调用 通过yield 3 返回3 ,阻塞代码 到此已经没有值可以在拿出来了,如果在调用,直接越界报错.
优化生成器
def func(): for i in range(1,101): yield "我的球衣号码是%d" % (i)# 初始化生成器函数 => 返回一个生成器对象gen = func()for i in range(30): res = next(gen) print(res)for i in range(50): res = next(gen) print(res)
2.2 send生成器函数
把值发送给上一个yield 进行接收
next和send区别:
next 只能取值send 不但能取值,还能发送值send注意点:
第一个 send 不能给 yield 传值 默认只能写None (语法的硬性要求)最后一个yield 接受不到send的发送值def func(): print("start") res = yield 1 print(res) res = yield 2 print(res) res = yield 3 print(res) print("end")
#初始化生成器函数,生成生成器gen = func()# 生成器.send 第一次发送的时候必须参数是None 硬性语法res = gen.send(None) #这里相当于res = next(gen)print(res)
执行
[root@node10 python]# python3 test.pystart1
第二次可以自定义要发送的值
def func(): print("start") res = yield 1 print(res) res = yield 2 print(res) res = yield 3 print(res) print("end")gen = func()# 生成器.send 第一次发送的时候必须参数是None 硬性语法res = gen.send(None)print(res)res = gen.send("111")print(res)res = gen.send("222")print(res)
执行
[root@node10 python]# python3 test.pystart111122223
如果没有yield了 , 就没有返回值给你, 在调用直接报错
如果就像在最后一次调用的时候执行剩下的没跑完的代码,使用try..except..来进行异常处理
def func(): print("start") res = yield 1 print(res) res = yield 2 print(res) res = yield 3 print(res) print("end")gen = func()# 生成器.send 第一次发送的时候必须参数是None 硬性语法res = gen.send(None)print(res)res = gen.send("111")print(res)res = gen.send("222")print(res)res = gen.send("222")print(res)
执行
[root@node10 python]# python3 test.pystart111122223222endTraceback (most recent call last): File "test.py", line 25, in <module> res = gen.send("222")StopIteration
执行过程
发送的时候 是先发送 ,后接受#第一次发送的时候必须参数是None 硬性语法print(start) 记录当前状态, 把yield 1这个值返回取出 , 暂定阻塞,等待下一次调用.# 第二次调用时,可以自定义要发送的值 被yield 1 这一行收走了,res接收到send发送过去的值为111那么从这一行继续向下执行print(res) 111res = yield 2把2 返回给res = gen.send(111) 这一行 res 接收到2 print(res)#第三次调用时,发送自定义值222,被res = yield 2接收到 print(res) => 222然后执行res = yield 3 记录当前状态,把yield 3 这个值返回取出, 代码暂停阻塞,等待下一次调用.
2.3 yield from 函数
将一个可迭代对象变成一个迭代器返回def func(): listvar = [1,2,3,4,4,5] # yield listvar yield from listvar# 初始化生成器函数 返回生成器对象 简称生成器gen = func()res = next(gen)print(res)res = next(gen)print(res)res = next(gen)print(res)res = next(gen)print(res)print("<=for=>")for i in gen: print(i)
执行
[root@node10 python]# python3 test.py1234<=for=>45
020.Python生成器和生成器函数
相关内容
- python正则表达式----008,,1. 正则表达式基础
- python-标识符(Identifiers)和关键字(keywords),,标识符
- Robot Framework+AutoItLibrary使用,,目的:用Robot
- python之random模块,,# 关于random
- 用python对股票期货做时序分析,,CFFEX.IF18
- Python 还你一块纯洁无暇的移动硬盘,,1目 标 场 景用过
- Python3 格式化输出 %s & %d 等,,1.打印字符串pri
- Python怎么识别文字?正确 的方法详解,,爬虫&mdash
- Python简单的爬虫,,Python3 的r
- Python 数据结构,,Python基本数据
评论关闭