zoukankan      html  css  js  c++  java
  • Python面试题之Python迭代器

    要理解迭代器,首先要从字面意思来说。

    迭代

    1. 重复
    2. 下一次重复基于上一次的结果

    软件开发就是典型的迭代更新。

    讲迭代,我们就先来模拟一下迭代:

    现在让我们使用while循环来遍历出一个列表list1 = [1, 2, 3, 4, 5]里面的所有元素。

    index = 0
    while index < len(list1):
        pirnt(list1[index])
        index += 1

    接下来用for循环来:

    for index in range(len(list1)):
        print(list1[index])

    很显然,上面两种方式都能实现遍历一个列表里面的所有元素。但是,它们都依赖于列表的索引,如果我们要遍历一个没有索引的数据类型,比如说字典和集合。那应该怎么办呢?

    你可能知道在Python中可以直接使用for去遍历一个列表、元祖、字典、集合等数据类型。就像下面这样:

    for i in list1:  # 不依赖索引就能取出list1中的所有元素
        print(i)

    那么在Python中,上面的for循环究竟是怎么实现的呢?

    其实跟我们今天要讲的迭代器有非常重要的关系。接下来,我们就一步一步的来介绍下迭代器的相关内容。

    可迭代对象

    我们之前学过的能被for循环的有字符串、列表、字典、元祖、集合、打开的文件句柄,这些对象有什么共同特点呢?共同点就是它们都有一个叫__iter__的方法。

    总结一下:

    只要一个对象有__iter__方法,那么这个对象就可以叫做可迭代对象。

    字符串、列表、字典、元祖、集合、打开的文件句柄都是可迭代对象。

    再简单、直白一点?在Python中能够被for循环的都是可迭代对象。

    迭代器

    上面说到的那些有__iter__方法的对象,如果调用一下这个特殊的__iter__方法会发生什么呢?

    补充:

    dict1 = {"a": 1, "b":2, "c":3}
    # 相当于执行了dict.__iter__(),类似len(dict1)相当于dict.__len__()
    d = iter(dict1)
    那执行iter(dict1)或者说调用dict1.__iter__方法得到的是什么呢?
    
    得到的就是一个迭代器,它有一个特殊的方法,叫__next__方法。

    总结一下:

    只要一个对象有__iter__方法和__next__方法,那么这个对象就可以叫做迭代器。

    对一个可迭代对象调用它的__iter__方法,得到的就是迭代器对象。

    迭代器的特点

    优点:

    1. 不依赖索引
    2. 惰性计算,节省内存

    缺点:

    1. 不如按索引取值方便
    2. 一次性,只能往后取,不能往回退

    for循环实质

    for i in [1, 2, 3, 4, 5]:
        ...

     相当于:

    i = [1,2,3,4,5].__iter__()   # 获得迭代器
    while True:
        try:
            x = i.__iter__()   # 获得下一个值
        except StopIteration:
            break    # 遇到StopIteration就退出循环

    内置方法介绍:

    无限记数:

    from itertools import count
    counter = count(start=13)
    print(next(counter))
    13
    print(next(counter))
    14

    环状迭代:

    from itertools import cycle
    colors = cycle(["red","yellow","green"])
    print(next(colors))
    red
    print(next(colors))
    yellow
    print(next(colors))
    green
  • 相关阅读:
    君の名は~ 观后感
    dp1,明天补题解
    【bzoj1222】[HNOI2001]产品加工
    Daily~Miracles
    luogu 1273有线电视网
    luogu 1373
    codeforces 721C
    codeforces 706E
    The~Best~Chanteur~宇多田ヒカル
    codeforces706D
  • 原文地址:https://www.cnblogs.com/JetpropelledSnake/p/9168632.html
Copyright © 2011-2022 走看看