天天看点

python函数:迭代器和生成器python函数:迭代器和生成器

迭代器和生成器是函数中的一大重点,务必掌握,何为迭代?何为迭代器?

预习:

处理文件,用户指定要查找的文件和内容,将文件中包含要查找内容的每一行都输出到屏幕(使用生成器)

一、迭代器

<code>for</code> <code>i in 50:</code>

<code>    </code><code>print(i)</code>

<code>#运行结果:</code>

<code># Traceback (most recent call last):</code>

<code>#   File "G:/python/python代码/八月/day2 迭代器生成器/3迭代器.py", line 8, in &lt;module&gt;</code>

<code>#     for i in 50:</code>

<code># TypeError: 'int' object is not iterable</code>

报错:

TypeError: 'int' object is not iterable

类型报错:'int'对象是不可迭代的    何为迭代?

iterable:可迭代的;迭代的;

可迭代的:从上面代码可以简单分析出能被for循环取值的就是可迭代,那么我们就可以初步总结出可迭代的类型:str、list、tuple、set、dict

可迭代的 ——对应的标志 拥有__iter__方法

可迭代协议

可以被迭代要满足的要求就叫做可迭代协议。可迭代协议的定义非常简单,就是内部实现了__iter__方法。

二、迭代器

__iter__方法作用:

 迭代器

iterator:迭代器;迭代程序

迭代器协议:必须拥有__iter__方法和__next__方法

通过iter(x)得到的结果就是一个迭代器,

x是一个可迭代的对象

在for循环中,就是在内部调用了__next__方法才能取到一个一个的值。

__next__的精髓:

 __next__方法的使用精髓

如果我们一直取next取到迭代器里已经没有元素了,就会报错(抛出一个异常StopIteration),告诉我们,列表中已经没有有效的元素了。这个时候,我们就要使用异常处理机制来把这个异常处理掉。try_except异常处理机制只做了解,不是本章重点,会面会详细讲解。

判断是否可迭代和迭代器的简洁方法:

 判断可迭代和迭代器

不管是一个迭代器还是一个可迭代对象,都可以使用for循环遍历

迭代器出现的原因 帮你节省内存

三、生成器

迭代器大部分都是在python的内部去使用的,我们直接拿来用就行了

我们自己写的能实现迭代器功能的东西就叫生成器。

1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行

2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

生成器Generator:

本质:迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现)

特点:惰性运算,开发者自定义

 生成器函数

生成器的好处:不会一下子在内存中生成太多数据

其它应用:

 生成器监听文件输入的例子

 计算移动平均值简单

 计算移动平均值升级_生成器激活装饰器

 yield from

四、列表推导式和生成器表达式

 列表推导式和生成器表达式

使用生成器的优点:

1、延迟计算,一次返回一个结果。也就是说,它不会一次生成所有的结果,这对于大数据量处理,将会非常有用。

2、提高代码可读性

<code>#列表解析</code>

<code>sum([i </code><code>for</code> <code>i in range(100000000)])#内存占用大,机器容易卡死</code>

<code>#生成器表达式</code>

<code> </code> 

<code> </code><code>sum(i </code><code>for</code> <code>i in range(100000000))#几乎不占内存</code>

总结:

1、把列表解析的[]换成()得到的就是生成器表达式

2、列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存

3、Python不但使用迭代器协议,让for循环变得更加通用。大部分内置函数,也是使用迭代器协议访问对象的。例如, sum函数是Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议,所以,我们可以直接这样计算一系列值的和

<code>print(sum([1,2,3]))</code>

<code>print(sum(range(1,4)))</code>

<code>print(sum(x ** 2 </code><code>for</code> <code>x in range(4)))</code>

<code>print(sum([x ** 2 </code><code>for</code> <code>x in range(4)]))</code>

预习答案和思维导图明天更新...

本文转自 杰思 51CTO博客,原文链接:http://blog.51cto.com/12700807/1953221