zoukankan      html  css  js  c++  java
  • 迭代器和生成器

    一、迭代器

    1、什么是迭代器?

      迭代器是访问对象元素的一种工具。主要是通过迭代的当时来访问对象里元素,通常是从第一个元素开始访问直至最后一个元素访问结束,每次访问时都是基于前一个元素的结果。

    2、可迭代对象和迭代器

      1)可以被for循环的对象都是可迭代对象,这些对象内部都有__iter__方法(__iter__方法用于返回一个迭代器)

      2)迭代器不仅有__iter__方法们还有next()方法(用于调用迭代器,返回迭代器的下一个元素)

      3)迭代器一定是可迭代对象,可迭代对象不一定是迭代器。(list,dict,str都是可迭代对象,但不是迭代器,因为他们没有next()方法,不能自动访问自身。需要用for循环的next()方法来遍历自身)

      总结: 一个实现了__iter__方法的对象是可迭代的,一个实现next方法的可迭代对象是迭代器。

    3、判断迭代器和可迭代对象

    from collections import Iterable,Iterator
    
    #判断是否是可迭代对象
    print(isinstance([],Iterable))                               #True
    print(isinstance({},Iterable))                               #True
    print(isinstance((),Iterable))                               #True
    print(isinstance("aaa",Iterable))                           #True
    print(isinstance((x for x in range(10)),Iterable))          #True
    
    #判断是否是迭代器
    print(isinstance([],Iterator))                               #False
    print(isinstance({},Iterator))                               #False
    print(isinstance((),Iterator))                               #False
    print(isinstance("aaa",Iterator))                           #False
    print(isinstance((x for x in range(10)),Iterator))          #True

    4、自定义迭代器

    #! /usr/bin/env python
    # -*- coding: utf-8 -*-
    from collections import Iterable,Iterator
    
    
    class MyRange(object):
        def __init__(self, n):
            self.idx = 0
            self.n = n
    
        def __iter__(self):
            return self
    
        def next(self):
            if self.idx < self.n:
                val = self.idx
                self.idx += 1
                return self.n[val]
            else:
                raise StopIteration()
    
    
    l = [4,5,6,7,8]
    obj = MyRange(l)
    print obj.next()      # 4
    print obj.next()      # 5
    print obj.next()      # 6
    print(isinstance(obj,Iterator))     #True

    迭代器优点:

        1.提供了一种通用不依赖索引的迭代取值方式

        2.同一时刻在内存中只存在一个值,更节省内存

    迭代器缺点:

        1.取值不如按照索引的方式灵活,不能取指定的某一个值,只能往后取,不能往前去

        2.无法预测迭代器的长度

    二、生成器

    1、什么是生成器

      生成器是一种特殊的迭代器,一般表现为一边循环,一边计算。

      当函数内包含yield关键字,调用函数不会执行函数体代码,会得到一个返回值,该返回值就是生成器对象

    2、yield函数

      1)只能在函数内使用

      2)yield提供了一种自定义迭代器的解决方案

      3)yield可以保存函数的暂停的状态

      4)yield对比return:相同点:都可以返回值,值得类型与个数没有限制。

                   不同点:yield可以返回多次值,而return只能返回一次值函数就会结束

    3、生成器工作原理

      1)生成器是这样一个函数,它记住上一次返回时在函数体中的位置。

      2)对生成器函数的第二次(或第 n 次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变。

      3)生成器不仅“记住”了它数据状态;生成器还“记住”了它在流控制构造(在命令式编程中,这种构造不只是数据值)中的位置。

      4)生成器是一个函数,而且函数的参数都会保留。

      5)迭代到下一次的调用时,所使用的参数都是第一次所保留下的,即是说,在整个所有函数调用的参数都是第一次所调用时保留的,而不是新创建的

    4、yield生成器运行机制

      1)Python中,yield就是这样的一个生成器。

      2)当你问生成器要一个数时,生成器会执行,直至出现 yield 语句,生成器把yield 的参数给你,之后生成器就不会往下继续运行。

      3)当你问他要下一个数时,他会从上次的状态开始运行,直至出现yield语句,把参数给你,之后停下。如此反复

      4)在python中,当你定义一个函数,使用了yield关键字时,这个函数就是一个生成器

      5)它的执行会和其他普通的函数有很多不同,函数返回的是一个对象,而不是你平常所用return语句那样,能得到结果值。如果想取得值,那得调用next()函数

      6)每当调用一次迭代器的next函数,生成器函数运行到yield之处,返回yield后面的值且在这个地方暂停,所有的状态都会被保持住,直到下次next函数被调用,或者碰到异常循环退出。

    def fib(max_num):
        a,b = 1,1
        while a < max_num:
            yield b
            a,b=b,a+b
    
    g = fib(10)               #生成一个生成器:[1,2, 3, 5, 8, 13]
    print(g.__next__())       #第一次调用返回:1
    print(list(g))            #把剩下元素变成列表:[2, 3, 5, 8, 13]
    生成器斐波那契
    def fib(max_num):
        a,b = 1,1
        while a < max_num:
            yield b
            a,b=b,a+b
    
    g = fib(10)               #生成一个生成器:[1,2, 3, 5, 8, 13]
    print(g.__next__())       #第一次调用返回:1
    print(list(g))            #把剩下元素变成列表:[2, 3, 5, 8, 13]
     
     
     
  • 相关阅读:
    【crontab】误删crontab及其恢复
    New Concept English there (7)
    New Concept English there (6)
    New Concept English there (5)
    New Concept English there (4)
    New Concept English there (3)
    New Concept English there (2)Typing speed exercise
    New Concept English there (1)Typing speed exercise
    New Concept English Two 34 game over
    New Concept English Two 33 94
  • 原文地址:https://www.cnblogs.com/qx1996liu/p/14013041.html
Copyright © 2011-2022 走看看