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

    一、迭代器

    1、什么是迭代器协议

    1、迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个Stopiteration异常,以终止迭代。(只能往后走不能往前退)

    2、可迭代对象:实现了迭代器协议的对象。(如何实现:对象内部定义了一个__iter__()方法)

    3、协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象。

    2、迭代器与可迭代对象

    1、迭代器:可以被next()函数调用并不断返回下一个值的对象称为迭代器。

    2、可迭代对象:可以直接作用于for循环的对象。

    3、for循环

    for循环的本质:循环所有的对象,全部都是使用迭代器协议。

    for循环的实现:

    L = [1,2,3,4,5]
    L = L.__iter__()    #使用内部方法__iter__()将其变为可迭代对象
    print(L.__next__())    #使用可迭代对象提供的方法__next__()循环取值        
    print(L.__next__())
    print(L.__next__())
    print(L.__next__())
    print(L.__next__())    
    View Code

    可迭代对象会抛出StopIteration,为了解决这一问题,加入异常处理,模拟真实的for循环机制

    L = [1,2,3,4,5]
    L = L.__iter__()
    try:
        while True:
            print(L.__next__())
    except StopIteration:
        pass
    View Code

    4、for循环的重要性

    例如:list对象

    L = [1,2,3,4,5]
    index = 0
    while index < len(L):
        print(L[index])
        index += 1
    View Code

    象list这样的数据,都是有下标的,也就是可以通过索引获取值,但是想dict,set这样的数据就不行。

    所有通过for可以实现所有的可迭代对象,也就是for提供了一个可迭代对象的通用方法。

    二、生成器

    1、什么使生成器

    可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他数据类型需要调用自己内置的__iter__()方法),所有生成器就是可迭代对象。

    2、生成器分类

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

    2、生成器表达式:类似列表推导,但是,生成器返回的是一个生成器对象

    3、生成器表达式与列表解析

    1、三元表达式

    name = "lilon"
    L = "True" if name == "lilong"  else "lizhi"
    print(L)

    2、列表生成式

    L = [i for i in range(10)]
    print(L)

    3、生成器表达式(注意括号的区别以及返回值)

    L = (i for i in range(10))
    print(L)
    print(L.__next__())

    4、生成器表达式的运用

    利用sum()函数计算和

    1、列表式:

    x = sum( [i for i in range(10)] )
    print(x)

    2、生成器式:(省略了一个括号)

    x = sum( i for i in range(10) )
    print(x)

     4、生成器函数

    def test():
        print("返回0")
        yield 0
        print("返回1")
        yield 1
        print("返回2")
        yield 2
    
    v = test()
    print(v)
    print(v.__next__())
    print(v.__next__())
    print(v.__next__())

    遇见一个yield,函数会保存状态,以便下次从yield开始执行。

  • 相关阅读:
    解决WordPress不能发邮件,WordPress 无法发送邮件
    WordPress 显示 Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2097160 bytes)解决办法
    怎么优雅的取消重复请求ajax
    手拉手搭建一个脚手架
    数据库隔离级别RC与RR区别——MVCC、ReadView
    整理一下下一步的计划
    减肥
    EBS: Shift + F6: 当复制上行记录
    Oracle 表值函数之多表关联使用
    EBS: 序号授权 GRANT
  • 原文地址:https://www.cnblogs.com/lilong74/p/11333920.html
Copyright © 2011-2022 走看看