我们可以使用yield函数来方便的将一个列表分割成n分,写成divide_iter(lst, n)的接口形式。我们这里注意到yield会把返回值依次存储到生成器generator中,并且把while循环走完。
要注意的是,这里我们还需要重新掌握以下知识点:
1.列表的切片操作 lst[i*div:(i-1)*div]
2.cel函数获得小数的进位
3.len获得list的长度
from math import ceil
def divide_iter(lst, n):
if n<=0:
yield lst
return
i,div = 0, ceil(len(lst) / n)
while i<n:
yield lst[i*div :(i+1)*div]
i += 1
print(i)
gen = divide_iter([1,2,3,4,5],0)
print(gen)
print(list(gen))
gen = divide_iter([1,2,3,4,5],2)
print(list(gen))
输出结果如下:
<generator object divide_iter at 0x000000000239F1A8>
[[1, 2, 3, 4, 5]]
1
2
[[1, 2, 3], [4, 5]]
[Finished in 1.2s]
如果我们使用for循环来打印生成器中的数据,则会得到以下的结果:
for g in gen:
print(g)
[1, 2, 3]
1
[4, 5]
2
[Finished in 0.9s]
所以大胆猜想:for循环其实就是对in后面的生成其逐步执行next操作,不知道对不对。