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#很不同。

  • 相关阅读:
    JavaScript 正则表达式上——基本语法
    温故知新 javascript 正则表达式
    Js把IE COM数组列表转换成数组
    Linux用户和用户组管理总结
    Linux FTP 服务器配置简单说明
    Linux中Samba详细安装
    js本地存储解决方案(localStorage与userData)
    通过了解渲染过程来提高页面性能
    使用Chrome DevTools的Timeline和Profiles提高Web应用程序的性能
    内存泄漏,循环引用
  • 原文地址:https://www.cnblogs.com/h82258652/p/4001078.html
Copyright © 2011-2022 走看看