第48讲:魔方方法——迭代器

一 迭代器的相关概念

  • 迭代:每一次重复的过程被称作一次迭代,每一次迭代得到的结果,将会作为下一次迭代的初始值。
  • 迭代器:提供迭代方法的容器。我们通常接触的迭代器有列表、元组、字符串和字典,他们都支持迭代操作。
  • 举例:
  • 1 >>> for i in "FishC":
    2 ...     print(i)
    3 ...
    4 F
    5 i
    6 s
    7 h
    8 C

    例子中字符串就是一个容器,同时也是一个迭代器;for语句的作用就是触发这个迭代器的迭代功能,每次从容器里面一次拿出一个数据就是迭代操作。

  • 内置函数:
    • iter()
      • 功能:用来生成迭代器。
      • 语法:iter(object[, sentinel])
      • 参数:
        • bject -- 支持迭代的集合对象。
        • sentinel -- 如果传递了第二个参数,则参数 object 必须是一个可调用的对象(如,函数),此时,iter 创建了一个迭代器对象,每次调用这个迭代器对象的__next__()方法时,都会调用 object。
      • 返回值:迭代器对象。
    • next()
      • 功能:next() 返回迭代器的下一个项目,下一个项目不存在会抛出StopIteration的异常。next() 函数要和生成迭代器的iter() 函数一起使用。
      • 语法:next(iterable[, default])

      •  

        参数说明:
        • iterable -- 可迭代对象
        • default -- 可选,用于设置在没有下一个元素时返回该默认值,如果不设置,又没有下一个元素则会触发 StopIteration 异常。
      • 返回值:返回对象帮助信息。
    • 举例:
    •  1 >>> next(it)
       2 Traceback (most recent call last):
       3   File "<stdin>", line 1, in <module>
       4 StopIteration
       5 >>> string = "FishC"
       6 >>> it = iter(string)
       7 >>> next(it)
       8 'F'
       9 >>> while True:
      10 ...     try:
      11 ...             each = next(it)
      12 ...     except StopIteration:
      13 ...             break
      14 ...     print(each)
      15 ...
      16 i
      17 s
      18 h
      19 C
      20 >>>
  • 对应的魔法方法:
    • __iter__()
    • __next__()
    • 举例:
    •  1 >>> class Fibs:
       2 ...     def __init__(self):
       3 ...             self.a = 0
       4 ...             self.b = 1
       5 ...     def __iter__(self):
       6 ...             return self
       7 ...     def __next__(self):
       8 ...             self.a,self.b = self.b,self.a + self.b
       9 ...             return self.a
      10 ...
      11 >>> fibs = Fibs()
      12 >>> for each in fibs:
      13 ...     if each < 20:
      14 ...             print(each)
      15 ...     else:
      16 ...             break
      17 ...
      18 1
      19 1
      20 2
      21 3
      22 5
      23 8
      24 13
    • 可以手动控制输出的斐波那契数列范围的代码:
    •  1 >>> class Fibs:
       2 ...     def __init__(self,n = 10):
       3 ...             self.a = 0
       4 ...             self.b = 1
       5 ...             self.n = n
       6 ...     def __iter__(self):
       7 ...             return self
       8 ...     def __next__(self):
       9 ...             self.a,self.b = self.b,self.a+self.b
      10 ...             if self.a > self.n:
      11 ...                     raise StopIteration
      12 ...             return self.a
      13 ...
      14 >>> fibs = Fibs()
      15 >>> for each in fibs:
      16 ...     print(each)
      17 ...
      18 1
      19 1
      20 2
      21 3
      22 5
      23 8
      24 >>> fibs = Fibs(100)
      25 >>> for each in fibs:
      26 ...     print(each)
      27 ...
      28 1
      29 1
      30 2
      31 3
      32 5
      33 8
      34 13
      35 21
      36 34
      37 55
      38 89
      39 >>>

 

posted @ 2020-09-24 00:01  洛兰123  阅读(226)  评论(0编辑  收藏  举报