Марио обнови решението на 30.03.2015 14:19 (преди над 9 години)
+from itertools import count, accumulate, islice
+
+
+def fibonacci():
+ current_number, next_number = 1, 1
+ while True:
+ yield current_number
+ current_number, next_number = next_number, current_number + next_number
+
+
+def is_prime(n):
+ return not any(divisor for divisor in range(2, n - 1) if n % divisor == 0)
+
+
+def primes():
+ next_prime = 2
+ while True:
+ yield next_prime
+ next_prime = next(filter(is_prime, count(next_prime + 1)))
+
+
+def alphabet(code=None, letters=None):
+ if letters is None:
+ letters = {
+ 'bg': 'абвгдежзийклмнопрстуфхцчшщъьюя',
+ 'lat': 'abcdefghijklmnopqrstuvwxyz'
+ }[code]
+ return (letter for letter in letters)
+
+
+def create_generator(generator_descriptor, generator_definitions):
+ generator = generator_definitions[generator_descriptor['sequence']]
+ generator_arguments = generator_descriptor.copy()
+ del generator_arguments['sequence']
+ del generator_arguments['length']
+ return generator(**generator_arguments)
+
+
+def intertwined_sequences(iterable, generator_definitions={}):
+ generator_definitions.update({
+ 'fibonacci': fibonacci, 'alphabet': alphabet, 'primes': primes
+ })
+ generators = {}
+
+ for generator_descriptor in iter(iterable):
+ sequence_name = generator_descriptor['sequence']
+
+ if sequence_name not in generators:
+ generators[sequence_name] = create_generator(generator_descriptor,
+ generator_definitions)
+ generator = generators[sequence_name]
+
+ for element in islice(generator, 0, generator_descriptor['length']):
+ yield element
Не всеки итеруем обект сам си е итератор. Например range
.
Ако може да пояснеш за коя точно част говориш защото не мога да разбера.
Функциите, които са стойности в generator_definitions
връщат итеруем обект, който може и да не е итератор, но със сигурност можеш да получиш итератор за него. От друга страна всеки итератор винаги е итератор сам на себе си.
Разбрах какво имаш предвид, но не виждам кода ми да прави такава презункция някъде.