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

    str, list, tuple, dict, set是可迭代的数据类型

    那么为什么他们可迭代呢

    因为他们都遵循了可迭代协议. 什么是可迭代协议.

     iterable表⽰可迭代的. 表⽰可迭代协议. 那么如何进⾏验证你的数据类型是否
    符合可迭代协议. 我们可以通过dir函数来查看类中定义好的所有⽅法.

    s = "我的哈哈哈"
    print(dir(s)) # 可以打印对象中的⽅法和函数
    print(dir(str)) # 也可以打印类中声明的⽅法和函数

    在打印结果中. 寻找__iter__ 如果能找到. 那么这个类的对象就是⼀个可迭代对象.

    这是查看⼀个对象是否是可迭代对象的第⼀种办法. 我们还可以通过isinstence()函数来查
    看⼀个对象是什么类型的

    l = [1,2,3]
    l_iter = l.__iter__()
    from collections import Iterable
    from collections import Iterator
    print(isinstance(l,Iterable)) #True
    print(isinstance(l,Iterator)) #False
    print(isinstance(l_iter,Iterator)) #True
    print(isinstance(l_iter,Iterable)) #True

    如果对象中有__iter__函数. 那么我们认为这个对象遵守了可迭代协议.
    就可以获取到相应的迭代器. 这⾥的__iter__是帮助我们获取到对象的迭代器. 我们使⽤迭代
    器中的__next__()来获取到⼀个迭代器中的元素. 那么我们之前讲的for的⼯作原理到底是什
    么?

    s = "我爱北京天安⻔"
    c = s.__iter__() # 获取迭代器
    print(c.__next__()) # 使⽤迭代器进⾏迭代. 获取⼀个元素 我
    print(c.__next__()) #
    print(c.__next__()) #
    print(c.__next__()) #
    print(c.__next__()) #
    print(c.__next__()) #
    print(c.__next__()) #
    print(c.__next__()) # StopIteration

    使⽤while循环+迭代器来模拟for循环

    lst = [1,2,3]
    lst_iter = lst.__iter__()
    while True:
        try:
            i = lst_iter.__next__()
            print(i)
        except StopIteration:
            break       

    Iterable: 可迭代对象. 内部包含__iter__()函数
     Iterator: 迭代器. 内部包含__iter__() 同时包含__next__().
     迭代器的特点:
     1. 节省内存.
     2. 惰性机制
     3. 不能反复, 只能向下执⾏.

    我们可以把要迭代的内容当成⼦弹. 然后呢. 获取到迭代器__iter__(), 就把⼦弹都装在弹夹
    中. 然后发射就是__next__()把每⼀个⼦弹(元素)打出来. 也就是说, for循环的时候. ⼀开始的
    时候是__iter__()来获取迭代器. 后⾯每次获取元素都是通过__next__()来完成的. 当程序遇到
    StopIteration将结束循环.
     

  • 相关阅读:
    FZU 2104 Floor problem (水题)
    POJ 1797 Heavy Transportation (最短路变形)
    ZOJ 3708 Density of Power Network (水题)
    POJ 2488 A Knight's Journey (DFS)
    HDU 1198 Farm Irrigation (并查集)
    HDU 1052 Tian Ji -- The Horse Racing (贪心)
    HDU 1598 find the most comfortable road (并查集||最短路)
    poj 2533 Longest Ordered Subsequence(最长上升子序列)
    hdu 2025 查找最大元素 (水)
    hdu 5142 NPY and FFT(水)
  • 原文地址:https://www.cnblogs.com/journey-mk5/p/9462248.html
Copyright © 2011-2022 走看看