大家小时候可能玩过“谁”-“什么时候”-“在哪里”-“干什么”的游戏,这个游戏用Python来表述是这样的:
import random
who = ['王小一', '张小二', '李小三', '朱小四']
when = ['早上8点', '下午3点', '凌晨2点']
where = ['在厕所','在卧室', '在姐姐房间里', '在教室里']
do = ['拉屎', '抽烟', '打架']
print(random.choice(who), random.choice(when), random.choice(where), random.choice(do))
运行效果如下图所示:
现在,我想知道这些句子一共有哪些组合,应该怎么办呢?
最常见的写法是嵌套4个for循环:
who = ['王小一', '张小二', '李小三', '朱小四']
when = ['早上8点', '下午3点', '凌晨2点']
where = ['在厕所','在卧室', '在姐姐房间里', '在教室里']
do = ['拉屎', '抽烟', '打架']
for people in who:
for time in when:
for place in where:
for action in do:
print(people, time, place, action)
运行效果如下图所示:
这样写虽然可以实现效果,但显然4个for循环使得代码非常难看。
在Python中,对于这种情况,有现成的处理方法,那就是 itertools.product
计算可迭代对象的笛卡尔积。
它的使用方法为:
import itertools
who = ['王小一', '张小二', '李小三', '朱小四']
when = ['早上8点', '下午3点', '凌晨2点']
where = ['在厕所','在卧室', '在姐姐房间里', '在教室里']
do = ['拉屎', '抽烟', '打架']
for result in itertools.product(who, when, where, do):
print(''.join(result))
运行效果如下图所示:
itertools.product
可以接收非常无数个可迭代的对象,然后把他们想for循环嵌套一样拼接起来。