• python基础之迭代器协议和生成器(二)


    一、什么是迭代器:

     迭代是Python最强大的功能之一,是访问集合元素的一种方式。

      迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。

      迭代器是一个可以记住遍历的位置的对象。

      迭代器的特点:只能往前不会后退。

      迭代器有两个基本的方法:__iter__ 和 __next__或者iter()和next()。

        1、iter方法:返回迭代器对象本身

        2、next方法:返回迭代器的下一个元素

      可迭代的:只要对象本身有__iter__方法,那它就是可迭代的。

      字符串,列表或元组对象都可用于创建迭代器:

    list = [1,2,3,4] #list列表
    r = iter(list)用iter方法将list转成迭代器赋值给r
    print(next(r)) #用next方法使用迭代器r,并输出结果
    print(next(r)) #因为迭代器是一次性的,so,要想看下面的内容,
                           # 还得用next方法使用迭代器r,并输出结果  
    ----------------以下是输出结果--------------------

    >>> print(next(r))
    1
    >>> print(next(r))
    2
    >>> print(next(r))
    3
    >>> print(next(r))
    4
    >>>

    二、迭代器的优点:

    1、迭代器提供了一种不依赖于索引的取值方式,这样就可以遍历那些没有索引的可迭代对象了(字典,集合,文件);

    2、迭代器与列表比较,迭代器是惰性计算的,更节省内存。

    三、迭代器的缺点:

    1、无法获取迭代器的长度,使用不如列表索引取值灵活;

    2、一次性的,只能往后取值,不能倒着取值。就像象棋里卒一样不能倒着走。

    用代码展示如下:

    下面来用代码展示一下吧:
    >>> d={"a":1,"b":2,"c":3}  #定义了一个字典
    >>> r = iter(d)  #用iter方法将字典转成了一个迭代器并赋值给r
    >>> while True:  #定义了一个死循环
    ...     print(next(r))  #用next调用迭代器r
    ...
    a    #一直循环next的话,超出了元素的个数的时候就会报错
    b 
    c

    Traceback (most recent call last):
    File "<stdin>", line 2, in <module>
    StopIteration #报错的内容

    正确的代码如下:

    while循环
    d = {"a":1,"b":2,"c":3} r = iter(d) while True: #加上try之后,它会自己判断,超出后会自动break try: print(next(r)) except StopIteration: break
    ----------输出内容-------------

    a
    b
    c

    d = {"a":1,"b":2,"c":3}
    for i in d:     #for循环,遍历字典的中的每一个元素
        print(i)
    ----------输出-----------
    a
    b
    c

    总结:不难看出for的作用是遍历迭代器——对一个迭代器(实现了 __next__)或者可迭代对象(实现了 __iter__)。 

    查看可迭代对象与迭代器对象:

    #查看是否是可迭代对象(True为是,False为否)
    print(isinstance(s,Iterable))   #------>True
    print(isinstance(l,Iterable))   #------>True
    print(isinstance(t,Iterable))   #------>True
    print(isinstance(d,Iterable))   #------>True
    print(isinstance(set1,Iterable))    #------>True
    print(isinstance(f,Iterable))   #------>True
    
    #查看是否是迭代器
    f.__next__()
    print(isinstance(s,Iterator))   #--------->False  #字符串
    print(isinstance(l,Iterator))   #--------->False  #列表
    print(isinstance(t,Iterator))   #--------->False  #元组
    print(isinstance(d,Iterator))   #--------->False  #字典
    print(isinstance(set1,Iterator))    #--------->False  #集合
    print(isinstance(f,Iterator))   #--------->True  #文件

    四、生成器

    定义:

        在 Python 中,使用了 yield 的函数被称为生成器(generator)。

        跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

        在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回yield的值。并在下一次执行 next()方法时从当前位置继续运行。

      下面用实例使用 yield 实现斐波那契数列:

    def fibonacci(n):   #生成器函数-斐波那契数列
        a,b,counter = 0,1,0
        while True:
            if (counter > n):
                return
            yield a
            a,b=b,a+b
            counter += 1
    f = fibonacci(10)   # f 是一个迭代器,由生成器返回生成
    
    while True:
        try:
            print(next(f),end=" ")
        except StopIteration:
            break

    生成器与return有何区别?

      return只能返回一次函数就彻底结束了,而yield能返回多次值。

      函数在暂停以及继续下一次运行时的状态是由yield保存

      return作用:

      在一个生成器中,如果没有return,则默认执行到函数完毕;

      如果遇到return,在执行过程中 return,则直接抛出 StopIteration 终止迭代。

      

  • 相关阅读:
    24点游戏 程序(一)
    24点游戏全解-1362组
    Android版 hanoi 汉诺塔 源码
    24点游戏 程序(二)
    Javascript 面向对象编程
    新浪微博 OAuth2 NodeJs发微博
    AT5800 [AGC043C] Giant Graph 题解
    CF1033D Divisors 题解
    CF1033E Hidden Bipartite Graph 题解
    AT???? [ABC255D] String Cards 题解
  • 原文地址:https://www.cnblogs.com/bingabcd/p/6694993.html
Copyright © 2020-2023  润新知