好吧,我可能很难说这个问题,但这就是我的情况。
我在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?是一个非常好的关于产量,生成器和迭代的一般指南,即使我没有找到它对我的具体情况的答案:)答案 0 :(得分:6)
好的,你知道发电机,所以yield
部分不需要解释。细
那条线实际上做了什么?不是很多:
它连接padding_zeros
和number_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