Следующий код python производит [(0, 0), (0, 7) ... (0, 693)] вместо ожидаемого списка кортежей, объединяющего все кратные 3 и кратные 7:Несогласованное поведение генераторов питона
multiples_of_3 = (i*3 for i in range(100))
multiples_of_7 = (i*7 for i in range(100))
list((i,j) for i in multiples_of_3 for j in multiples_of_7)
Этот код исправляет проблему:
list((i,j) for i in (i*3 for i in range(100)) for j in (i*7 for i in range(100)))
Вопросы:
- объект генератор, кажется, играет роль итератора я вместо предоставления объекта итератора каждый раз, когда должен быть указан список сгенерированный. Более поздняя стратегия, по-видимому, принимается объектами запроса .Net LINQ. Есть ли элегантный способ обойти это?
- Как работает вторая часть кода? Должен ли я понять, что итератор генератора не сбрасывается после прохождения через все кратные 7?
- Вам не кажется, что это поведение противоречит интуитивному, если не противоречивому?
Read: [Ключевое слово урока Python объяснено] (http://stackoverflow.com/questions/231767/the-python-yield-keyword-explained). – Bakuriu