关于字符串:在Python2.7中,yield做什么?

What does yield do in python 2.7?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
The Python yield keyword explained

好吧,我可能把问题说得很糟糕,但这就是我的处境。

我在python 2.7中有这一行代码,我试图理解它:

1
yield (padding_zeros + number_string).encode("ascii")

在这行代码中,padding_zeros是一个变量数为'0'的字符串,number_string是一个字符串形式的数字,可以是0到10000之间的任何数字。

我很有信心,.encode("ascii")只是将收益率的输出转换为ASCII。

我完全沉浸在茫茫大海中的是江户一号(3号)的所作所为。

我知道它启动了一个生成器,但是我花了很多时间在网上搜索和阅读语法,但是我仍然无法计算生成器的实际功能。这是我第一次看Python(我的最终目标是将此代码转换为C),这并没有帮助。

所以,基本上,请有人能给我解释一下这行代码的作用吗?它只是把两个字符串加在一起,还是做了一些更复杂的事情?

对于进一步的上下文,这是代码行出现在以下位置的块:

1
2
3
4
5
for current_length in range(4, max_length + 1):
    for i in range(0, pow(10, current_length)):
        number_string = str(i)
        padding_zeros ="0" * (current_length - len(number_string))
        yield (padding_zeros + number_string).encode("ascii")

(max_length正是它听起来的样子——一个表示某事物最大长度的数字)

提前感谢所有的回答(即使他们告诉我不要这么无聊):)

编辑:非常感谢你的回答-尽管我只能选一个最好的答案,但是他们都很有帮助。感谢您的评论——正如他们中的一些人指出的那样,"yield"关键字在Python中做了什么?这是一个非常好的一般指南,以产量,生成器和迭代,即使我没有找到一个答案,我的具体情况:)


好吧,你知道发电机,所以yield部分不需要解释。好的。

那这条线实际上是做什么的呢?不太多:

它连接padding_zerosnumber_string,然后将结果编码为ASCII。在python 2.7中,它是一个no-op,因为字符串以ASCII开头(根据定义,它只包含ASCII数字)。

在python 3中,它是不同的;在这里,.encode()将字符串转换为bytes对象。但是在python 2中,它没有任何意义。


yield就像发电机的回路。

在执行yield时,停止执行生成器函数,并返回值。不同之处在于,当再次调用生成器时,执行将在yield语句处重新启动,并继续执行,直到命中另一个yield、引发(未处理)异常或命中returnreturn或异常将终止发电机。

发电机的要点是,可以将其调用为x = next(generator)x = generator.next(),并且每次都将从发电机内部的产量中获得值。发电机也是不可重复的,因此它们可以用作回路的源:for x in generator: print x

就像在C中一样,.操作符调用其右侧在操作符左侧出现的对象上命名的方法。因此,(padding_zeros + number_string).encode("ascii")根据(padding_zeros + number_string)的结果调用encode

有关encode的含义,请参见:http://docs.python.org/library/stdtypes.html_str.encode

对于语言引用(假设您使用的是python 2):http://docs.python.org/reference/index.html


在这种情况下,使用yield执行延迟评估。接下来的代码大致相当:

1
2
3
4
5
6
7
8
def f(...):
    for current_length in range(4, max_length + 1):
        for i in range(0, pow(10, current_length)):
            number_string = str(i)
            padding_zeros ="0" * (current_length - len(number_string))
            yield (padding_zeros + number_string).encode("ascii")

result = list(f())

对战

1
2
3
4
5
6
7
8
9
10
def f(...):
    result = list()
    for current_length in range(4, max_length + 1):
        for i in range(0, pow(10, current_length)):
            number_string = str(i)
            padding_zeros ="0" * (current_length - len(number_string))
            result.append((padding_zeros + number_string).encode("ascii"))
    return result

result = f()

在代码翻译中,您只需遵循第二个步骤。


生成器是一个状态机,它实现了迭代器接口或python中的"iter"。它将在"yield"之后等待,直到对其调用next()。

试试这个:

1
2
3
4
5
6
7
8
9
10
def my_gen():
    for current_length in range(4, max_length + 1):
        for i in range(0, pow(10, current_length)):
            number_string = str(i)
            padding_zeros ="0" * (current_length - len(number_string))
            print"generate %s" % i
            yield (padding_zeros + number_string).encode("ascii")

for i in my_gen():
    print"iterate %s" % i