zoukankan      html  css  js  c++  java
  • 迭代器 /生成器 yield

    iter 迭代
    iterable 可迭代的
    iterator迭代器
    dir函数查看一个数据类型内部含有哪些方法
    两边带着双下划线的方法叫做"魔术方法","双下方法","内置方法"
    这些方法都有一个特点:你可以调但是不需要你直接调用
    可迭代协议 只要是含有'__iter__'方法的数据类型都是可迭代
    是python规定的 : 可迭代类型 和 python语言之间的协议

    检测某个变量/值 是不是可迭代的呢?
    法一
    print('__iter__' in dir([]))
    print('__iter__' in dir(123))
    法二
    from collections import Iterable
    print(isinstance([],Iterable)) # 内置函数,判断一个具体的值是不是某个数据类型的
    print(isinstance(123,Iterable)) # 内置函数,判断一个具体的值是不是某个数据类型的

    可以迭代的都可以使用for循环
    for循环一个列表的时候必须用的
    __next__取下一个值

    迭代器协议 : 含有__next__和__iter__方法的变量/值都是迭代器
    迭代器的特点:
    具有next和iter方法
    通过一个next多次执行就可以获得所有这个容器中的值
    迭代器中的值只能取一次
    不取的时候值不出现

    for循环取值
    for循环内部的机制就是迭代器取值的机制
    在for循环执行的过程中 : 先把可迭代的变成一个迭代器,然后再从中一个一个的取值

    range生成的就是一个迭代器,创建这个迭代器并不会真的把迭代器中的所有数据一次性生成
    什么时候生成呢? 只有通过next取值的时候才会生成
    记住你要多少个值 ,当前该给你什么,并且记住我下一个该给你什么,下一个和当前这个数的关系
    迭代器的作用就是节省内存,for循环就是利用了迭代器节省内存的特点来对python当中的变量来进行操作的
    本质上for循环替我们做了上面程序的一系列操作:
    生成迭代器
    循环每一次对这个迭代器执行next
    并且到迭代器的最后就停止

    判断一个变量/值是否是迭代器的方法
    lst_iterator = [].__iter__()
    print('__iter__' in dir(lst_iterator))
    print('__next__' in dir(lst_iterator))
    print('__iter__' in dir(lst_iterator) and '__next__' in dir(lst_iterator))

    f是一个迭代器还是一个可迭代的
    range是一个迭代器还是一个可迭代的
    f = open('file')
    print('__iter__' in dir(f) and '__next__' in dir(f))

    a = range(10)
    print('__iter__' in dir(a))
    print('__iter__' in dir(a) and '__next__' in dir(a))

    第二种方法
    from collections import Iterator
    f = open('file')
    print(isinstance(f,Iterator))
    print(isinstance(range(10),Iterator))
    a = range(10)
    for i in a:
    print(i)
    for i in a:
    print(i)




      
  • 相关阅读:
    python之enumerate
    PyCharm Debug 调试
    兼容性测试方法
    mongo基本命令
    mongodb启动
    安装STF
    新家
    用数组实现的最大堆(C++)
    VS2013调用GLPK求解线性规划
    转:Java读取txt文件和写入txt文件
  • 原文地址:https://www.cnblogs.com/zhangchen-sx/p/9910589.html
Copyright © 2011-2022 走看看