生成器
Posted lilei1996
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生成器相关的知识,希望对你有一定的参考价值。
生成器:生成器实质就是迭代器,在python中有三种方式来获取生成器:
1通过生成器函数
2.通过各种推导式
3.通过数据的转换也可以实现
def func(): print("1112") return 2223 ret=func() print(ret) 结果: 1112 2223
将函数中的return换成yield就是生成器
def func(): print("1112") yield 2223 ret=func() print(ret) 结果: <generator object func at 0x0000000002501EB8>
结果出现了一个内存地址,函数中存在yield,那么这个函数就是一个生成器函数,因为生成器的本质就是迭代器,所以我们可以直接执行__next__()来执行生成器
def func(): print("1112") yield 2223 g=func() #到这函数不会执行,会变成一个生成器 ret=g.__next__() #到这里函数才会执行,yield的作用和return一样的都是返回数据 结果: 1112 2223
yield的特点:可以记录当前函数中执行的位置,写一次继续执行
生成器的特点:
调用之后不执行,需要用next来出发这个函数继续执行下去
yield停止符,也是记录符
生成器函数和其他函数本质上和我们得到的是相同的,中间过程不同
yield和return的区别
yield是分段来执行一个函数
return 直接停止执行函数
def func(): print("1112") yield 2223 print("3334") yield 4445 g=func() ret=g.__next__() print(ret) ret2=g.__next__() print(ret2) ret3=g.__next__() #最后一个yield执行完毕,再次__next__()程序报错,也就是说和return无关了 print(ret3)
生成器的作用:节省内存,一次调用一个,__next__()到哪快,下一个__next__继续获取下一个值
send方法:
def gener(): print("草莓味") smell=yield 1 print(smell) smell2=yield 2 print(smell2) yield 3 g=gener() print(g.__next__()) ret=g.send("香蕉味") print(ret) ret2=g.send("榴莲味") print(ret2)
1..生成器函数永远得到的是一个生成器
2.启动生成器的第一个方法永远是next
3.从第二个开始可以是send
4.g.__next__相当于同一g.send(None)
5.如果send发送了值,但是yield没有接收,不会报错,也不会收到值
send和__next__()区别:
1.send和__next__都是让生成器向下走一次
2.send可以给上一个yield的位置传递值,在第一次执行生成器代码的时候不能使用send()
生成器可以会用for循环获取内部的元素:
def func(): print(1112) yield 2223 print(3334) yield 4445 print(5556) yield 6667 g=func() for i in g: print(i) 结果: 1112 2223 3334 4445 5556 6667
生成器:
send/__next__ 生成器外用
yield/yield from 生成器内用
next+send==yield
如果函数中yield需要接收参数,那么应该使用send传值
如果函数中yield不需要接收参数,那么直接使用next即可
生成器和迭代器是一样的,内部的值都是只能取一次值
从生成器中取值的方式也和迭代器是一样
监听文件输入: def func(): f=open("t.txt",encoding="utf-8") while 1: line=f.readline().strip() if line: yield line.strip() line1=func() foe i in line1: print(i.split(","))
浮点数:float :小数点的浮动
浮点数能不能表示数学上的数字:有理数(有限小数,无限循环小数)
浮点数是不准确的,小数的小数位是转换成二进制存储的
如果想准确的存储:转换成字符串存储
如果创建的变量本身带小数点,那么这个变量的数据类型直接就是浮点数
所有的除法(除了//平地除)得到的都是小数
除法:
python2.x:整数除以整数就会取值,(向下取整)有一个数浮点数,就找哪块浮点数计算
python3.x所有的除法(除了//)得到的都是小数
列表推导式:
当已经有一个列表,从这个列表中的每一个元素都需要做某个操作,并且需要将操作的结果放在一个新的列表中,适合使用列表推导式
lst=[1,2,3,4,5]
new_lst=[i for i in lst]
以上是关于生成器的主要内容,如果未能解决你的问题,请参考以下文章