Python第十二课(迭代器/生成器) >>>转到思维导图>>>转到中二青年
1.迭代
1.1什么是迭代:
更新换代(重复)的过程,每次迭代都必须基于上一次的结果
1.2什么是迭代器:
迭代取值的工具
1.3为什么要有迭代器:
迭代器提供了一种不依赖于索引取值的方式
对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器
1.4什么是可迭代对象:
可迭代对象指的是内置有__iter__方法的对象,即obj.__iter__
1.5什么是迭代器对象:
可迭代对象执行obj.__iter__()得到的结果就是迭代器对象。而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象。
1.6注意:
迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象
需要迭代取值的数据类型:字符串str、列表list、元组tuple、字典dict、集合set、文件对象
文件对象执行内置的__iter__之后还是本身 没有任何变化,文件对象本身就是迭代器对象
针对双下线开头双下划线结尾的方法,推荐读:双下+方法名
2.迭代器取值:
迭代器取值 调用__next__
迭代器对象无论执行多少次__iter__方法得到的还是迭代器对象本身
2.1异常报错StopIteration:取完了
2.2异常处理:
while True: try: print(iter_d.__next__()) except StopIteration: print('老母猪生不动了') break
2.3迭代器取值的特点:只能往后依次取,不能后退
2.4迭代器取值的优点:
1.不依赖于索引取值
2.内存中永远只占一份空间,不会导致内存溢出
2.5迭代器取值的缺点:
1.不能够获取指定的元素
2.取完之后会报StopIteration错
3.for循环的本质
1.将in后面的对象调用__iter__转换成迭代器对象
2.调用__next__迭代取值
3.内部有异常捕获StopIteration,当__next__报这个错 自动结束循环
4.生成器
只要函数内部包含有yield关键字,那么函数名()的到的结果就是生成器,并且不会执行函数内部代码
生成器就是迭代器,可以用__next__方法取值
yield后面跟的值就是调用迭代器__next__方法你能得到的值
yield既可以返回一个值也可以返回多个值,并且多个值也是按照元组的形式返回
可以用.send给yield左边的变量传参,但必须先将代码运行至yield才能为期传值
yeild
1.帮你提供了一种自定义生成器方式
2.会帮你将函数的运行状态暂停住
3.可以返回值
yeid与return异同:
相同点:都可以返回值,并且都可以返回多个
不同点:yield可以返回多次值,而return只能返回一次函数立即结束,yield还可以接受外部传入的值
5.生成器表达式
例如:res = (i for i in range(1,10) if i != 4)
一道面试题
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
def add(n,i): return n+i def test(): for i in range(4): yield i g=test() for n in [1,10]: g=(add(n,i) for i in g) # 第一次for循环g=(add(n,i) for i in test()) # 第二次for循环g=(add(n,i) for i in (add(n,i) for i in test())) print(n) res=list(g) """ for i in (add(10,i) for i in test()): 会执行所有的生成器内部的代码 add(n,i) """ #A. res=[10,11,12,13] #B. res=[11,12,13,14] #C. res=[20,21,22,23] 答案 #D. res=[21,22,23,24]
6.常用内置方法
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
abs()取绝对值。 all()传入一个可迭代对象只要对象中一个元素为False就返回False any()传入一个可迭代对象只要对象中一个元素为True就返回True bin()十进制转二进制 返回一个整数 int的二进制表示。 oct()十进制转八进制 返回一个整数 int的二进制表示。 hex()十进制转16进制 返回一个整数 int的二进制表示。 int()用于将一个字符串或数字转换为整型,如果传入两个参数,第一个是要转的进制数,第二个是表示当前数是多少进制,最终将进制数转为十进制数。 bool()将给定参数转换为布尔类型,如果没有参数,返回 False callable()用于检查一个对象是否是可调用的。 char()将数字转换成ascii码表对应的字符。 unichr() 函数 和 chr()函数功能基本一样, 只不过是返回 unicode 的字符。 ord()将字符按照ascii表转成对应的数字。 dict()用于创建一个字典。 dir()获取当前对象名称空间里面的名字。 divmod() 函数把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b) enumerate()函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。 eval()用来执行一个字符串表达式,并返回表达式的值。 exec()执行储存在字符串或文件中的 Python 语句,相比于 eval,exec可以执行更复杂的 Python 代码。其返回值为none format()格式化输出 globals()会以字典类型返回当前位置的全部全局变量。 locals()会以字典类型返回当前位置的全部局部变量。 help()查看函数注释说明 isinstance()用来判断一个对象是否是一个已知的类型,类似 type()。 next() 返回迭代器的下一个项目。 open() 函数用于打开一个文件,创建一个 file 对象,相关的方法才可以调用它进行读写。 pow() 方法返回 x^y(x的y次方) 的值。 reverse() 函数用于反向列表中元素。 round() 方法返回浮点数x的四舍五入值。
END