Напишите генератор или верните генератор?
Внутри класса контейнера, когда я хочу перебирать его элементы (или преобразования его элементов или подмножества его элементов), я могу либо написать генератор (например, f
), либо вернуть генератор (например, g
):
class SomeContainer:
def __init__(self):
self.data = [1, 'two', 3, 'four']
def f(self):
for e in self.data: yield e + e
def g(self):
return (e + e for e in self.data)
sc = SomeContainer()
for x in sc.f(): print(x)
for x in sc.g(): print(x)
Мне не нужно передавать информацию в генератор через send
.
Очевидно, что оба пути ведут себя одинаково (на поверхности).
-
Какой подход предпочтительнее и почему?
-
Какой подход создает меньше
накладные расходы или другие преимущества, которые я не вижу?
Ответы
Ответ 1
Понимание генератора (например, в g()
) будет немного быстрее.
Явные циклы (например, в f()
), вероятно, будут более читабельными, если ваша логика будет более сложной, чем в приведенном вами простом примере.
Кроме этого, я не могу представить никаких существенных различий.
Но помните, что они говорят:
Преждевременная оптимизация - это корень всего зла!