我有一个函数可以接受一个数字列表,一个数字元组,或一串数字和一个变量n,它会在传递的迭代中迭代时创建一个长度为n的元组列表。
此时它按预期工作:
numbers = [1, 2, 3, 4, 5, 6]
# numbers = (1, 2, 3, 4, 5, 6)
# numbers = '123456'
def window(iterable, n):
if n == 0:
return []
final = []
last = len(iterable) - (n - 1)
for start in range(0, last):
tup = tuple(numbers[start:start + n])
final.append(tup)
start += 1
return final
print(window(numbers, 2))
print()
print(window(numbers, 3))
print()
print(window(numbers, 4))
列表和字符串的示例输出:
[(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
[(1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6)]
[(1, 2, 3, 4), (2, 3, 4, 5), (3, 4, 5, 6)]
[('1', '2'), ('2', '3'), ('3', '4'), ('4', '5'), ('5', '6')]
[('1', '2', '3'), ('2', '3', '4'), ('3', '4', '5'), ('4', '5', '6')]
[('1', '2', '3', '4'), ('2', '3', '4', '5'), ('3', '4', '5', '6')]
现在我需要允许函数接受生成器,但仍然生成相同的样式输出。
前:
numbers = [1, 2, 3, 4, 5, 6]
squares = (n**2 for n in numbers)
window(squares, 3)
[(1, 4, 9), (4, 9, 16), (9, 16, 25), (16, 25, 36)]
如果按原样运行,我得到:
TypeError: object of type 'generator' has no len()
我理解为什么。我的问题是,我所能想到的只是“倾销'生成器输出到一个列表然后通过该函数运行它,这是蹩脚的。允许将生成器作为有效输入,然后将其耗尽到列表中是没有意义的。
我想出了如何识别是否传入了一个生成器:
import types
def window(iterable, n):
if n == 0:
return []
final = []
if isinstance(iterable, types.GeneratorType):
print('Gen')
else:
last = len(iterable) - (n - 1)
for start in range(0, last):
tup = tuple(numbers[start:start + n])
final.append(tup)
start += 1
return final
但是,当传入生成器时,我仍然不知道如何继续生成所需的输出。