我有一个函数可以接受一个数字列表、一个数字元组或 s 个数字字符串和一个变量 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
但是,当传入生成器时,我对如何继续生成所需的输出感到困惑。