当我们需要循环迭代一个序列时,可以使用Python内置函数cycle()
。cycle()
能够将一个序列无限循环下去,直到我们主动停止它。
cycle()
函数的使用方法
cycle()
函数需要一个序列作为参数,可以是字符串、列表、元组等可迭代对象。
cycle(iterable)
返回值是一个生成器对象(generator),可以使用next()
函数或for
循环遍历生成器的每个元素。
以下是一个简单的例子:
from itertools import cycle
colors = cycle(['red', 'yellow', 'green'])
for i in range(10):
print(next(colors))
输出结果为:
red
yellow
green
red
yellow
green
red
yellow
green
red
上述代码中,我们使用cycle()
将一个列表['red', 'yellow', 'green']
转换成了一个生成器colors
。然后在for
循环中,使用next()
函数每次取出一个元素输出。
当生成器被迭代完后,它会从头开始重新循环。
代码实例
实例1:无限滚动的轮班表
我们有一个员工名单的列表,需要将它们按照一定规律轮班。具体需求如下:
- 轮班周期为4天,4天后重新开始轮班;
- 每个员工至少要轮班一次;
- 轮班的顺序需要从列表的最后一个员工开始依次往前。
from itertools import cycle
employee_list = ['王五', '李四', '张三', '赵六']
employee_cycle = cycle(employee_list[::-1])
for i in range(12):
print(next(employee_cycle))
解释如下:
- 首先,我们将员工列表反转(
[::-1]
),从而让最后一个员工排在列表的第一位。 - 然后,使用
cycle()
将员工列表转换为一个无限循环的生成器employee_cycle
。 - 最后,使用
for
循环遍历cycle()
生成器,输出12个员工的名字。这样,经过3次循环,所有员工都已经完成了至少一次轮班。
输出结果为:
王五
赵六
张三
李四
王五
赵六
张三
李四
王五
赵六
张三
李四
实例2:在列表中查找循环节
在一个数组中,存在一个循环节,需要写一个函数来查找这个循环节的长度和周期。例如,在下面这个列表中:
data = [1, 3, 5, 1, 3, 5, 1, 3, 5]
其中的循环节为[1, 3, 5]
,长度为3,周期为3。
代码如下所示:
from itertools import cycle
def find_cycle(data):
for i in range(1, len(data)):
if data[i:] == data[:len(data)-i]:
cycle_length = i
cycle = data[:i]
return cycle_length, cycle
cycle_cycle = cycle(data)
for i in range(len(data)):
sequence = [next(cycle_cycle) for _ in range(len(data))]
if sequence == data:
cycle_length = i + 1
cycle = data[:i+1]
return cycle_length, cycle
cycle_length, cycle = find_cycle([1, 3, 5, 1, 3, 5, 1, 3, 5])
print("The length of cycle is", cycle_length)
print("The cycle is", cycle)
流程说明如下:
- 首先,我们写了一个
find_cycle()
函数,将需要查找循环节的列表作为输入参数; - 然后,我们使用
for
循环依次从列表的第二个元素开始遍历,如果存在一个子列表等于原列表的前缀,那么它们之间的部分就是循环节。如果找不到,说明原始列表就是循环节。 - 最后,我们使用
cycle()
生成一个无限循环的序列,然后每次从中取出一个等于原列表长度的子序列,比较是否与原列表相等。如果是,那么这个子序列就是循环节。
输出结果为:
The length of cycle is 3
The cycle is [1, 3, 5]
以上是cycle()
函数的详细讲解及使用方法示例。