zoukankan      html  css  js  c++  java
  • 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循环就够了

  • 相关阅读:
    Redis详解
    Linux常用命令
    sqlserver 游标写法
    Flask总结
    HTTPS协议
    Django REST framework 简介
    Cookie和session
    利用rest-framework编写逻辑关系
    vuex
    jQuery和Bootstrap的优点
  • 原文地址:https://www.cnblogs.com/QQ279366/p/7778292.html
Copyright © 2011-2022 走看看