Строка, которая разбивает ваш IDLE, - это строка:
list1 = list(product(a, repeat=b))
Почему?
itertools.product
возвращает Iterator
. Если вы напечатаете его, вы не увидите много:
print(product(a, repeat=len(a)))
<itertools.product object at 0x7f0d3b8363f0>
Вы можете по-прежнему использовать свой итератор в для l oop, не вызывая 'list`, как это:
a = list(letter_range("a", "z"))
it = product(a, repeat=len(a))
for value in it:
print(''.join(value))
Вам все равно придется прекратить выполнение этого скрипта, так как он будет спамить много текста!
Когда вы сейчас пишете что-то вроде x = list(it)
, вы говорите Python, что он потребляет все элементы из вашего итератора it
и сохраните их в переменной x
. Но поскольку ваш итератор создает так много элементов, ваша программа не будет работать, потому что у вас недостаточно ОЗУ.
Вот исправленная версия вашего кода. Он не обрабатывает sh, но завершается дружеским предупреждением с помощью перечисления .
from itertools import product
def letter_range(start, stop="{", step=1):
for ord_ in range(ord(start.lower()), (ord(stop.lower())) + 1, step):
yield chr(ord_)
a = list(letter_range("a", "z"))
it = product(a, repeat=len(a))
for i, value in enumerate(it):
print(''.join(value))
if i > 1000:
print("aborted. too many results")
break
Когда вы уверены, что результат - то, что вы хотите, просто удалите ' if'-оператор и выпейте кофе, пока работает ваша программа.