• 053 迭代器


    迭代器解决了不依赖索引取值的问题

    一、可迭代对象

    特征: __iter__()方法的对象就是可迭代对象

    x = 1                   # 不可迭代对象
    s = 'nick'              # 可迭代对象
    lt = [1, 2, 3]          # 可迭代对象
    dic = {'a': 1, 'b': 2}  # 可迭代对象
    tup = (1,)              # 可迭代对象,元组只有一个元素必须得加逗号
    se = {1, 2, 3}          # 可迭代对象
    f = open('time.py')     # 可迭代对象
    def func():             # 不可迭代对象
        pass
    

    总结:除了数字类型和函数之外Python内置str、list、tuple、dict、set、file都是可迭代对象

    二、迭代器对象

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

    特征: 具有__iter__()以及__next__()方法的叫做迭代器对象

    s = 'nick'              # 可迭代对象,不属于迭代器对象
    lt = [1, 2, 3]          # 可迭代对象,不属于迭代器对象
    dic = {'a': 1, 'b': 2}  # 可迭代对象,不属于迭代器对象
    tup = (1,)              # 可迭代对象,不属于迭代器对象
    se = {1, 2, 3}          # 可迭代对象,不属于迭代器对象
    f = open('time.py')     # 可迭代对象,迭代器对象
    def func():             # 不可迭代对象,不属于迭代器对象
        pass
    

    总结:只有文件是迭代器对象

    三、for循环原理

    for循环 == 迭代循环

    lt = [1,2,3]
    lt_iter = lt.__iter__()
    # li_iter = iter(lt)        # iter(lt) 和 lt.__iter__() 功能相同,都可以使用
    while 1:
        try:
            print(lt_iter.__next__())
            # print(next(lt_iter))  # next(lt_iter) 和 lt_iter.__next__() 功能相同,都可以使用
        except StopIteration:
            break
    

    总结:

    1. (可迭代对象/迭代器对象)可以用__iter__()方法转换成迭代器对象
    2. 使用__next__()取出迭代器里的所有值
    3. 使用__next__()方法取尽迭代器中的所有值,一定会报错,通过异常捕捉退出while循环

    可迭代对象: 具有__iter__()方法的对象就是可迭代对象,除了数字类型和函数都是可迭代对象
    迭代器对象: 具有__iter__()__next__()方法的都是迭代器对象,只有文件是迭代器对象

    迭代器对象一定是可迭代对象; 可迭代对象不一定是迭代器对象

  • 相关阅读:
    JS精度问题(0.1+0.2 = 0.3吗?)
    力导向算法的研究与改进
    React Hooks的memo和useCallback
    React Hooks vs Vue Composition Api
    docker常用命令
    win10一台电脑上配置多个git账户
    eslint+prettier 统一代码风格
    c#中关于值类型,引用类型在栈,堆栈的分配
    js里的__proto__和prototype
    golang之冒泡排序
  • 原文地址:https://www.cnblogs.com/XuChengNotes/p/11341360.html
Copyright © 2020-2023  润新知