zoukankan      html  css  js  c++  java
  • python3迭代器

    一、前提

    1.dir()函数

    dir()函数带参数时,返回参数的属性和方法列表;不带参数时,返回当前范围内变量、方法和定义的类型列表

    # dir(参数):带参数,返回参数的属性和方法
    s = ''
    print(dir(s))
    print(dir([]))

    2.双下法

    双下法:带双下划线的方法。双下很少被直接调用,一般通过其它语法触发效果

    l1 = [2, 1]
    l2 = [1, 2]
    print(l1 + l2)      # l1+l2 -> l1.__add__(l2),通过python解释器转化
    print(l1.__add__(l2)) 

    二、可迭代协议

    1.可迭代协议:只要含有__iter__方法,就是可迭代的

    2.判断

    # 方法1,判断是否含义__iter__方法
    l1 = list(range(10))
    res = '__iter__' in dir(l1)
    if res:
        print('l1,可迭代')
    else:
        print('l1,不可迭代')
    # 方法2,通过导入模块
    from collections import Iterable, Iterator        # from collections import Iterable 被弃用
    
    s = 'Hello, World!'
    res = isinstance(s, Iterable)
    if res:
        print('s,可迭代')
    else:
        print('s,不可迭代')

    三、迭代器协议

    1.迭代器协议:含有__iter__和__next__方法,就是迭代器

    2.获取迭代器

    li = list(range(5))
    iterator = li.__iter__()    # __iter__()方法的返回值,就是迭代器,将可迭代变成迭代器
    print(iterator)

    3.判断

    # 方法1,通过__iter__和__next__方法判断
    li = list(range(-5, 0))
    # li = list(range(-5, 0)).__iter__()    # list不是迭代器,但list.__iter__()是迭代器
    _iter = '__iter__' in dir(li)
    _next = '__next__' in dir(li)
    if _iter and _next:
        print("li,是迭代器")
    else:
        print('li,不是迭代器')
    # 方法2,通过导入模块
    from collections.abc import Iterator
    li = list(range(10))
    if isinstance(li, Iterator):
        print('l1,是迭代器')
    else:
        print('li,不是迭代器')

    4.遍历

    1)__next__

    """
    __next__()方法
    只要迭代器才有__next__()方法
    __next__()方法,从迭代器中一个一个取值
    
    """
    l1 = list(range(10, -5, -1))
    count = 0
    iterator = l1.__iter__()
    while count < 5:
        count += 1
        print(iterator.__next__())      # 输出前五个元素
    print('>>>', iterator.__next__())   # 输出第六个元素

    2)for循环

    """
    for循环1
    对象是可迭代,但不是迭代器
    使用for循环,实质是通过for循环创建一个迭代器
    所以,每次使用for循环都会创建一个新的迭代器
    
    """
    l1 = list(range(10, -5, -1))
    count = 0
    for i in l1():    # l1是可迭代对象,不是迭代器
        count += 1
        print(i)
        if count > 5:
            break
    for i in l1():    # for循环内部创建一个新的迭代器
        print(i)
    """
    for循环2
    对象是迭代器
    使用for循环,不用通过for循环内部另创一个迭代器
    所以,每次使用for循环使用的都是同一个迭代器
    
    """
    l1 = list(range(10, -5, -1))
    count = 0
    iterator = l1.__iter__()
    for i in iterator:    # iterator是迭代器
        count += 1
        print(i)
        if count > 5:
            break
    for i in iterator:    # 重新开始for循环,使用的依然是同一个迭代器
        print(i)

    四、迭代器的优点

    1.从容器类型中取值,不需要索引、key等

    2.降低内存消耗

      原因:迭代器的数据通过for循环或__next__()方法加载到内存,而不是一次加载全部数据

    五、总结

    1.迭代器一定可迭代,可迭代不一定是迭代器

    2.可迭代一定可以使用for循环,可以使用for循环一定可迭代

    3.for循环,通过内部处理:可迭代->迭代器

    4.迭代器:取容器类型的值,不依靠索引、key等

           减低内存的消耗

    5.可迭代,可以通过__iter__()方法变成迭代器

    6.通过判断是否可迭代,来确定是否使用for循环

  • 相关阅读:
    php记录代码执行时间
    java中针对同一变量的不同函数的互斥操作
    Linux下mysql新建账号及权限设置
    Linux下重启apache
    Mysql数据导入
    ubuntu安装phpcurl与phptidy扩展
    Linux服务器间文件传输
    Flash本地传递大数据,图片数据,localconnection 超出大小,超出限制 bitmapdata 拂晓风起
    [Java][JavaScript]字符串数组与字符串之间的互转(join/split)(转) 拂晓风起
    java poi读取excel公式,返回计算值(转) 拂晓风起
  • 原文地址:https://www.cnblogs.com/wt7018/p/10841575.html
Copyright © 2011-2022 走看看