Python 迭代器工具包【推荐】

  原文:https://git.io/pytips

  0x01 介绍了迭代器的概念,即定义了 __iter__() 和 __next__() 方法的对象,或者通过 yield 简化定义的“可迭代对象”,而在一些函数式编程语言(见 0x02 Python 中的函数式编程)中,类似的迭代器常被用于产生特定格式的列表(或序列),这时的迭代器更像是一种数据结构而非函数(当然在一些函数式编程语言中,这两者并无本质差异)。Python 借鉴了 APL, Haskell, and SML 中的某些迭代器的构造方法,并在 itertools 中实现(该模块是通过 C 实现,源代码:/Modules/itertoolsmodule.c)。

  itertools 模块提供了如下三类迭代器构建工具:

  无限迭代

  整合两序列迭代

  组合生成器

  1. 无限迭代

  所谓无限(infinite)是指如果你通过 for...in... 的语法对其进行迭代,将陷入无限循环,包括:

  

count(start, [step])

  cycle(p)

  repeat(elem [,n])

  从名字大概可以猜出它们的用法,既然说是无限迭代,我们自然不会想要将其所有元素依次迭代取出,而通常是结合 map/zip 等方法,将其作为一个取之不尽的数据仓库,与有限长度的可迭代对象进行组合操作:

  

from itertools import cycle, count, repeat
print(count.__doc__)
  count(start=0, step=1) --> count object
  Return a count object whose .__next__() method returns consecutive values.
  Equivalent to:
  def count(firstval=0, step=1):
  x = firstval
  while 1:
  yield x
  x += step
  counter = count()
  print(next(counter))
  print(next(counter))
  print(list(map(lambda x, y: x+y, range(10), counter)))
  odd_counter = map(lambda x: 'Odd#{}'.format(x), count(1, 2))
  print(next(odd_counter))
  print(next(odd_counter))

  0

  1

  [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

  Odd#1

  Odd#3

  print(cycle.__doc__)

  cycle(iterable) --> cycle object

  Return elements from the iterable until it is exhausted.

  Then repeat the sequence indefinitely.

  cyc = cycle(range(5))

  print(list(zip(range(6), cyc)))

  print(next(cyc))

  print(next(cyc))

  [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 0)]

  1

  2

  print(repeat.__doc__)

  repeat(object [,times]) -> create an iterator which returns the object

  for the specified number of times. If not specified, returns the object

  endlessly.

  print(list(repeat('Py', 3)))

  rep = repeat('p')

  print(list(zip(rep, 'y'*3)))

  ['Py', 'Py', 'Py']

  [('p', 'y'), ('p', 'y'), ('p', 'y')]

  2. 整合两序列迭代

  所谓整合两序列,是指以两个有限序列为输入,将其整合操作之后返回为一个迭代器,最为常见的 zip 函数就属于这一类别,只不过 zip 是内置函数。这一类别完整的方法包括:

 

 accumulate()

  chain()/chain.from_iterable()

  compress()

  dropwhile()/filterfalse()/takewhile()

  groupby()

  islice()

  starmap()

  tee()

  zip_longest()

  这里就不对所有的方法一一举例说明了,如果想要知道某个方法的用法,基本通过 print(method.__doc__) 就可以了解,毕竟 itertools 模块只是提供了一种快捷方式,并没有隐含什么深奥的算法。这里只对下面几个我觉得比较有趣的方法进行举例说明。

  

from itertools import cycle, compress, islice, takewhile, count

  # 这三个方法(如果使用恰当)可以限定无限迭代

  # print(compress.__doc__)

  print(list(compress(cycle('PY'), [1, 0, 1, 0])))

  # 像操作列表 l[start:stop:step] 一样操作其它序列

  # print(islice.__doc__)

  print(list(islice(cycle('PY'), 0, 2)))

  # 限制版的 filter

  # print(takewhile.__doc__)

  print(list(takewhile(lambda x: x < 5, count())))

  ['P', 'P']

  ['P', 'Y']

  [0, 1, 2, 3, 4]

  from itertools import groupby

  from operator import itemgetter

  print(groupby.__doc__)

  for k, g in groupby('AABBC'):

  print(k, list(g))

  db = [dict(name='python', script=True),

  dict(name='c', script=False),

  dict(name='c++', script=False),

  dict(name='ruby', script=True)]

  keyfunc = itemgetter('script')

  db2 = sorted(db, key=keyfunc) # sorted by `script'

  for isScript, langs in groupby(db2, keyfunc):

  print(', '.join(map(itemgetter('name'), langs)))

  groupby(iterable[, keyfunc]) -> create an iterator which returns

  (key, sub-iterator) grouped by each value of key(value).

  A ['A', 'A']

  B ['B', 'B']

  C ['C']

  c, c++

  python, ruby

  from itertools import zip_longest

  # 内置函数 zip 以较短序列为基准进行合并,

  # zip_longest 则以最长序列为基准,并提供补足参数 fillvalue

  # Python 2.7 中名为 izip_longest

  print(list(zip_longest('ABCD', '123', fillvalue=0)))

  [('A', '1'), ('B', '2'), ('C', '3'), ('D', 0)]

  3. 组合生成器

  关于生成器的排列组合: 

product(*iterables, repeat=1):两输入序列的笛卡尔乘积

  permutations(iterable, r=None):对输入序列的完全排列组合

  combinations(iterable, r):有序版的排列组合

  combinations_with_replacement(iterable, r):有序版的笛卡尔乘积

  from itertools import product, permutations, combinations, combinations_with_replacement

  print(list(product(range(2), range(2))))

  print(list(product('AB', repeat=2)))

  [(0, 0), (0, 1), (1, 0), (1, 1)]

  [('A', 'A'), ('A', 'B'), ('B', 'A'), ('B', 'B')]

  print(list(combinations_with_replacement('AB', 2)))

  [('A', 'A'), ('A', 'B'), ('B', 'B')]

  # 赛马问题:4匹马前2名的排列组合(A^4_2)

  print(list(permutations('ABCDE', 2)))

  [('A', 'B'), ('A', 'C'), ('A', 'D'),
 ('A', 'E'), ('B', 'A'), ('B', 'C'),
 ('B', 'D'), ('B', 'E'), ('C', 'A'),
 ('C', 'B'), ('C', 'D'), ('C', 'E'),
 ('D', 'A'), ('D', 'B'), ('D', 'C'),
 ('D', 'E'), ('E', 'A'), ('E', 'B'), ('E', 'C'), ('E', 'D')]

  # 彩球问题:4种颜色的球任意抽出2个的颜色组合(C^4_2)

  print(list(combinations('ABCD', 2)))

  [('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D')]
(0)

相关推荐

  • Python的迭代器和生成器

    先说迭代器,对于string.list.dict.tuple等这类容器对象,使用for循环遍历是很方便的.在后台for语句对容器对象调用iter()函数,iter()是python的内置函数.iter()会返回一个定义了next()方法的迭代器对象,它在容器中逐个访问容器内元素,next()也是python的内置函数.在没有后续元素时,next()会抛出一个StopIteration异常,通知for语句循环结束.比如: >>> s = 'abc' >>> it = it

  • Python中Iterator迭代器的使用杂谈

    迭代器是一种支持next()操作的对象.它包含一组元素,当执行next()操作时,返回其中一个元素:当所有元素都被返回后,生成一个StopIteration异常. >>>a=[1,2,3] >>>ia=iter(a) >>>next(ia) 1 >>>next(ia) 2 >>>next(ia) 3 >>>next(ia) Traceback (most recent call last): Fil

  • 解析Python中的生成器及其与迭代器的差异

    生成器 生成器是一种迭代器,是一种特殊的函数,使用yield操作将函数构造成迭代器.普通的函数有一个入口,有一个返回值:当函数被调用时,从入口开始执行,结束时返回相应的返回值.生成器定义的函数,有多个入口和多个返回值:对生成器执行next()操作,进行生成器的入口开始执行代码,yield操作向调用者返回一个值,并将函数挂起:挂起时,函数执行的环境和参数被保存下来:对生成器执行另一个next()操作时,参数从挂起状态被重新调用,进入上次挂起的执行环境继续下面的操作,到下一个yield操作时重复上面

  • Python中的迭代器与生成器高级用法解析

    迭代器 迭代器是依附于迭代协议的对象--基本意味它有一个next方法(method),当调用时,返回序列中的下一个项目.当无项目可返回时,引发(raise)StopIteration异常. 迭代对象允许一次循环.它保留单次迭代的状态(位置),或从另一个角度讲,每次循环序列都需要一个迭代对象.这意味我们可以同时迭代同一个序列不只一次.将迭代逻辑和序列分离使我们有更多的迭代方式. 调用一个容器(container)的__iter__方法创建迭代对象是掌握迭代器最直接的方式.iter函数为我们节约一些

  • python的迭代器与生成器实例详解

    本文以实例详解了python的迭代器与生成器,具体如下所示: 1. 迭代器概述:   迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.   1.1 使用迭代器的优点   对于原生支持随机访问的数据结构(如tuple.list),迭代器和经典for循环的索引访问相比并无优势,反而丢失了索引值(可以使用内建函数enumerate()找回这个索引值).但对于无法随机访问的数据结构(比

  • Python使用迭代器打印螺旋矩阵的思路及代码示例

    思路 螺旋矩阵是指一个呈螺旋状的矩阵,它的数字由第一行开始到右边不断变大,向下变大, 向左变大,向上变大,如此循环. 螺旋矩阵用二维数组表示,坐标(x,y),即(x轴坐标,y轴坐标). 顺时针螺旋的方向是->右,下,左,上,用数值表示即是x加1格(1,0),y加1格(0,1),x减1格(-1,0),y减1格(0,-1). 坐标从(0,0)开始行走,当超出范围或遇到障碍时切换方向. 螺旋矩阵的打印首先要对n*n的数组进行赋值,根据规律可以看出,每一层都是按照右->下->左->上的顺序

  • Python编程中实现迭代器的一些技巧小结

    yield实现迭代器 如引言中的描述,实现一个可迭代的功能要是每次都手动实现iter,next稍稍有点麻烦,所需的代码也是比较客观.在python中也能通过借助yield的方式来实现一个迭代器.yield有一个关键的作能,它能够中断当前的执行逻辑,保持住现场(各种值的状态,执行的位置等等),返回相应的值,下一次执行的时候能够无缝的接着上次的地方继续执行,如此循环反复知道满足事先设置的退出条件或者发生错误强制被中断. 其具体功能是可以当return使用,从函数里返回一个值,不同之处是用yield返

  • Python使用设计模式中的责任链模式与迭代器模式的示例

    责任链模式 责任链模式:将能处理请求的对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理请求为止,避免请求的发送者和接收者之间的耦合关系. #encoding=utf-8 # #by panda #职责连模式 def printInfo(info): print unicode(info, 'utf-8').encode('gbk') #抽象职责类 class Manager(): successor = None name = '' def __init__(self, name):

  • Python 迭代器工具包【推荐】

    原文:https://git.io/pytips 0x01 介绍了迭代器的概念,即定义了 __iter__() 和 __next__() 方法的对象,或者通过 yield 简化定义的"可迭代对象",而在一些函数式编程语言(见 0x02 Python 中的函数式编程)中,类似的迭代器常被用于产生特定格式的列表(或序列),这时的迭代器更像是一种数据结构而非函数(当然在一些函数式编程语言中,这两者并无本质差异).Python 借鉴了 APL, Haskell, and SML 中的某些迭代器

  • Python 迭代器与生成器实例详解

    Python 迭代器与生成器实例详解 一.如何实现可迭代对象和迭代器对象 1.由可迭代对象得到迭代器对象 例如l就是可迭代对象,iter(l)是迭代器对象 In [1]: l = [1,2,3,4] In [2]: l.__iter__ Out[2]: <method-wrapper '__iter__' of list object at 0x000000000426C7C8> In [3]: t = iter(l) In [4]: t.next() Out[4]: 1 In [5]: t.

  • python迭代器实例简析

    本文实例讲述了python迭代器的简单用法,分享给大家供大家参考.具体分析如下: 生成器表达式是用来生成函数调用时序列参数的一种迭代器写法 生成器对象可以遍历或转化为列表(或元组等数据结构),但不能切片(slicing).当函数的唯一的实参是可迭代序列时,便可以去掉生成器表达式两端>的圆括号,写出更优雅的代码: >>>> sum(i for i in xrange(10)) 45 sum声明: sum(iterable[, start]) Sums start and the

  • 浅谈python迭代器

    1.yield,将函数变为 generator (生成器) 例如:斐波那契数列 def fib(num): a, b, c = 1, 0, 1 while a <= num: yield c b, c = c, b + c a += 1 for n in fib(10): print(n, end=' ') # 1 1 2 3 5 8 13 21 34 55 2.Iterable 所有可以使用for循环的对象,统称为 Iterable (可迭代) from collections import

  • Python迭代器定义与简单用法分析

    本文实例讲述了Python迭代器定义与简单用法.分享给大家供大家参考,具体如下: 一.什么是迭代器 迭代,顾名思义就是重复做一些事很多次(就现在循环中做的那样).迭代器是实现了__next__()方法的对象(这个方法在调用时不需要任何参数),它是访问可迭代序列的一种方式,通常其从序列的第一个元素开始访问,直到所有的元素都被访问才结束. [注意]:迭代器只能前进不能后退 [迭代器的优点]: 使用迭代器不要求事先准备好整个迭代过程中的所有元素.迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之

  • 分享8个非常流行的 Python 可视化工具包

    喜欢用 Python 做项目的小伙伴不免会遇到这种情况:做图表时,用哪种好看又实用的可视化工具包呢?之前文章里出现过漂亮的图表时,也总有读者在后台留言问该图表时用什么工具做的.下面,作者介绍了八种在 Python 中实现的可视化工具包,其中有些包还能用在其它语言中.快来试试你喜欢哪个? 用 Python 创建图形的方法有很多,但是哪种方法是最好的呢?当我们做可视化之前,要先明确一些关于图像目标的问题:你是想初步了解数据的分布情况?想展示时给人们留下深刻印象?也许你想给某人展示一个内在的形象,一个

  • Python迭代器和生成器定义与用法示例

    本文实例讲述了Python迭代器和生成器定义与用法.分享给大家供大家参考,具体如下: 迭代器 iter() 迭代器是访问集合中元素的一种方式,迭代器 object 从集合中的第一个元素开始访问,直到所有的元素被访问完成. 所以迭代器的特点是:只能往前,不能后退 迭代器的优点:不需要提前准备整个迭代器中的所有元素,仅仅迭代到某个元素时才计算该元素,而之前或者之后,元素可以不存在或者销毁.因为这个特点,迭代器特别适合遍历文件比较大或者无限的集合. 总结下迭代器 iter()的特点吧: 1.访问者不需

  • Python迭代器与生成器基本用法分析

    本文实例讲述了Python迭代器与生成器基本用法.分享给大家供大家参考,具体如下: 迭代器 可以进行for循环的数据类型包括以下两种: 1. 集合数据类型比如list,tuple,dict,str等 2. 另一种是生成器 而他们都是可迭代对象,称为Iterable Isinstandce()可以用来判断对象是否为可迭代对象 >>> from collections import Iterable >>> isinstance([], Iterable) True >

  • Python迭代器与生成器用法实例分析

    本文实例讲述了Python迭代器与生成器用法.分享给大家供大家参考,具体如下: 迭代器,迭代的工具 什么是迭代器? 指的是一个重复的过程,每一次重复称为一次迭代,并且每一次重复的结果是下一次重复的初始值 l=['a','b','c'] count=0 while count <len(l): print(l[count]) count+=1 为什么要有迭代器 1.对于序列类型:str,list,tuple,可以依赖索引来迭代取值 2.对于dict,set,文件,python必须为我们提供一种不依

  • python迭代器常见用法实例分析

    本文实例讲述了python迭代器常见用法.分享给大家供大家参考,具体如下: 迭代器 迭代是访问集合元素的一种方式.迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 1. 可迭代对象 我们已经知道可以对list.tuple.str等类型的数据使用for-in-的循环语法从其中依次拿到数据进行使用,我们把这样的过程称为遍历,也叫迭代. 但是,是否所有的数据类型都可以放到for-in-的语句中,然后让for-in-每次从中

随机推荐