码迷,mamicode.com
首页 > 其他好文 > 详细

迭代器和生成器

时间:2020-04-24 22:03:07      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:code   +=   调用函数   style   单点   fibonacci   运行   python   方法   

迭代器

迭代是Python最强大的功能之一,是访问集合元素的一种方式,是一个可以记住遍历位置的对象。
迭代器(Iterator)对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本的方法:iter() 用于创建迭代器对象, next()用于输出迭代器的下一个元素。

 1 list=[1,2,3,4]
 2 it = iter(list)    # 创建迭代器对象
 3  4 for x in it:
 5     print (x, end=" ")
 6  7 while True:
 8     try:
 9         print (next(it))
10     except StopIteration:
11         sys.exit()

 

把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__() 。
__iter__() 方法返回一个特殊的迭代器对象, __next__() 方法返回下一个迭代器对象,并通过 StopIteration 异常标识迭代的完成。

生成器

在 Python 中,使用了 yield 的函数被称为生成器(Generator),即生成器是一个特殊的函数。
跟普通函数不同的是,生成器的返回值是一个迭代器,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
生成器函数内部一般有循环语句,循环内有yield语句,
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值,
并在下一次执行 next() 方法时从当前位置继续运行,进行下一次循环,
若没有循环,只返回一次,yield则没有意义,直接return一次即可,
生成器可以节省内存空间。

执行过程如下:
调用函数-执行到yield-返回一个迭代器-执行next函数-获取yield返回值-在函数内部从yield下一句开始执行-继续循环;

 1 import sys
 2  
 3 def fibonacci(n): # 生成器函数 - 斐波那契
 4     a, b, counter = 0, 1, 0
 5     while True:
 6         if (counter > n): 
 7             return
 8         yield a
 9         a, b = b, a + b
10         counter += 1
11 f = fibonacci(10) # f 是一个迭代器,由生成器返回生成
12  
13 while True:
14     try:
15         print (next(f), end=" ")
16     except StopIteration:
17         sys.exit()

总结

可以直接作用于 for 循环的对象统称为可迭代对象: Iterable;
可以作用于 next() 函数的对象都是迭代器: Iterator ;
可以使用 isinstance() 判断一个对象是否是 Iterable ;
生成器都是Iterable ,但 list 、 dict 、 str 虽然是 Iterable ,却不是 Iterator ;
可以通过 iter() 函数获得一个 Iterator 对象;

迭代器和生成器

标签:code   +=   调用函数   style   单点   fibonacci   运行   python   方法   

原文地址:https://www.cnblogs.com/zlw-xyz/p/12769984.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!