迭代:迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程(函数)的重复称为一次“迭代”,而每一次迭代得到的结果(函数return)会作为下一次迭代的初始值(传入函数的参数)。
例如 斐波那契数列:
0 1 1 2 3 5 8 13 23………
F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N)
备注:
实例1 自定义迭代器类
class MyNumbers: # 因为MyNumbers类中含有__iter__()和__next__()函数,所以MyNumbers是一个迭代器 def __iter__(self): # 返回一个迭代器对象 self.a = 1 return self def __next__(self): # 返回下一个数据 if self.a <= 5: x = self.a self.a += 1 return x else: raise StopIteration # 异常用于标识迭代的完成,防止出现无限循环的情况,在 __next__()方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。 myclass = MyNumbers() # myclass为迭代器对象 for x in myclass: # 迭代器对象可使用for循环 print(x) >>> 1 2 3 4 5
实例2 字符串、列表、元组、字典都可用于创建迭代器。
type | str: ‘abc’ | list: [1,2,3] | int: 1,2,3 | 迭代器: iter([1,2,3]) | 生成器: def g(): yeild 1 | dict: {‘a’:1, ‘b’:2, ‘c’:3} |
---|---|---|---|---|---|---|
可迭代的(Iterable) | True | True | False | True | True | {‘a’:1, ‘b’:2, ‘c’:3} |
迭代器(Iterator) | False | False | False | True | True | Flase |
# 字符串、列表、元组、字典可用于创建迭代器 # my = 'this_is_a_string' # string # my = [1, 2, 3, 4, 5] # listd # my = ('a', 'b', 'c', 'd', 'e') # tuple my = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5} # dictionary it = iter(my) # 创建迭代器对象 print(next(it)) # 输出迭代器的下一个元素 print(next(it)) print(next(it)) print(next(it)) print(next(it)) >>> a b c d e
实例
#!/usr/bin/python3 import sys 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 = fibonacci(10) # f 是一个迭代器,由生成器返回生成 while True: try: print (next(f), end=" ") except StopIteration: sys.exit()
type | str: ‘abc’ | list: [1,2,3] | int: 1,2,3 | 迭代器: iter([1,2,3]) | 生成器: def g(): yeild 1 | dict: {‘a’:1, ‘b’:2, ‘c’:3} |
---|---|---|---|---|---|---|
可迭代的(Iterable) | True | True | False | True | True | {‘a’:1, ‘b’:2, ‘c’:3} |
迭代器(Iterator) | False | False | False | True | True | Flase |
from collections.abc import Iterable from collections.abc import Iterator # my = 'this_is_a_string' # string # my = [1, 2, 3, 4, 5] # listd # my = ('a', 'b', 'c', 'd', 'e') # tuple my = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5} # dictionary it = iter(my) # 创建迭代器对象 def f(): # 生成器函数 yield 1 print(isinstance(it, Iterable)) # 判断是否可迭代 print(isinstance(it, Iterator)) # 判断是否是迭代器 print(isinstance(my, Iterable)) print(isinstance(my, Iterator)) print(isinstance(f(), Iterable)) print(isinstance(f(), Iterator)) print("it具体的方法包括:", dir(it)) print("my具体的方法包括:", dir(my)) print("f()具体的方法包括:", dir(f())) >>> True True True False True True it具体的方法包括: ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__length_hint__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__'] my具体的方法包括: ['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values'] f()具体的方法包括: ['__class__', '__del__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__name__', '__ne__', '__new__', '__next__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'gi_code', 'gi_frame', 'gi_running', 'gi_yieldfrom', 'send', 'throw']