• 自学Python4.6-迭代器


    自学Python之路-Python基础+模块+面向对象
    自学Python之路-Python网络编程
    自学Python之路-Python并发编程+数据库+前端
    自学Python之路-django

    自学Python4.6 - 迭代器

    之前所讲的可以使用for循环:

    • list
    • dic
    • str
    • set
    • tuple
    • f = open()
    • range()
    • enumerate  枚举
    print(dir([]))  告诉我们列表拥有的所有方法 ,  其中有双下划线的为双下方法
    print(dir(""))  告诉我们字符串拥有的所有方法 

    print([1].__add__([2]))
    print([1]+[2])  # 同以上,python内部算法执行就是_add_
    

      

    迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。

    迭代器只能往前不会后退,不过这也没什么, 因为人们很少在迭代途中往后退。

    另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。

    迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件(cat就是迭代器形式,读一行显示一行)

    特点:

    • 访问者不需要关心迭代器内部的结构,仅需通过_nex_t()方法不断去取下一个内容;
    • 不能随机访问集合中的某个值 ,只能从头到尾依次访问,且只能取所有数据取一次;
    • 访问到一半时不能往回退;
    • 便于循环比较大的数据集合,节省内存空间
        (迭代器并不会在内存中占用一大块内存,而是随着循坏每次生成一个,每次_next_()每次提供一个)

    1. 生成一个迭代器(在Python3.0中)

    others = iter(['carlos','gary','tong','rain']) #iter代表生成的是个迭代器
    print(others)  #输出结果为<list_iterator object at 0x01E96650>表示为迭代器
    print(others.__next__())
    print(others.__next__())
    print(others.__next__())
    print(others.__next__()) # 迭代器只有4个元素,如果超过迭代器元素的数量继续迭代的话,它会自动返回“StopIteration”的信息
    

    输出:

    carlos
    gary
    tong
    rain

    2. for在iter迭代器中的实例(利用for 循环取出iter中每个元素)

    obj = iter([11,22,33,44,55,66,77,88,99,90])
    for n in obj:  #利用for 循环取出iter中每个元素。
        print(n)
    

    输出:

    11
    22
    33
    44
    55
    66
    77
    88
    99
    90

    3. 迭代器的循环可以避开索引,但有时候需要索引来进行一些操作。内建函数enumerate,它能在iter函数的结果前加上索引,以元组返回。

    obj =iter(['carlos','gary','jack','rain'])
    for i in enumerate(obj):
        print(i)
    

    输出:

    (0, 'carlos')
    (1, 'gary')
    (2, 'jack')
    (3, 'rain')

    4. while 在iter函数中应用

    obj = iter([11,22,33,44,55,66,77,88,99,90])
    while True:    #while循环的话判断为真,赋一个变量。然后把每次通过obj.__next__()的结果赋值给变量打印出来。当循环超过iter中的值后条件就为Talse,那么就会报StopIteration的错误
        val = obj.__next__()
        print(val)
    

    输出:

    11
    22
    33
    44
    55
    66
    77
    88
    99
    90
    Traceback (most recent call last):
    File "D:/PyCharm Community Edition 2016.3.2/aaaa.py", line 20, in <module>
    val = obj.__next__()
    StopIteration

    5. 分析迭代器内存开销

    #把文件一次加载到内存中,然后逐行打印。当文件很大时,这个方法的内存开销就很大了 * /
    for line in open("test.txt").readlines():
        print
        line
    #这是最简单也是运行速度最快的写法,他并没显式的读取文件,而是利用迭代器每次读取下一行 * /
    for line in open("test.txt"):  # use file iterators
        print
        line

    补充:

    • 迭代器双下方法 : 很少直接调用的方法。一般情况下,是通过其他语法触发的;
    • 可迭代协议:只要含有有__iter__的方法 '__iter__' in dir(数据)都是可迭代的;
    • 迭代器协议: 只要内部含有__iter__和__next__方法就是迭代器协议;
    • 迭代器一定可迭代,可迭代的通过调用._iter_()方法就能得到一个迭代器;
    • 迭代器中的_next_()方法可以一个一个的获取值;
    • 可迭代的一定可以被for循环(for循环其实就是在使用迭代器)。
  • 相关阅读:
    CF161D Distance in Tree
    [WC2010]重建计划 长链剖分
    [FJOI2014]最短路径树问题 长链剖分
    [Vani有约会]雨天的尾巴 线段树合并
    Friend Links
    Nerdtree+高亮+图标配置
    【CF1416C】XOR Inverse
    01-Trie 学习
    【[USACO19DEC】Milk Visits G
    【ARC069D】Flags
  • 原文地址:https://www.cnblogs.com/yaoyaojcy/p/7417938.html
Copyright © 2020-2023  润新知