zoukankan      html  css  js  c++  java
  • Python学习-40.Python中的迭代

    在上一篇中,我们使用了生成器来创建了一个可遍历的对象。在其中,我们使用了yield关键字。

    Python我也正在学习中,因此对yield的本质我并不熟悉,但是,在C#中,yield关键字则是语法糖,其内部维护着一个迭代状态(对于C#里的Array,这是当前遍历的元素下标)。

    那么,在Python中,是否也是一种语法糖了?首先,我们知道,生成器产生的是一个对象,并且这个对象能够被遍历,参考C#,在C#中可foreach的对象都有GetEnumerator方法。那么,Python中很有可以也是具备某些方法而使得该对象可以被遍历。

    联想,整理:

    对象——class

    方法——很可能是像构造函数(__init__)具备下划线的保留方法。

    根据《深入Python3》,果然如此。

    码上代码:

     1 class Fib:
     2     def __init__(self,max):
     3         self.max = max
     4     def __iter__(self):
     5         self.n = 0
     6         self.a = 0
     7         self.b = 1
     8         return self
     9     def __next__(self):
    10         if self.n >= self.max:
    11             raise StopIteration
    12         fib = self.b
    13         self.a,self.b = self.b,self.a + self.b
    14         self.n+=1
    15         return fib
    16          
    17 for i in Fib(10):
    18     print(i)

    效果与上一篇是一样的,可见yield也是一个语法糖,它帮我们偷偷实现了__iter__和__next__两个方法。

    那么现在我们可以得到结论就是,在遍历开始的时候,会调用对象的__iter__方法(当然没有就报错了),该方法负责初始化遍历所需的参数,接着在遍历的时候,则调用的是__next__方法,方法的返回值作为该次遍历的值。而如果遍历结束,则抛出一个StopIteration的错误,for会处理这个错误从而结束遍历。以抛出错误的方式结束遍历,这一点与C#很不同。

  • 相关阅读:
    42.旋转数组的最小元素[Get min value of rotated array]
    洛谷 P3496 [POI2010]GIL-Guilds
    洛谷 P2777 [AHOI2016初中组]自行车比赛
    洛谷 P3184 [USACO16DEC]Counting Haybales数草垛
    洛谷 P2563 [AHOI2001]质数和分解
    洛谷 P2997 [USACO10NOV]旗帜Banner
    洛谷 P2959 [USACO09OCT]悠闲漫步The Leisurely Stroll
    洛谷 P2965 [USACO09NOV]农活比赛The Grand Farm-off
    洛谷 P2548 [AHOI2004]智能探险车
    洛谷 P1041 传染病控制
  • 原文地址:https://www.cnblogs.com/h82258652/p/4001078.html
Copyright © 2011-2022 走看看