Python3的迭代器

迭代(iterate):意味着多次重复,类似循环。

迭代器两个基本方法:

__iter__:返回一个迭代器,包含__next__方法的对象,调用这个方法时可以不提供参数。

__next__:调用该方法时,迭代器应返回其下一个值,如果迭代器没有可供返回的值,就引发StopIteration异常。

迭代器出现的原因:

很多情况下,使用列表有点大材小用。如果你有一个逐个计算值的函数,你可能只想逐个地获取值,而不是一次性获得所有。如果有很多值,或者无穷多的值时,就需要列表足够大。比如斐波拉契数。

 1 # 运用生成器实现斐波那契数列
 2 import sys
 3 
 4 # 要多少数就输入多少n
 5 def fibs(n):
 6     a,b,counter = 0, 1, 0
 7     while True:
 8         if counter > n:
 9             return
10         yield a
11         a, b = b, a+b
12         counter += 1
13 
14 #求1000以内的斐波那契数列
15 f = fibs(10)
16 
17 while True:
18     try:
19         print(next(f), end = " ")
20     except StopIteration:
21         sys.exit()
22 
23 ##########0 1 1 2 3 5 8 13 21 34 55##########
迭代器的对象:
列表、元组、字符串
>>> list1 = [1,2,3]
>>> lis = iter(list1)
>>> print(next(lis))
1
>>> print(next(lis))
2
>>> print(next(lis))
3
>>> print(next(lis))
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    print(next(lis))
StopIteration

>>> str1 = "123"
>>> st = iter(str1)
>>> print(next(st))
1
>>> print(next(st))
2
>>> print(next(st))
3
>>> print(next(st))
Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    print(next(st))
StopIteration
>>> tup1 = (1,2,3)
>>> tu = iter(tup1)
>>> for i in tu:
    print(i)   
1
2
3

 



从迭代器创建序列

除了对迭代器和可迭代对象进行迭代之外,还可将它们转换为序列。
在可使用序列的情况下,大多也可使用迭代器或可迭代对象(诸如索引和切片等操作除外)。
# 使用构造函数 list显式地将迭代器转换为列表
class TestIterator:
    value = 0
    def __next__(self):
        self.value += 1
        if self.value > 10: raise StopIteration
        return self.value

    def __iter__(self):
        return self

ti = TestIterator()
print(list(ti))

输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

posted @ 2018-06-06 00:37  无证骑士  阅读(142)  评论(0编辑  收藏  举报