10

在容器类中,当我想迭代它的项目(或者它的项目的转换,或者它的项目的子集)时,我可以编写一个生成器(like f)或返回一个生成器(like 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. 哪种方法更可取,为什么?

  2. 哪种方法会产生更少的开销或具有我没有发现的其他优势?

4

1 回答 1

2

生成器推导(例如 in g())会稍微快一些。

如果您的逻辑变得比您提供的简单示例更复杂,那么显式循环(例如 in f())可能更具可读性。

除此之外,我想不出任何实质性差异。

但请记住他们所说的:

过早优化是万恶之源!

于 2013-12-15T06:17:48.483 回答