屈服在python 2.7中有什么作用?

时间:2012-03-26 10:34:29

标签: python string generator python-2.7 yield

  

可能重复:
  The Python yield keyword explained

好吧,我可能很难说这个问题,但这就是我的情况。

我在Python 2.7中有这行代码,我试图理解:

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

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

我非常有信心.encode("ascii")只是将yield的输出转换为ascii。

我完全在海上就是yield (padding_zeros + number_string)所做的事情。

我知道它启动了一个生成器,但我花了很多时间在线搜索并阅读语法,但我仍然无法确定生成器实际上做什么。这是我第一次看python没有帮助(我的最终目标是将此代码转换为C#)。

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

对于进一步的上下文,这是该行代码出现的块:

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正是它的声音 - 一个表示某事物最大长度的数字)

提前感谢任何和所有的答案(即使他们告诉我不要这么费劲):)

编辑:非常感谢答案 - 即使我只能选择一个作为最好的答案,他们都非常有帮助。还要感谢评论 - 正如其中一些人所指出的那样,What does the "yield" keyword do in Python?是一个非常好的关于产量,生成器和迭代的一般指南,即使我没有找到它对我的具体情况的答案:)

4 个答案:

答案 0 :(得分:6)

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

那条线实际上做了什么?不是很多:

它连接padding_zerosnumber_string,然后将结果编码为ASCII。在Python 2.7中哪一个是无操作,因为字符串是ASCII开头(根据定义它只包含ASCII数字)。

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

答案 1 :(得分:3)

yield就像生成器中的返回一样。

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

生成器的意思是可以将其作为x = next(generator)x = generator.next()调用,并且每次都将从生成器内的yield中接收值。生成器也是可迭代的,因此它们可以用作循环的源:for x in generator: print x

与C#类似,.运算符在运算符左侧出现的对象上调用其右侧命名的方法。因此,(padding_zeros + number_string).encode("ascii")encode的结果调用(padding_zeros + number_string)

有关encode的含义,请参阅此处:http://docs.python.org/library/stdtypes.html#str.encode

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

答案 2 :(得分:1)

在这种情况下,yield用于执行延迟评估。下一个代码大致相同:

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())

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()

您可以在代码翻译中关注第二个。

答案 3 :(得分:0)

生成器是一个statemachine,它在python中实现迭代器接口或__iter__。 它会在“yield”之后等待,直到你调用next()为止。

试试这个:

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