红毛丹,python规范库(一)itertools(文末附PDF),同一首歌

python规范库系列教程(一)——itertools

python进阶教程熊猫加速器

机器学习

进入正文

01

声明

functools, itertools, operator是Python规范库为咱们供给的支撑函数式编程的三大模块,合理的运用这三个模块,咱们能够写出愈加简练可读的Pythonic代码,本次的系列文章将京东自营介绍并运用这些python自带的规范模块,系列文章分篇连载,此为第一篇,有爱好的小伙伴后边记住重视学习哦!

python规范库(一)itertools(文末附PDF)

高效的itertools模块

咱们知道,迭代器的特色是:慵懒求值(Lazy evaluation),即只有当迭代至某个值时,它才会被核算,这个特色使得迭代器特别适合于遍历大文件或无限调集等,由于咱们不必一次性将它们存储在内存中。

Python 内置的 itertools 模块包括了一系列用来发生不同类型迭代器的函数或类,这些函数的回来都是一个迭代器,咱们能够经过 for 循环来遍历取值,也能够运用 next() 来取值。

itertools 模块供给的迭代器函数有以下几种类型:

  • 无限迭代器:生成一个无限序列,比方自然数序列 1, 2, 3, 4, ...;
  • 有限迭代器:接纳一个或多个序列(sequence)作为参数,进行组合、分组和过滤等;
  • 组合生成器:序列的摆放、组合,求序列的笛卡儿积等;

目录

一 无限迭代器

1.1 count

1.2 cycle

1.3 repeat

二 有限迭代器

2.1 chain

2.2 compress

2.3 dropwhile

2.4 groupby

2.5 ifilter

2.6 ifilterfalse

2.7 islice

2.8 imap

2.9 tee

2.10 takewhile红毛丹,python规范库(一)itertools(文末附PDF),同一首歌

2.11 izip

2.12 izip-longest

三 组合生成器

3.1 product

3.2 permutations

3.3 combinations

3.4 combinations-with-replacement

四 总结

01

无限迭代器

itertools 模块供给了三个函数(事实上,它们是类)用于生成一个无限序列迭代器:

  • count(firstval=0, step=1)创立一个从 firstval (默许值为 0) 开端,以 step (默许值为 1) 为步长的的无限整数迭代器
  • cycle(iterable)对 iterable 中的元素重复履行循环,回来迭代器
  • repeat(object [唐朝好地主,times]重复生成 object,假如给定 times,则重复次数为 times,不然为无限红毛丹,python规范库(一)itertools(文末附PDF),同一首歌

下面,让咱们看看一些比如。

无限迭代器

1.1 count

count() 接纳两个参数,第一个参数指定开端值,默以为 0,第二个参数指定步长,默以为 1:

>>> import itertools

>>>

>>> nums = itertools.count()

>>> for i in nums:

... if i > 6:

... 红毛丹,python规范库(一)itertools(文末附PDF),同一首歌break

... print i

...

0

1

2

3

4

5

6

>>> nums = itertools.count(10, 2) # 指定开端值和步长

>>> for i in nums:

... if i > 20:

... break

... print i

...

10

12

14

16

18

20

无限迭代器

1.2 cycle

cycle() 用于对 iterable 中的元素重复履行循环:

>>> import itertools

>>>

>>> cycle_strings = itertools.cycle('ABC')

>>> i = 1

>>> for string in cycle_strings:

... if i == 10:

... break

... print i, string

... i += 1

...

1 A

2 B

3 C

4 A

5 B

6 C

7 A

8 B

9 C

无限迭代器

1.3 repeat

repeat() 用于重复生成一个 object:

>>> import itertools

>>>

>>> for item in itertools.repeat('hello world', 3):

... print item

...

hello world

hello world

hello world

>>>

>>> for item in itertools.repeat([1, 2, 3, 4], 3):

... print item

...

[1, 2, 3, 4]

[1, 2, 3, 4]

[1, 2, 3, 4]

02

有限迭代器

itertools 模块供给了多个函数(类),接纳一个或多个迭代目标作为参数,对它们进行组合、分组和过滤等:

  • chain()
  • compress()
  • dropwhile()
  • groupby()
  • ifilter()
  • ifilterfalse()
  • islice()
  • imap()
  • starmap()
  • tee()
  • takewhile()
  • izip()
  • izip_longest()

有限迭代器

2.1 chain

chain 的运用方式如下:

chain(iterable1, iterable2, iterable3, ...)

chain 接纳多个可迭代目标作为参数,将它们『衔接』起来,作为一个新的迭代器回来。

>>> from itertools import chain

>>>

>>> for item in chain([1, 2, 3], ['a', 'b', 'c']):

... print item

...

1

2

3

a

b

c

chain 还有一个常见的用法:

chain.from_iterable(iterable)

接纳一个可迭代目标作为参数,回来一个迭代器:

>>>挂号信查询 from itertools import chain

>>>

>>> string = chain.from_iterable('ABCD')

>>> string.next()

'A'

有限迭代器

2.2 compress

compress 的运用方式如下:

compress(data, selectors)

compress 可用于对数据进行挑选,当 selectors 的某个元素为 tr迅疾猎手ue 时,则保存 data 对应方位的元素,不然去除:

>>> from itertools import compress

>>>

>>> list(compress('ABCDEF', [1, 1, 0, 1, 0, 1]))

['初中女生视频A', 'B', 'D', 'F']

>>> list(compress('ABCDEF', [1, 1, 0, 1]))

['A', 'B', 'D']

>>> list(compress('ABCDEF', [True, False, True]))

['A', 'C']

有限迭代器

2.3 dropwhile

dropwhile 的运用方式如下:

dropwhile(predicate, iterable)

其间,predicate 是函数,iterable 是可迭代目标。关于 iterable 中的元素,假如 predicate(item) 为 true,则丢掉该元素,不然回来该项及一切后续项。

>>> from itertools import drop君迪影投while

>>>

>>> list(dropwhile(lambda x: x < 5, [1, 3, 6, 2, 1]))

[6, 2, 1]

>>>

>>> list(dropwhile(lambda x: x > 3, [2, 1, 6, 5, 4]))

[2, 1, 6, 5, 4]

有限迭代器

2.4 groupby

groupby 用于对序列进行分组,它的运用方式如下:

groupby(iterable[, keyfunc])

其间,iterable 是一个可迭代目标,keyfunc 是分组函数,用于对 iterable 的接连项进行分组,假如不指定,则默许对 iterable 中的接连相同项进行分组,回来一个 (key, sub-iterator) 的迭代器。

>>> from itertools import groupby

>>>

>>> for key, value_iter in groupby('aaabbbaaccd'):

... print key, ':', list(value_iter)

...

a : ['a', 'a', 'a']

b : ['b', 'b', 'b']

a : ['a', 'a']

c : ['c', 'c']

d : ['d']

>>>

>>> data = ['a', 'bb', 'ccc', 'dd', 'eee', 'f']

>>> for key, value_iter in groupby(data, len): # 运用 len 函数作为分组函数

... print key, ':', list(value_iter)

...

1 : ['a']

2 : ['bb']

3 : ['ccc']

2 : ['dd']

3 : ['eee']

1 : ['f']

>>>

>>> data = ['a', 'bb', 'cc', 'ddd', 'eee', 'f']

>>> for key, value_iter in groupby(data, len):

... print key, ':', 热情床吻戏list(value_iter)

...

1 : ['a']

2 : ['bb', 'cc']

3 : ['ddd', 'eee']

1 : ['f']

有限迭代器

2.5 ifilter

ifilter 的运用方式如下:

ifilter(function or None, sequence)

将 iterable 中 function(item) 为 True 的元素组成一个迭代器回来,假如 function 是 None,dfu则回来 iterable 中一切核算为 True 的项。

>>> from itertools import ifilter

>>>

>>> list(ifilter(lambda x: x < 6, range(10)))

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

>>>

>>> list(ifilter(None, [0, 1, 2, 0, 3, 4]))

[1, 2, 3, 4]

有限迭代器

2.6 ifilterfalse

ifilterfalse 的运用方式和 ifilter 相似,它将 iterable 中 function(item) 为 False 的元素组成一个迭代器回来,假如 function 是 None,则回来 iterable 中一切核算为 False 的项。

>>> from itertools import ifilterfalse

>>>

>>> list(ifilterfalse(lambda x: x < 6, range(10)))

[6, 7, 8, 9]

>>>

>>> list(ifilter(None, [0, 1, 2, 0, 3, 4]))

[0, 0]

有限迭代器

2.7 islice

islice 是切片挑选,它的运用方式如下:

islice(iterable, [start,] stop [, step])

其间,iterable 是可迭代目标,start 是开端索引,stop 是完毕索引,step 是步长,start 和 step 可选。

>>> from itertools import count, islice

>>>

>>> list(islice([10, 6, 2, 8, 1, 3, 9], 5))

[10, 6, 2, 8, 1]

>>>

>>> list(islice(count(), 6))

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

>>>

>>> list(islice(count(), 3, 10))

[3, 4, 5, 6, 7, 8, 9]

>>> list(islice(count(), 3, 10 ,2))

[3, 5, 7, 9]

有限迭代器

2.8 imap

imap 相似 map 操作,它的运用方式如下:

imap(func, iter1, iter2, iter3, ...)

imap 回来一个迭代器,元素为func(i1, i2, i3, ...),i1,i2 等分别来源于 iter, iter2。

>>> from itertools im剑南春酒port imap

>>>

>>> imap(str, [1, 2, 3, 4])

>>>

>>> list(im杭州公交ap(str, [1, 2, 3, 4]))

['1', '2', '3', '4'红毛丹,python规范库(一)itertools(文末附PDF),同一首歌]

>>>

>>> list(imap(pow, [2, 3, 10], [4, 2, 3]))

[16, 9, 1000]

有限迭代器

2.9 tee

tee 的运用方式如下:

tee(iterable [,n])

tee 用于从 iterable 创立 n 个独立的迭代器,以元组的方式回来,n 的默许值是 2。

>>> from itertools import tee

>>>

>>> tee('abcd') # n 默以为 2,创立两个独立的迭代器

(, )

>>>

>>> iter1, iter2 = tee('abcde')

>>> list(iter1)

['a', 'b', 'c', 'd', 'e']

>>> list(iter2)

['a', 'b', 'c', 'd', 'e']

>>>

>>> tee('abc', 3) # 创立三个独立的迭代器

(, , )

有限迭代器

2.10 takewhile

takewhile 的运用方式如下:

takewhile(predicate, iterable)

其间,predicate 是函数,iterable 是可迭代目标。关于 iterable 中的元素,假如 predicate(item) 为 true,则保存该元素,只需 predicate(item) 为 false,则当即中止迭代。

>>> from itertools import takewhile

>>>

>>> list(takewhile(lambda x: x < 5, [1, 3, 6, 2, 1]))

[1, 3]

>>> list(takewhile(lambda x: x > 3, [2, 1, 6, 5, 4]))

[]

有限迭代器

2.11 izip

izip 用于将多个可迭代目标对应方位的元素作为一个元组,将一切元组『组成』一个迭代器,并回来。它的运用方式如下:

izi尹均相p(iter1, iter2, ..., iterN)

假如某个可迭代目标不再生成值,则迭代中止。

>>> from itertools import izip

>>>

>>> for item in izip('ABCD', 'xy'):

.桐城.. print item

...

('A', 'x')

('B', 'y')

>>> for item in izip([1, 2, 3], ['a', 'b', 'c', 'd', 'e']):

... print item

...

(1, 'a')

(2, 'b')

(3, 'c')

有限迭代器

2.12 izip-longest

izip_longest 跟 izip 相似,但迭代进程会继续到一切可迭代目标的元素都被迭代完。它的方式如下:

izip_longest(iter1, iter2, ..., iterN, [fillvalue=None])

假如有指定 fillvalue,则会用其填充缺失的值,不然为 None。

>>> from itertools import izip_longest

>>>

>>> for item in izip_longest('ABCD', 'xy'):

... print item

...

('A', 'x')

('B', 'y')

('C', None)

('D', None)

>>>

>>> for item in izip_longest('ABCD', 'xy', fillvalue='-'):

... print item

...

('A', 'x')

('B', 'y')

('C', '-')

('D', '-')

03

组合生成器

itertools 模块还供给了多个组合生成器函数,用于求序列的摆放、组合等:

  • product
  • permutations
  • combinations
  • combinations_with_replacement

组合生成器

3.1 product

product 用于求多个可迭代目标的笛卡尔积,它跟嵌套的 for 循环等价。它的一般运用方式如下:

product(iter1, iter2, ... iterN, [repeat=1])

其间,repeat 是一个关键字参红毛丹,python规范库(一)itertools(文末附PDF),同一首歌数,用于指定重复生成序列的次数,

>>> from itertools import pr红毛丹,python规范库(一)itertools(文末附PDF),同一首歌oduct

>>>

>>> for item in product('ABCD', 'xy'):

... print item

...

('A', 'x')

('A', 'y')

('B', 'x')

('B', 'y')

('C', 'x')

('C', 'y')

('D', 'x')

('D', 'y')

>>>

>>> list(电视直播播放器product('ab', range(3)))

[('a', 0), ('a', 1), ('a', 2), ('b', 0), ('b', 1), ('b', 2)]

>>>

>>> list(product((0,1), (0,1), (0,1)))

[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1前方)]

>>>

>>> list(product('ABC', repeat=2))

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

>>>

组合生成器

3.2 permutations

permutations 为你写诗用于生成一个摆放,它的一般运用方式如下:

permutations(iter杨会珍able[, r])

其间,r 指定生成摆放的元素的长度,假如不指定,则默以为可迭代目标的元素长度。

>>> from itertools import permutations

>>>

>>> permut简小茶ations('ABC', 2)

>>>

>>> list(permutations('ABC', 2))

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

>>>

>>> list(permutations('ABC'))

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

>>>

组合生成器

3.3 combinations

combinations 用于求序列的组合,它的运用方式如下:

combinations(iterable, r)

其间,r 指定生成组合的元素的长度。

>>> from itertools import combinations

>>>

>>> list(combinations('ABC', 2))

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

组合生成器

3.4 combinations-with-replacement

combinations_with_replacement 和 combinations 相似,但它生成的组合包括本身元素。

>>> from itertools import combinations_with红毛丹,python规范库(一)itertools(文末附PDF),同一首歌_replacement

>>>

>>> list(combinations_w公主猎爱三十六计ith_replacement('ABC', 2))

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

04

总结

itertools 模块供给了许多用于发生多种类型迭代器的函数,它们的回来值不是 list,而是迭代器。这个规范库的灵敏运用能够大大提高咱们的编程功率哦!

python规范库(一)itertools(文末附PDF)

欢迎我们多转发文章和重视小编,Python PDF电子书私信小编(学习)就可拿到!