• Python3 From Zero——{最初的意识:004~迭代器和生成器}


    一、反向迭代:reversed()

    >>> a
    [1, 2, 3, 4]
    >>> for x in reversed(a):
    ...  print(x, end=' ')
    ... 
    4 3 2 1 

    #反向迭代只有在待处理的对象具有确定的大小或者对象实现了__reversed()__特殊方法时才能奏效,否则必须先将对象转化为列表(可能消耗大量内存)

    >>> with open('/etc/passwd', 'rt') as file:
    ...  for x in reversed(file):    #要用list(file)
    ...   print(x)
    ... 
    Traceback (most recent call last):
      File "<stdin>", line 2, in <module>
    TypeError: argument to reversed() must be a sequence

    二、迭代器切片:itertools.islice

    import itertools
    >>> def count(n):
    ...  while True:
    ...   yield n
    ...   n += 1
    ...
    >>> for x in itertools.islice(count(0), 2, 10): #相当于列表切片取[2:10] ... print(x, end=' ') ... 2 3 4 5 6 7 8 9
    >>>for x in itertools.islice(count(0), 5, None):    #相当于列表切片取[5:]
    ...  print(x, end=' ')
    ...  if x >10:
    ...   break
    ... 
    5 6 7 8 9 10
    >>> for x in itertools.islice(count(0), 5):    #相当于列表切片取[:5]
    ...  print(x, end=' ')
    ... 
    0 1 2 3 4

    #迭代器和生成器无法进行普通的切片操作(其长度不确定且没有实现索引),islice会产生一个新迭代器,消耗掉初始迭代序列中的所有数据

    三、以索引-值对的形式迭代序列:enumerate

    >>> a
    [1, 2, 3, 4]
    >>> for index, value in enumerate(a, 1):    #从1开始计数,语法:enumerate(iterable[, start])
    ...  print(index, value)
    ... 
    1 1
    2 2
    3 3
    4 4

    #enumerate的返回值是一个迭代器,元素是元组

    四、同时迭代多个序列

      并行成对迭代:zip()、itertools.zip_longest()

    >>> a
    [1, 2, 3, 4]
    >>> b
    [1, 2, 3, 4, 8, 9]
    >>> for x, y in zip(a, b):
    ...  print(x, y)
    ... 
    1 1
    2 2
    3 3
    4 4
    >>> for x, y in itertools.zip_longest(a, b):
    ...  print(x, y)
    ... 
    1 1
    2 2
    3 3
    4 4
    None 8
    None 9
    >>> for x, y in itertools.zip_longest(a, b, fillvalue=0):
    ...  print(x, y)
    ... 
    1 1
    2 2
    3 3
    4 4
    0 8
    0 9

      串行顺序迭代:itertools.chain()

    >>> for x in itertools.chain(a, b):
    ...  print(x)
    ... 
    1
    2
    3
    4
    1
    2
    3
    4
    8
    9

      串行交叉迭代:heapq.merge()

    >>> import heapq
    >>> for x in heapq.merge(a, b):
    ...  print(x)
    ... 
    1
    1
    2
    2
    3
    3
    4
    4
    8
    9
  • 相关阅读:
    UDP最大传输字节
    [bzoj3994] [SDOI2015]约数个数和
    [bzoj3529] [Sdoi2014]数表
    [bzoj3309] DZY Loves Math
    [bzoj2693] jzptab
    [bzoj4407] 于神之怒加强版
    [bzoj3688] 折线统计
    [bzoj2301] [HAOI2011]Problem b
    [bzoj2820] YY的GCD
    [bzoj4559] [JLoi2016]成绩比较
  • 原文地址:https://www.cnblogs.com/hadex/p/5752441.html
Copyright © 2020-2023  润新知