x, y, x * y), values):
print('{} * {} = {}'.format(*i))
如果使用 map()
函数将是这种调用 f(i1,i2)
,而使用 starmap()
直接是 f(*i)
。
#OutPut
0 * 5 = 0
1 * 6 = 6
2 * 7 = 14
3 * 8 = 24
4 * 9 = 36
3.产生新值
count()
函数会返回一个可以无限地产生连续整数的迭代器。第一个数字可以作为参数传递(默认值为0)。没有上限参数(有关对结果集的更多控制,请参阅内置的 range()
)。
from itertools import count
for i in zip(count(1), ['a', 'b', 'c']):
print(i)
此示例因为使用了 zip()
和有限长度列表参数所以才停止。
# OutPut
(1, 'a')
(2, 'b')
(3, 'c')
count()
的start和step参数可以是任何可以加在一起的数字值。
import fractions
from itertools import count
start = fractions.Fraction(1, 3)
step = fractions.Fraction(1, 3)
for i in zip(count(start, step), ['a', 'b', 'c']):
print('{}: {}'.format(*i))
本例中,起始点和步长来自 Fraction
(分数)模块的 fraction
对象。
# OutPut
1/3: a
2/3: b
1: c
cycle()
函数的作用是:返回一个迭代器,该迭代器重复无限地给出的参数的内容。因为它必须记住输入迭代器的全部内容,所以如果迭代器很长,它可能会消耗相当多的内存。
from itertools import cycle
for i in cycle(['a', 'b', 'c']):
print(i)
如果没有打断,它会无限循环下去。
# OutPut
a
b
c
a
b
...
repeat()
函数的作用是:返回一个迭代器,该迭代器每次访问时都会产生相同的值。
from itertools import repeat
for i in repeat('over-and-over', times=5):
print(i)
repeat()
返回的迭代器将不断返回数据,除非提供可选的times参数来限制次数。
# OutPut
over-and-over
over-and-over
over-and-over
over-and-over
over-and-over
当需要将某个固定值包含在其他迭代器的值中时,使用 repeat()
与 zip()
或 map()
组合会很有用。
from itertools import repeat, count
for i, s in zip(count(), repeat('over-and-over', 5)):
print(i, s)
在本例中,count值与 repeat()
返回的常量组合在一起。
此示例使用 map()
将从0到4的数字乘以2。
from itertools import repeat
for i in map(lambda x, y: (x, y, x * y), repeat(2), range(5)):
print('{:d} * {:d} = {:d}'.format(*i))
本例中 repeat()
不需要显式限制迭代次数,因为 range()
只返回五个元素, map()
在其任意输入结束时会停止处理。
# OutPut
2 * 0 = 0
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
4.过滤
dropwhile()
函数的作用是:返回一个迭代器,直到条件第一次为false时,该迭代器开始才产生输入迭代器的元素。
from itertools import dropwhile
def should_drop(x):
print('输入:', x)
return x < 1
for i in dropwhile(should_drop, [-1, 0, 1, 2, -2]):
print('产出:', i)
dropwhile()
不会过滤每个输入项; 当第一次条件为假后,便直接返回输入中的所有剩余项目。
# OutPut
输入: -1
输入: 0
输入: 1
产出: 1
产出: 2
产出: -2
与 dropwhile()
相反的是 takewhile()
。它返回一个迭代器,只要测试函数返回true, 该迭代器就返回输入迭代器中的项目。
from itertools import takewhile
def should_take(x):
print('输入:', x)
return x < 1
for i in takewhile(should_take, [-1, 0, 1, 2, -2]):
print('产生:', i)
一旦should_take()
返回 False
, takewhile()
就停止处理输入。
# OutPut
输入: -1
产生: -1
输入: 0
产生: 0
输入: 1
Python内置函数 filter()
是返回一个包含测试函数返回true的所有项的迭代器。
def check_item(x):
print('输入:', x)
return x < 1
for i in filter(check_item, [-1, 0, 1, 2, -2]):
print('产出:', i)
filter()
不同于 dropwhile()
和 takewhile()
的是,filter()
每个项目在返回之前都代入测试函数。
# OutPut
输入: -1
产出: -1
输入: 0
产出: 0
输入: 1
输入: 2
输入: -2
产出: -2
filterfalse()
返回一个迭代器,该迭代器只包含测试函数返回false的项。
from itertools import filterfalse
def check_item(x):
print('输入:', x)
return x < 1
for i in filterfalse(check_item, [-1, 0, 1, 2, -2]):
print('产出:', i)
测试函数 check_item()
和上例中的一样,但是返回的结果正好和 filter()
相反。
# OutPut
输入: -1
输入: 0
输入: 1
产出: 1
输入: 2
产出: 2
输入: -2
compress()
提供了另一种过滤可迭代内容的方法。它不再是调用函数,而是使用另一个迭代中的值来指示何时接受值何时忽略值。
from itertools import compress, cycle
every_third = cycle([False, False, True])
data = range(1, 10)
for i in compress(data, every_third):
print(i, end=' ')
compress()
的第一个参数是需要进行处理的可迭代数据,第二个参数是可迭代的生成的布尔值选择器,指示从数据输入中取出哪些元素(True产生值,False忽略)。
# OutPut
3 6 9
5.聚合
groupby()
函数返回一个迭代器,该迭代器生成由公共键聚合的值集。下面例子展示基于属性对相关值进行分组。
from itertools import groupby
import functools
import operator
import ppri