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

  • 相关阅读:
    java applet传参和接收
    如何开启to 日志
    Linux重启网卡的方法
    java下载远程文件到本地
    下载文件使用缓存(一次性读取到内存),优化性能(注意静态对象修改需要加锁)
    浏览器地址传中文解决方法 URLEncoder.encode(str,"编码") new URLDecoder().decode(str,"编码")
    根据端口号(http和https的)跳转到不同的工程
    删除某个文件夹下的所有文件(或一类执行文件)
    http和https访问jsp传送中文参数
    根据取模选择不同的列表
  • 原文地址:https://www.cnblogs.com/renvip/p/11191167.html
Copyright © 2011-2022 走看看