吾八哥博客

您现在的位置是:首页 > 码农手记 > Python > 正文

Python

吾八哥学Python(十六):Python里的迭代器与生成器

吾八哥2017-08-01Python3492

Python里

迭代器

上一次输出的结果为下一次输入的初始值,重复的过程称为迭代。迭代是Python最强大的功能之一,是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器有两个基本的方法:iter() 和 next()。内置__iter__方法的,都是可迭代的对象,例如:字符串,列表或元组对象还有集合都可用于创建迭代器。请看如下例子:

import sys

list = [1,2,3,4,5,6]
it1 = iter(list)
print("next(it):",next(it1))
print("for循环读取:")
for x in it1:
    print(x)

print("while循环通过next()读取:")
it2 = iter(list)
while True:
    try:
        print(next(it2))
    except StopIteration:
        sys.exit()

以上代码运行结果为:

next(it): 1
for循环读取:
2
3
4
5
6
while循环通过next()读取:
1
2
3
4
5
6

我们需要注意的是:

  1. 如果容器中没有更多元素了,则抛出StopIteration异常

  2. 迭代器只能往前不会后退。

迭代器的优点和缺点:

优点:

1.提供了一种不依赖下标的迭代方式

2.就跌迭代器本身来说,更节省内存

缺点:

1. 无法获取迭代器对象的长度

2. 不如序列类型取值灵活,是一次性的,只能往后取值,不能往前退

生成器

使用了yield的函数被称为生成器,生成器是一个特殊的迭代器,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

yield的功能:

1.相当于为函数封装好__iter__和__next__

2.return只能返回一次值,函数就终止了,而yield能返回多次值,每次返回都会将函数暂停,下一次next会从上一次暂停的位置继续执行

使用例子如下:

def doTest(len):
    print("begin...")
    i = 0
    while i < len:
        yield i
        print("yield:", i)
        i+=1
    print("end...")

x = doTest(5)
print(next(x))
print(next(x))
print(next(x))

上面代码输出结果为:

begin...
0
yield: 0
1
yield: 1
2

在Pythton的协程里会用到yield的,yield可以一定程度上实现协程。

本文首发学Python网:http://www.xuepython.wang