前戏:列表生成式
等于
用列表生成式生成列表。需要将所有数据生成到内存中,占用空间,如果数据太多。生成数据就会耗时较久。
例如需要运行卡顿一下.....
定义一个生成器:定义时不生成任何数据,只有通过for循环调用,或者生成器本身自带的__next__()方法来调用 。
注意:1、__next__()方法调用时,只能向下调用,无法向上调用。
2、内存中只保存当前调用生成的这一个 数据,已经取(生成)过的数据,无法再次访问。只能再次从头循环取。。
用函数制作一个生成器:yield 关键字
生成器只有__next__()方法获取已有的yield值
新知识:异常捕获、next内置方法两种用法
send()方法:给yield传一个值,同时进行__next__()调用,进行生成器的返回:取yield本次获取的值。并进行本次代码执行。
__next__()只进行唤醒本次取值,无法给yield传值。
rend()可以给yield传值,并唤醒取值。
迭代器:
:如字符串、列表、元组、字典、generator生成器。等...
可被for循环取值的对象为可迭代对象。
迭代器:可以使用__next__()不断循环返回下一个值得对象为“迭代器”
如何看一个对象(或者说变量)是否是迭代器:使用dir(对象名) 看所有的方法中是否有__next__()方法
饶舌:生成器一定是迭代器,迭代器不一定是生成器。
将一个可迭代对象(如列表、字典、元组、字符串)iter()变成迭代器