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

    迭代器:迭代的工具。迭代是更新换代,如你爷爷生了你爹,你爹生了你,迭代也可以说成是重复,并且但每一次的重复都是基于上一次的结果来的。如计算机中的迭代开发,就是基于软件的上一个版本更新。以下代码就不是迭代,它只是单纯的重复

    while True:
        print('*'*10)
    

    49迭代器-娃.jpg?x-oss-process=style/watermark

    一、可迭代对象

    python中一切皆对象,如

    x = 1
    name = 'nick'
    lis = [1, 2]
    tup = (1, 2)
    dic = {'name': 'nick'}
    s1 = {'a', 'b'}
    
    
    def func():
        pass
    
    
    f = open('49w.txt', 'w', encoding='utf-8)
    

    对于这一切的对象中,但凡有__iter__方法的对象,都是可迭代对象。

    # x = 1.__iter__  # SyntaxError: invalid syntax
    
    # 以下都是可迭代的对象
    
    name = 'nick'.__iter__
    lis = [1, 2].__iter__
    tup = (1, 2).__iter__
    dic = {'name': 'nick'}.__iter__
    s1 = {'a', 'b'}.__iter__
    f = open('49w.txt', 'w', encoding='utf-8')
    f.__iter__
    f.close()
    

    1.1 总结

    可迭代的对象:Python内置str、list、tuple、dict、set、file都是可迭代对象。

    特点:

    1. 内置有__iter__方法的都叫可迭代的对象。

    49迭代器-装逼.jpg?x-oss-process=style/watermark

    二、迭代器对象

    只有字符串和列表都是依赖索引取值的,而其他的可迭代对象都是无法依赖索引取值的。因此我们得找到一个方法能让其他的可迭代对象不依赖索引取值。

    在找到该方法前,首先我们给出迭代器对象的概念:可迭代的对象执行__iter__方法得到的返回值。并且可迭代对象会有一个__next__方法。

    # 不依赖索引的数据类型迭代取值
    dic = {'a': 1, 'b': 2, 'c': 3}
    iter_dic = dic.__iter__()
    print(iter_dic.__next__())
    print(iter_dic.__next__())
    print(iter_dic.__next__())
    # print(iter_dic.__next__())  # StopIteration:
    
    a
    b
    c
    
    # 依赖索引的数据类型迭代取值
    lis = [1, 2, 3]
    iter_lis = lis.__iter__()
    print(iter_lis.__next__())
    print(iter_lis.__next__())
    print(iter_lis.__next__())
    # print(iter_lis.__next__())  # StopIteration:
    
    1
    2
    3
    

    上述的方法是非常繁琐的,我们可以使用while循环精简下。其中使用的try...except...为异常处理模块,以后会详细讲解。

    s = 'hello'
    iter_s = s.__iter__()
    
    while True:
        try:
            print(iter_s.__next__())
        except StopIteration:
            break
    
    h
    e
    l
    l
    o
    

    2.1 总结

    迭代器对象:执行可迭代对象的__iter__方法,拿到的返回值就是迭代器对象。

    特点:

    1. 内置__next__方法,执行该方法会拿到迭代器对象中的一个值
    2. 内置有__iter__方法,执行该方法会拿到迭代器本身
    3. 文件本身就是迭代器对象。

    缺点:

    1. 取值麻烦,只能一个一个取,并且只能往后取,值取了就没了
    2. 无法使用len()方法获取长度

    三、for循环原理

    for循环称为迭代器循环,in后必须是可迭代的对象。

    lis = [1, 2, 3]
    for i in lis:
        print(i)
    
    1
    2
    3
    

    因为迭代器使用__iter__后还是迭代器本身,因此for循环不用考虑in后的对象是可迭代对象还是迭代器对象。

    由于对可迭代对象使用__iter__方法后变成一个迭代器对象,这个迭代器对象只是占用了一小块内存空间,他只有使用__next__后才会吐出一个一个值。如lis = [1,2,3,4,5,...]相当于一个一个鸡蛋,而lis = [1,2,3,4,5,...].__iter__相当于一只老母鸡,如果你需要蛋,只需要__next__即可。

    Python2中

    print(range(10))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    

    Python3中

    print(range(10))  # range(0, 10)
    

    49迭代器-老母鸡.jpg?x-oss-process=style/watermark

  • 相关阅读:
    sum left join 多次引发的问题
    WPF之Binding基础三 Binding的路径Path
    解决Android Studio启动不了的办法
    指向常量的指针和常量指针的区别简单理解
    简单的字符串操作
    QT问答
    log4qt使用示例
    在线代码库
    Qt5的windows开放环境准备
    QT 调试技术
  • 原文地址:https://www.cnblogs.com/abdm-989/p/11723272.html
Copyright © 2011-2022 走看看