【问题标题】:How to define and use Python generators appropriately如何正确定义和使用 Python 生成器
【发布时间】:2010-04-07 03:25:23
【问题描述】:

我想从列表中定义一个生成器,一次输出一个元素,然后以适当的方式使用这个生成器对象。

a = ["Hello", "world", "!"]
b = (x for x in a)
c = next(b, None)
while c != None:
    print c,
    c = next(b, None)

这里的while 方法有什么问题或可改进之处吗?有没有办法避免在循环之前分配“c”?

谢谢!

【问题讨论】:

    标签: python generator while-loop


    【解决方案1】:

    为什么要使用while 循环?在 Python 中,for 循环绝对是为此设计的:

    a = ["Hello", "world", "!"]
    b = (x for x in a)
    for c in b:
        print c,
    

    如果您因某种原因被困在 while 实现上,您当前的实现可能是您能做的最好的,但它有点笨拙,您不觉得吗?

    【讨论】:

    • 当然。我不知道为什么我想象我创建的生成器的行为与实现的生成器有任何不同。 X_X
    【解决方案2】:

    澄清:您的意思是 generator expressions 而不是 generators -- 后者是一个包含至少一个 yield 语句的函数定义/表达。

    同意较早的海报...您应该对几乎所有内容都使用 for 循环。我很少使用 while 循环,它们被归类为简单的计数器或运行无限循环的服务器。 :-)

    您也可以将 genexp 与 for 循环放在同一行...

    a = ["Hello", "world", "!"]
    for c in (x for x in a):
        print c,
    

    ...因为 genexp 不能被重用。但是,它看起来不那么可读。此外,这也违背了本练习的目的。为什么不只迭代 a 本身?

    for c in ["Hello", "world", "!"]:
        print c,
    

    你已经用完内存来制作列表了;为什么要在不需要 nec 时创建一个 genexp?

    【讨论】:

    • 非常优雅的方法。至于“为什么不迭代列表”,练习的目的是学习将其用于列表既巨大(可能是 1 Go)并且要对对象进行操作(可能来自超过一份清单)。所以通过这种方法,我避免创建另一个巨大的列表。
    • 是的,同意。事实上,我试图鼓励人们不要一开始就创建第一个列表(或任何列表)!如果您可以从迭代器、生成器或 genexp 开始,那么您已经赢了! :-) 这将是某种博客文章或 InformIT informit.com/topics/topic.aspx?st=66503 上的文章,因为我已经写了大部分内容。
    猜你喜欢
    • 2021-02-04
    • 2015-03-08
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    相关资源
    最近更新 更多