zoukankan      html  css  js  c++  java
  • python高级特性:迭代器与生成器

    前言

    有一个列表

    l = ['a','b','c','d','e']
    我想取列表中的内容,有几种方式?
    # 1.最简单的方法用for循环。    
    for i in l:
        print(i,end=" ")
    # 2.用列表内置的方法。
    while 1:
        if l:
            print(l.pop(),end=" ")

    这是用常见的方式取出列表中的数据。

    而我们如果遍历数字的话:

    for i in 1234:
      print(i)
    

    # 则会报不可迭代的错误。


    迭代和可迭代协议

    因此,我们知道一种如果能以一种重复执行程序的方式取出数据,那么我们称它为可迭代的。

      常见的可迭代数据类型有哪些?

        list、dict、set、tuple、字符串等。说白了就是我们常用循环取数据的那些数据类型。

      那么我们如何判断一个数据类型是否可迭代呢?
    from collections import Iterable
    print(isinstance(l,Iterable))  # 返回True

    可迭代协议

      所谓协议,就是规则嘛。可迭代协议,说白了就说明可迭代是有一套设计好的规则的。如果我们自己写了一个数据类型,希望它是可迭代的,那么我们必须遵守这规则。

       可迭代协议就是内部实现了__iter__方法

       我们可以用反射来判断:

    if hasattr(l,"iter"):
        print(True)
    

      由此以及我们所学所见可知,想要可迭代,内部有一个__iter__方法,那么__iter__方法搞了什么事情?

    print(l.__iter__())
    <list_iterator object at 0x03BA43B0>

      # 列表_迭代器对象

      

      那么问题来了,什么叫迭代器?可迭代的对象就一定是迭代器吗?

        dir(l.__iter__())是列表迭代器实现的所有方法,那么dir(l)是列表实现的所有方法,此时我们可以用set作差,来看看iter()方法多了什么?

    print(set(dir(l.__iter__()))-set(dir(l)))
    {'__length_hint__', '__next__', '__setstate__'}  # 看来是这三个方法从中作祟。 
    iter_l = l.__iter__()
    print(iter_l.__length_hint__()) # 迭代器的长度
    print('*',iter_l.__setstate__(3)) # 根据索引值指定从哪里开始迭代
    print('**',iter_l.__next__()) # 一个一个的取值
    print('***',iter_l.__next__())

      由此可见,

     
  • 相关阅读:
    JDOJ 1090: 矩阵
    JDOJ 2236: Random Num
    浅谈区间DP
    NOIP 2006 能量项链
    小技巧—处理环形区间
    NOI 1995 石子合并
    洛谷 P5640 【CSGRound2】逐梦者的初心
    JDOJ 1101: 邦德I
    JDOJ 1104: 最佳挑水
    JDOJ 1098: 夏娜的菠萝包
  • 原文地址:https://www.cnblogs.com/pbwzc/p/11123412.html
Copyright © 2011-2022 走看看