zoukankan      html  css  js  c++  java
  • 关于可迭代对象、迭代器和生成器

    可迭代:在Python中如果一个对象有__iter__( )方法或__getitem__( )方法,则称这个对象是可迭代的(Iterable);其中__iter__( )方法的作用是让对象可以用for ... in循环遍历,__getitem__( )方法是让对象可以通过“实例名[index]”的方式访问实例中的元素。换句话说,两个条件只要满足一条,就可以说对象是可迭代的。显然列表List、元组Tuple、字典Dictionary、字符串String等数据类型都是可迭代的。当然因为Python的“鸭子类型”,我们自定义的类中只要实现了__iter__( )方法或__getitem__( )方法,也是可迭代的。

    迭代器:在Python中如果一个对象有__iter__( )方法和__next__( )方法,则称这个对象是迭代器(Iterator);其中__iter__( )方法是让对象可以用for ... in循环遍历,__next__( )方法是让对象可以通过next(实例名)访问下一个元素。注意:这两个方法必须同时具备,才能称之为迭代器。列表List、元组Tuple、字典Dictionary、字符串String等数据类型虽然是可迭代的,但都不是迭代器,因为他们都没有next( )方法。

    上图通过isinstance( )函数分别判断列表、元组、字典、字符串是不是可迭代或迭代器。通过对定义的分析和比较我们得知:迭代器都是可迭代的,但可迭代的不一定是迭代器;可用for ... in循环的都是可迭代的,可用next( )遍历的才是迭代器;next( )是单向的,一次只获取一个元素,获取到最后一个元素后停止;在可迭代的对象中提前存储了所有的元素,而迭代器是惰性的,只有迭代到了某个元素,该元素才会生成,迭代之前元素可以是不存在的,迭代之后元素也可以被销毁,因此迭代器在处理大量数据甚至无限数据时具有加载数据快、占用内存小等优势。

    生成迭代器的几种方式

    1.类中实现__iter__( )方法和__next__( )方法,归功于Python的鸭子类型,我们只要在自定义的类中实现了这两个方法,这个类的实例对象就是迭代器,不仅可以用for ... in循环,也可以用next( )遍历。在__next__( )方法中必须对迭代进行检查,超出范围则触发 StopIteration 异常。

    2.iter( )函数,Python中的iter( object[, sentinel])函数可用来返回一个迭代器对象,iter( )函数只传入一个参数时,参数必须为可迭代对象;当使用第二个参数sentinel(哨兵)时,第一个参数必须是一个可调用对象。

    生成器(Generator)是创建迭代器的简单而强大的工具

    Python中提供的生成器:

    1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行

    2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

    I can feel you forgetting me。。 有一种默契叫做我不理你,你就不理我

  • 相关阅读:
    Android Html处理器通用类 HtmlUtil
    Android 文件管理器通用类 FileUtil
    Android 本应用数据清除管理器DataCleanManager
    获取索引--------用range()和len()
    循环结构中-------简单的部分放在上面, 条理会更清晰~~~ != 不等于
    列表 ->join---> 字符串 转类型:x--->y类型 y(x)
    迭代 判断数字 累加器
    print in或者not in, 判断在不在里面
    n=n+1 放在print(s)的上面的影响 (2) n=n=+1在前面,则不满足前面<100条件时候,才跳出while的循环,这时候while循环结束, 到了外面的下一步-->print()
    n=n+1 放在print(s)的前/后的影响
  • 原文地址:https://www.cnblogs.com/weidaijie/p/10517173.html
Copyright © 2011-2022 走看看