python标准库之函数式编程(1)

itertools 模块包含了一系列用来产生不同类型迭代器的函数或类,这些函数的返回都是一个迭代器,我们可以通过 for 循环来遍历取值,也可以使用 next() 来取值。

一、无限迭代器

1、整数迭代器

itertools.count() 接收两个参数,第一个参数指定开始值,默认为 0,第二个参数指定步长,默认为 1

1
2
3
4
5
6
7
8
9
10
11
12
13
import itertools

nums = itertools.count()
for i in nums:
if i > 6:
break
print(i)

nums = itertools.count(10, 2) # 指定开始值和步长
for i in nums:
if i > 30:
break
print(i)

2、元素迭代器

1
2
3
4
5
6
7
8
9
import itertools

cycle_strings = itertools.cycle('ABC')
i = 1
for string in cycle_strings:
if i == 10:
break
print(i, string)
i += 1

3、次数迭代器

1
2
3
4
import itertools

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

二、有限迭代器

1、锁链迭代器

itertools.chain 接收多个可迭代对象作为参数,将它们『连接』起来,作为一个新的迭代器返回。

1
2
3
4
import itertools

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

2、切片迭代器

1
2
3
4
5
6
7
8
import itertools

print(list(itertools.islice([10, 6, 2, 8, 1, 3, 9, 11], 5)))
# [10, 6, 2, 8, 1]
print(list(itertools.islice([10, 6, 2, 8, 1, 3, 9, 11], 3, 8)))
# [8, 1, 3, 9, 11]
print(list(itertools.islice([10, 6, 2, 8, 1, 3, 9, 11], 3, 8, 2)))
# [8, 3, 11]

3、分组迭代器

itertools.groupby 用于对序列进行分组,默认会将连续相同项进行分组。

1
2
3
4
5
6
7
8
import itertools

for key, value_iter in itertools.groupby('aaabbbaaccd'):
print(key, ':', list(value_iter))

data = ['a', 'bb', 'ccc', 'dd', 'eee', 'f']
for key, value_iter in groupby(data, len): # 使用 len 函数作为分组函数
print(key, ':', list(value_iter))

4、元素筛选迭代器

1
2
3
4
5
6
import itertools

print(list(itertools.compress('ABCDEF', [1, 1, 0, 1, 0, 1])))
# ['A', 'B', 'D', 'F']
print(list(itertools.compress('ABCDEF', [1, 1, 0, 1])))
# ['A', 'B', 'D']

5、条件过滤迭代器

(1)无中断的排他条件过滤
1
2
3
4
5
6
import itertools

print(list(itertools.filterfalse(lambda x: x < 6, range(10))))
# [6, 7, 8, 9]
print(list(itertools.filterfalse(lambda x: x > 8, [1, 2, 7, 9, 7, 5])))
# [1, 2, 7, 7, 5]
(2)有中断的排他条件过滤
1
2
3
4
5
6
import itertools

print(list(itertools.dropwhile(lambda x: x < 6, range(10))))
# [6, 7, 8, 9]
print(list(itertools.dropwhile(lambda x: x > 8, [9, 10, 7, 9, 7, 5]))) # 一旦扫描到不满足条件的元素便中止,报出剩余序列
# [7, 9, 7, 5]
(3)有中断的选中条件过滤
1
2
3
4
5
6
import itertools

print(list(itertools.takewhile(lambda x: x < 6, range(10))))
# [0, 1, 2, 3, 4, 5]
print(list(itertools.takewhile(lambda x: x > 8, [9, 10, 7, 9, 7, 5]))) # 一旦扫描到不满足条件的元素便中止,报出满足条件的部分
# [9, 10]

5、元组迭代器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import itertools

for item in itertools.zip_longest('ABCD', 'xy'):
print(item)
# ('A', 'x')
# ('B', 'y')
# ('C', None)
# ('D', None)

for item in itertools.zip_longest('ABCD', 'xy', fillvalue='-'):
print(item)
# ('A', 'x')
# ('B', 'y')
# ('C', '-')
# ('D', '-')

三、组合生成器

1、序列的笛卡尔积

1
2
3
4
5
6
7
8
9
10
11
12
import itertools

for item in itertools.product('ABCD', 'xy'):
print(item)
# ('A', 'x')
# ('A', 'y')
# ('B', 'x')
# ('B', 'y')
# ('C', 'x')
# ('C', 'y')
# ('D', 'x')
# ('D', 'y')

2、序列的组合

(1)不包含自身元素
1
2
3
4
5
6
7
import itertools

for item in itertools.combinations('ABC', 2):
print(item)
# ('A', 'B')
# ('A', 'C')
# ('B', 'C')
(2)可包含自身元素
1
2
3
4
5
6
7
8
9
10
import itertools

for item in itertools.combinations_with_replacement('ABC', 2):
print(item)
# ('A', 'A')
# ('A', 'B')
# ('A', 'C')
# ('B', 'B')
# ('B', 'C')
# ('C', 'C')

3、元素全排列(忽略序列次序)

1
2
3
4
5
6
7
8
9
10
import itertools

for item in itertools.permutations('ABC', 2):
print(item)
# ('A', 'B')
# ('A', 'C')
# ('B', 'A')
# ('B', 'C')
# ('C', 'A')
# ('C', 'B')