zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    从命令行接收多个数字,求和之后输出结果(Java)
    《大道至简》第一章——编程的精义_读后感(Java伪代码)
    《构建之法》阅读笔记03
    《构建之法》阅读笔记02
    《构建之法》阅读笔记01
    Javaweb所用到的相关技术综述
    TomCat的安装与配置
    心形曲线
    异常处理---动手动脑及课后作业
    多态---课后作业
  • 原文地址:https://www.cnblogs.com/hadex/p/5752441.html
Copyright © 2011-2022 走看看