zoukankan      html  css  js  c++  java
  • Python基础(迭代器)

    一、迭代器

      概述:     

        迭代是Python最强大的功能之一,是访问集合元素的一种方式。

        迭代器是一个可以记住遍历的位置的对象。

        迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

        迭代器有两个基本的方法:iter()next()

        字符串,列表或元组对象都可用于创建迭代器:

      延迟计算或惰性求值 (Lazy evaluation):

        迭代器不要求你事先准备好整个迭代过程中所有的元素。仅仅是在迭代至某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。

                  这个特点使得它特别适合用于遍历一些巨大的或是无限的集合。

      可迭代对象:

        迭代器提供了一个统一的访问集合的接口。只要是实现了__iter__()或__getitem__()方法的对象,就可以使用迭代器进行访问。

        序列:字符串、列表、元组

        非序列:字典、文件

        自定义类:用户自定义的类实现了__iter__()或__getitem__()方法的对象

      生成迭代器的两种方式:

     1 # 使用对象内置的__iter__()方法生成迭代器
     2 L1 = [1,2,3,4,5,6]
     3 I1 = L1.__iter__()
     4 print(I1)
     5 # >>>:<listiterator object at 0x7fe4fd0ef550>
     6 print(I1.__next__())
     7 # >>>:1
     8 print(I1.__next__())
     9 # >>>: 2
    10 print(I1.__next__())
    11 #>>> : 3
     1 # 使用内置工厂函数生成迭代器
     2 L1 = [1,2,3,4,5,6]
     3 I2 = iter(L1)
     4 print(I2)
     5 #>>> : <listiterator object at 0x7fe4fd0ef610>
     6 print(I2.__next__())
     7 # >>> :1
     8 print(I2.__next__())
     9 # >>> :2
    10 print(I2.__next__())
    11 # >>> :3
    12 print("内建next()方法:",next(I2))

      StopIteration

        StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 __next__()next()方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。

      Python强大的for循环:

        for循环实现的原理就是调用可循环对象(列表,元组,字符串等)的__iter__()或iter()方法,使其变成符合迭代器协议的迭代器对象,然后调用迭代器对象的__next__()或next()方法依次不可逆的获取    迭代器对象中的元素。

        下面让我们通过三段代码来学习for循环的本质:

     1 #for循环实现机制
     2 li=["alex","kelvin","elvin"]
     3 
     4 for i in li:
     5     print(i)
     6 """
     7 输出结果:
     8 alex
     9 kelvin
    10 elvin
    11 """
    12 
    13 
    14 #上面的for循环实现等同于:
    15 Li=li.__iter__()
    16 count=len(li)
    17 while count:
    18     print(Li.__next__())
    19     count-=1
    20 """
    21 输出结果:
    22 alex
    23 kelvin
    24 elvin
    25 """
    26 
    27 #上面的for循环实现原理如下:
    28 Li=li.__iter__()
    29 while True:
    30     try:
    31         print(Li.__next__())
    32     except StopIteration:
    33         break
    34 """
    35 输出结果:
    36 alex
    37 kelvin
    38 elvin
    39 """

    说明:

      for循环可用于任何可迭代对象

      for循环开始时,会通过迭代协议传输给__iter__()内置函数,从而能够从迭代对象中获得一个迭代器,返回的对象含有需要的__next__()方法。

  • 相关阅读:
    内核随记(三)同步(1)
    排列算法
    SQLite入门与分析(八)存储模型(3)
    内核随记(一)——理解中断(2)
    dup与dup2系统调用
    内核随记(四)文件系统(1)
    SQLite入门与分析(八)存储模型(2)
    SQLite入门与分析(九)VACUUM命令分析
    c中static变量局部变量
    (i++)+(i++)与(++i)+(++i)
  • 原文地址:https://www.cnblogs.com/sun-10387834/p/10220944.html
Copyright © 2011-2022 走看看