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循环

  • 相关阅读:
    框架,样式表的一些认解,今天这节可有点不在状态,正在规划学习流程,让自己更快的提升起来。看着其他小伙伴都太厉害啦。努力!0909上
    表单元素的了解和表单元素分类,代码的认解。 0908下
    表格标题——简单表格的理解与认识 0906下
    HDU 1024 DP Max Sum Plus Plus
    zoj 1670 Jewels from Heaven
    BestCoder Round #68 (div.2) 1002 tree
    POJ 2986 A Triangle and a Circle 圆与三角形的公共面积
    609C Load Balancing
    609B Load Balancing
    codeforce 609A
  • 原文地址:https://www.cnblogs.com/wt7018/p/10841575.html
Copyright © 2011-2022 走看看