迭代器和生成器是函数中的一大重点,务必掌握,何为迭代?何为迭代器?html
预习:python
处理文件,用户指定要查找的文件和内容,将文件中包含要查找内容的每一行都输出到屏幕(使用生成器)编程
1、迭代器ide
for i in 50: print(i) #运行结果: # Traceback (most recent call last): # File "G:/python/python代码/八月/day2 迭代器生成器/3迭代器.py", line 8, in <module> # for i in 50: # TypeError: 'int' object is not iterable
报错:函数
TypeError: 'int' object is not iterablepost
类型报错:'int'对象是不可迭代的 何为迭代?大数据
iterable:可迭代的;迭代的;url
可迭代的:从上面代码能够简单分析出能被for循环取值的就是可迭代,那么咱们就能够初步总结出可迭代的类型:str、list、tuple、set、dictspa
可迭代的 ——对应的标志 拥有__iter__方法3d
print('__iter__' in dir([1,2,3])) #判断一个变量是否是一个可迭代的
可迭代协议
能够被迭代要知足的要求就叫作可迭代协议。可迭代协议的定义很是简单,就是内部实现了__iter__方法。
2、迭代器
__iter__方法做用:
迭代器
iterator:迭代器;迭代程序
迭代器协议:必须拥有__iter__方法和__next__方法
经过iter(x)获得的结果就是一个迭代器,
x是一个可迭代的对象
在for循环中,就是在内部调用了__next__方法才能取到一个一个的值。
__next__的精髓:
__next__方法的使用精髓
若是咱们一直取next取到迭代器里已经没有元素了,就会报错(抛出一个异常StopIteration),告诉咱们,列表中已经没有有效的元素了。这个时候,咱们就要使用异常处理机制来把这个异常处理掉。try_except异常处理机制只作了解,不是本章重点,会面会详细讲解。
判断是否可迭代和迭代器的简洁方法:
判断可迭代和迭代器
不论是一个迭代器仍是一个可迭代对象,均可以使用for循环遍历
迭代器出现的缘由 帮你节省内存
3、生成器
迭代器大部分都是在python的内部去使用的,咱们直接拿来用就好了
咱们本身写的能实现迭代器功能的东西就叫生成器。
1.生成器函数:常规函数定义,可是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每一个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行
2.生成器表达式:相似于列表推导,可是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表
生成器Generator:
本质:迭代器(因此自带了__iter__方法和__next__方法,不须要咱们去实现)
特色:惰性运算,开发者自定义
生成器函数
生成器的好处:不会一会儿在内存中生成太多数据
其它应用:
生成器监听文件输入的例子
计算移动平均值简单
计算移动平均值升级_生成器激活装饰器
yield from
4、列表推导式和生成器表达式
列表推导式和生成器表达式
使用生成器的优势:
一、延迟计算,一次返回一个结果。也就是说,它不会一次生成全部的结果,这对于大数据量处理,将会很是有用。
二、提升代码可读性
#列表解析 sum([i for i in range(100000000)])#内存占用大,机器容易卡死 #生成器表达式 sum(i for i in range(100000000))#几乎不占内存
总结:
一、把列表解析的[]换成()获得的就是生成器表达式
二、列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存
三、Python不但使用迭代器协议,让for循环变得更加通用。大部份内置函数,也是使用迭代器协议访问对象的。例如, sum函数是Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议,因此,咱们能够直接这样计算一系列值的和
print(sum([1,2,3])) print(sum(range(1,4))) print(sum(x ** 2 for x in range(4))) print(sum([x ** 2 for x in range(4)]))
预习答案和思惟导图明天更新...