前面介绍了python中的条件判断和循环控制。而在循环控制中,还有一个比较重要的迭代器。迭代也叫遍历,迭代是Python最强大的功能之一,是访问集合元素的一种方式,可遍历一个list、tuple、字符串等。本文就来详情介绍python3中的迭代器和生成器。
迭代器: iterator [ɪtə'reɪtə]
迭代是Python最强大的功能之一,是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。字符串,列表或元组对象都可用于创建迭代器。
iter()函数官方解释:
ter(iterable) -> iterator
iter(callable, sentinel) -> iterator
Get an iterator from an object. In the first form, the argument must
supply its own iterator, or be a sequence.
In the second form, the callable is called until it returns the sentinel.
中文意思是:
python提供了一个iter()函数用来生成迭代器。这个方法有两个参数,当只有一个参数的时候,若这个参数是一个容器,则返回这个容器的迭代器对象,若这个参数本身就是一个迭代器,则返回其自身。
注意:
1.迭代器只能往前不会后退。
2.迭代器是一个可以记住遍历的位置的对象。
3.迭代器有两个基本的方法:iter() 和 next()。
iterator 的特点
迭代器都有一个next()方法,每次调用这个方法而实现计数,当然计数不是通过索引实现,调用了next方法只会: 迭代指针会指向下一个元素的位置。若下一个元素没有了,则会抛出StopIteration异常。
思考:这样做有什么用呢?
试想想在迭代指针还没指到的当前元素时候,已经迭代之后的位置元素,那些元素需要计算么?因为只有迭代到当前位置的元素时候,才开始计算元素的值。在迭代之前可以不存在,在迭代之后可以被销毁。实现的迭代器不需要准备所遍历的所有元素,没错,这就是迭代器的一大魅力: 惰性计算。
通过例子来看下迭代器的生成和next()方法的使用:
# 初始化一个list
my_list = ['1', '2', '3', '4', '5']
iterator = iter(my_list)
print(next(iterator))
print(next(iterator))
for x in iterator:
print( 'x = ' + x)
运行结果:
1
2
x = 3
x = 4
x = 5
通过迭代器遍历list,并通过StopIteration异常来作为是否遍历结束:
# 初始化一个list
my_list = ['1', '2', '3', '4', '5']
# 创建一个迭代器
iterator2 = iter(my_list)
print("通过迭代器开始遍历:")
while True:
try:
print('x2 = ' + next(iterator2))
except StopIteration:
print("通过迭代器遍历完毕!")
exit()
运行结果:
通过迭代器开始遍历:
x2 = 1
x2 = 2
x2 = 3
x2 = 4
x2 = 5
通过迭代器遍历完毕!
对于上面的 it 这个迭代器,是通过 iter()方法实现的,那么iter函数到底做了什么呢?简而言之,实现了迭代器协议的对象,就是迭代器。什么事迭代器协议呢?再简而言之,满足下面两个条件即可:
1.实现了魔法方法 iter(),返回一个迭代对象,这个对象有一个next()方法,
2.实现 next() 方法,返回当前的元素,并指向下一个元素的位置,当前位置已经没有元素的时候,抛出StopIteration异常。
生成器:generator [ˈdʒɛnəˌretɚ]
在 Python 中,使用了 yield 的函数被称为生成器(generator)。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。调用一个生成器函数,返回的是一个迭代器对象。
generator有以下特别:
1. 遵循迭代器(iterator)协议,迭代器协议需要实现__iter__、next接口
2. 能过多次进入、多次返回,能够暂停函数体中代码的执行
补充:
后面紧接着会学习Python中的函数,下面补充内容可以等学完函数再来对比。此处简单区分一下两者的。
generator function产生的generator与普通的function有什么区别呢?
(1)function每次都是从第一行开始运行,而generator从上一次yield开始的地方运行
(2)function调用一次返回一个(一组)值,而generator可以多次返回
(3)function可以被无数次重复调用,而一个generator实例在yield最后一个值 或者return之后就不能继续调用了
例如:
# 生成器函数 - 斐波那契
# 定义一个生成器函数:斐波那契
def fibonacci(n):
a, b, counter = 0, 1, 0
while True:
if (counter > n):
return
yield a
a, b = b, a + b
counter += 1
# f 是一个迭代器,由生成器返回生成
f = fibonacci(10)
while True:
try:
print(next(f), end=" ")
except StopIteration:
exit()
运行结果:
0 1 1 2 3 5 8 13 21 34 55
小结
本文简单介绍了python3中的迭代器和生成器。熟练理解和使用迭代器和生成器可以大大提高开发效率。
更多了解,可关注微信公众号:人人懂编程
![](https://img.haomeiwen.com/i2471034/0dce8137109d82b4.png)
网友评论