• day13 迭代器


    迭代器

    'iterable' 可迭代的

    内部含有__iter__方法的数据类型就是可迭代的 —— 可迭代协议

    复制代码
    print(dir([]))
    print(dir({}))
    print(dir(5))
    print('__iter__' in dir('abc'))  # True
    ret = 'abc'.__iter__()
    print(ret)
    'iterator'  # 迭代器
    复制代码

    迭代器可以理解为一个容器,我们从这个容器当中一个接着一个的把值取出来的过程就是迭代的过程
    如何从迭代器中取值

    复制代码
    print(ret.__next__())  # a
    print(ret.__next__())  # b
    print(ret.__next__())  # c
    print(ret.__next__())  # StopIteration
    
    l = ['ha','hei','he']
    lst_iter = l.__iter__()
    print(lst_iter.__next__())
    print(lst_iter.__next__())
    print(lst_iter.__next__())
    复制代码

    可迭代的 可迭代对象 python一切皆对象
    迭代器

    print(dir(l))
    print(dir(lst_iter))
    print(set(dir(lst_iter)) - set(dir(l)))  # {'__next__', '__setstate__', '__length_hint__'}

    lst_iter.__setstate__ # 设置从哪开始迭代
    可迭代的必须含有__iter__方法 # 可迭代协议
    迭代器比可迭代的多一个__next__方法
    迭代器:包含__next__,__iter__方法的就是迭代器 # 迭代器协议
    包含__next__方法的可迭代对象就是迭代器
    迭代器是可迭代的的一部分
    获得迭代器:可迭代的调用__iter__
    使用迭代器:迭代器.__next__()

    print('__iter__' in dir(lst_iter))
    print('__next__' in dir(lst_iter))

    如何判断一个变量是不是迭代器或者可迭代的

    复制代码
    # print('__iter__' in dir(lst_iter))
    # print('__next__' in dir(lst_iter))
    from collections import Iterable
    from collections import Iterator
    print(isinstance('a',str))
    print(isinstance([1,2,3,4],Iterable))
    print(isinstance([1,2,3,4],Iterator))
    print(isinstance(1,Iterable))
    print(isinstance(1,Iterator))
    print(isinstance(lst_iter,Iterator))
    复制代码

    可迭代的:__iter__
    迭代器:__iter__和__next__
    迭代器和可迭代的关系:可迭代的包含迭代器
    迭代器和可迭代的判断:两种方法

    迭代器的工作原理
    l_iter = [1, 2, 3, 4, 5].__iter__()
    迭代器只是记录当前这个元素和下一个元素

    print('__iter__' in dir(range(10)))
    print('__next__' in dir(range(10)))
    range_iter = range(10).__iter__()
    print(range_iter.__next__())
    print(range_iter.__next__())

    迭代器的特点
    惰性运算
    从前到后一次去取值,过程不可逆,不可重复
    节省内存

    for item in [1,2,3]:
        pass
    # list_iter = [1,2,3].__iter__()
    # list_iter.__next__()

    用while循环模拟for循环的方式 —— for循环是了依赖迭代器的,且我们自己也可以仿照着写

    复制代码
    l = [1,2,3,4,5]
    l_iter = l.__iter__()
    while True:
        try:
            print(l_iter.__next__())
        except StopIteration:  # 遇到StopIteration就break
            break
    复制代码

    for循环是让我们更简单的使用迭代器
    用迭代器取值就不需要关心索引或者key的问题了

    目前我们已知的可迭代的都是python提供给我们的
    range()
    文件f
    enumerate()
    在平时写代码的过程中,我们用for循环就够了

  • 相关阅读:
    WebSocket属性的简介及使用
    JAVA_基础逻辑运算符与位运算符使用
    JAVA_基础数据类型介绍与基本数据类型之间的运算规则
    ES6特性整理
    Vue-cli中的安装方法
    Kubernetes核心原理(一)之API Server
    Kubernetes核心原理(四)之Kubelet
    kubernetes-整体概述和架构详解
    Kubernetes dashboard认证访问
    kubeadm HA master(v1.14.0)离线包 + 自动化脚本 + 常用插件 For Centos/Fedora
  • 原文地址:https://www.cnblogs.com/QQ279366/p/7778292.html
Copyright © 2020-2023  润新知