zoukankan      html  css  js  c++  java
  • Python第十二课(迭代器/生成器)

    Python第十二课(迭代器/生成器)    >>>转到思维导图>>>转到中二青年

    1.迭代

    1.1什么是迭代:

    更新换代(重复)的过程,每次迭代都必须基于上一次的结果

    1.2什么是迭代器:

    迭代取值的工具

    1.3为什么要有迭代器:

    迭代器提供了一种不依赖于索引取值的方式
    对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器

    1.4什么是可迭代对象:

    可迭代对象指的是内置有__iter__方法的对象,即obj.__iter__

    1.5什么是迭代器对象:

    可迭代对象执行obj.__iter__()得到的结果就是迭代器对象。而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象。

    1.6注意:

    迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象

    需要迭代取值的数据类型:字符串str、列表list、元组tuple、字典dict、集合set、文件对象

    文件对象执行内置的__iter__之后还是本身 没有任何变化,文件对象本身就是迭代器对象

    针对双下线开头双下划线结尾的方法,推荐读:双下+方法名

    2.迭代器取值:

    迭代器取值 调用__next__

    迭代器对象无论执行多少次__iter__方法得到的还是迭代器对象本身

    2.1异常报错StopIteration:取完了

    2.2异常处理:

    while True: 
        try: 
            print(iter_d.__next__()) 
        except StopIteration: 
            print('老母猪生不动了')
        break

    2.3迭代器取值的特点:只能往后依次取,不能后退

    2.4迭代器取值的优点:

        1.不依赖于索引取值

        2.内存中永远只占一份空间,不会导致内存溢出

    2.5迭代器取值的缺点:

        1.不能够获取指定的元素

        2.取完之后会报StopIteration错

    3.for循环的本质

        1.将in后面的对象调用__iter__转换成迭代器对象

        2.调用__next__迭代取值

        3.内部有异常捕获StopIteration,当__next__报这个错 自动结束循环

    4.生成器

    只要函数内部包含有yield关键字,那么函数名()的到的结果就是生成器,并且不会执行函数内部代码

    生成器就是迭代器,可以用__next__方法取值

    yield后面跟的值就是调用迭代器__next__方法你能得到的值

    yield既可以返回一个值也可以返回多个值,并且多个值也是按照元组的形式返回

    可以用.send给yield左边的变量传参,但必须先将代码运行至yield才能为期传值

    yeild

        1.帮你提供了一种自定义生成器方式

        2.会帮你将函数的运行状态暂停住

        3.可以返回值

    yeid与return异同:

        相同点:都可以返回值,并且都可以返回多个

        不同点:yield可以返回多次值,而return只能返回一次函数立即结束,yield还可以接受外部传入的值

    5.生成器表达式

    例如:res = (i for i in range(1,10) if i != 4)

    一道面试题

    def add(n,i):
        return n+i
    def test():
        for i in range(4):
            yield i
    g=test()
     
    for n in [1,10]:
        g=(add(n,i) for i in g)
        # 第一次for循环g=(add(n,i) for i in test())
     
        # 第二次for循环g=(add(n,i) for i in (add(n,i) for i in test()))
    print(n)
    res=list(g)
     
    """
    for i in (add(10,i) for i in test()):  会执行所有的生成器内部的代码
        add(n,i)
    """
     
    #A. res=[10,11,12,13]
    #B. res=[11,12,13,14]
    #C. res=[20,21,22,23]  答案
    #D. res=[21,22,23,24]
    View Code

    6.常用内置方法

    abs()取绝对值。
    all()传入一个可迭代对象只要对象中一个元素为False就返回False
    any()传入一个可迭代对象只要对象中一个元素为True就返回True
    bin()十进制转二进制 返回一个整数 int的二进制表示。
    oct()十进制转八进制 返回一个整数 int的二进制表示。
    hex()十进制转16进制 返回一个整数 int的二进制表示。
    int()用于将一个字符串或数字转换为整型,如果传入两个参数,第一个是要转的进制数,第二个是表示当前数是多少进制,最终将进制数转为十进制数。
    bool()将给定参数转换为布尔类型,如果没有参数,返回 False
    callable()用于检查一个对象是否是可调用的。
    char()将数字转换成ascii码表对应的字符。
    unichr() 函数 和 chr()函数功能基本一样, 只不过是返回 unicode 的字符。
    ord()将字符按照ascii表转成对应的数字。
    dict()用于创建一个字典。
    dir()获取当前对象名称空间里面的名字。
    divmod() 函数把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b)
    enumerate()函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
    eval()用来执行一个字符串表达式,并返回表达式的值。
    exec()执行储存在字符串或文件中的 Python 语句,相比于 eval,exec可以执行更复杂的 Python 代码。其返回值为none
    format()格式化输出
    globals()会以字典类型返回当前位置的全部全局变量。
    locals()会以字典类型返回当前位置的全部局部变量。
    help()查看函数注释说明
    isinstance()用来判断一个对象是否是一个已知的类型,类似 type()。
    next() 返回迭代器的下一个项目。
    open() 函数用于打开一个文件,创建一个 file 对象,相关的方法才可以调用它进行读写。
    pow() 方法返回 x^y(x的y次方) 的值。
    reverse() 函数用于反向列表中元素。
    round() 方法返回浮点数x的四舍五入值。
    View Code

    END

  • 相关阅读:
    BNUOJ 12756 Social Holidaying(二分匹配)
    HDU 1114 Piggy-Bank(完全背包)
    HDU 2844 Coins (多重背包)
    HDU 2602 Bone Collector(01背包)
    HDU 1171 Big Event in HDU(01背包)
    HDU 2571 命运 (入门dp)
    HDU 1069 Monkey and Banana(最长递减子序列)
    HDU 1160 FatMouse's Speed (最长上升子序列)
    HDU 2594 KMP
    POJ 3783 Balls --扔鸡蛋问题 经典DP
  • 原文地址:https://www.cnblogs.com/renvip/p/11191167.html
Copyright © 2011-2022 走看看