zoukankan      html  css  js  c++  java
  • day4-迭代器、生成器yield

    一、迭代器

    迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退。另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件

    特点:

    1. 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
    2. 不能随机访问集合中的某个值 ,只能从头到尾依次访问
    3. 访问到一半时不能往回退
    4. 便于循环比较大的数据集合,节省内存

    应用:如 linux 系统中,如果访问比较大的文件,就需要用到cat、tail等命令,因为这些命令就是用迭代方法访问文件,一次只读取一页到内存中,随用随取。相反,如用 vi ,就必须要把文件整个读入内存中后才可以使用。

    迭代器例子:

    1
    2
    3
    4
    5
    6
    7
    # 首先,声明列表时要用到iter函数
    names = iter(["gj","bruce","mj"])
    # 读取时,要用 _next_ 方法
    print(names.__next__())
    print(names.__next__())
    print(names.__next__())
    print(names.__next__()) # 由于迭代器里只有三个值,所以打印第四个的时候会报错


    二、生成器

    定义:一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator);如果函数中包含yield语法,那这个函数就会变成生成器

    生成器例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    def cash_money(amount):
        while amount > 0:
            amount -=100
            yield 100
            print("又来取钱了")
    # 如果不理解可以逐行加断点,看运行方式
    atm = cash_money(300)
    print(atm.__next__())
    print(atm.__next__())
    print("干点别的去")
    print(atm.__next__())
    print(atm.__next__())
    # 100
    又来取钱了
    100
    干点别的去 # 生成器相比较函数,执行过程中可以中断
    100
    又来取钱了
    100
    又来取钱了
    最后一遍的时候会报错,因为amount 不 > 0了,所以 yield 无法返回100了,
    但是会打印yield下一行的“又来取钱了”,因为print(atm._next_())时是
    返回到yield处,先执行玩他下面的命令再接着while循环。





















  • 相关阅读:
    WPF之感触
    C# WinForm 给DataTable中指定位置添加列
    MyEclipse 8.6 download 官方下载地址
    将博客搬至CSDN
    Building Microservices with Spring Cloud
    Building Microservices with Spring Cloud
    Building Microservices with Spring Cloud
    Building Microservices with Spring Cloud
    Building Microservices with Spring Cloud
    Building Microservices with Spring Cloud
  • 原文地址:https://www.cnblogs.com/bruceg/p/5168079.html
Copyright © 2011-2022 走看看