python 2.7有什么收益?
可能重复:
解释了Python yield关键字
好吧,我可能很糟糕地表述了这个问题,但这是我的情况。
我在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)
是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
正是它听起来像 - 一个数字表示最大长度的东西)
提前感谢任何和所有答案(即使他们告诉我不要成为这样一个狡猾的noob):)
编辑:非常感谢答案 - 即使我只能选择一个作为最好的答案,他们都非常有帮助。 还要感谢评论,正如其中一些人指出的那样,Python中的“yield”关键字是做什么的? 是一个非常好的通用指南,即使我没有找到答案来回答我的具体情况,也可以生成生成器和迭代。
好,你知道发电机,所以yield
部分不需要解释。 精细。
那么这条线实际上做了什么? 不是很多:
它连接padding_zeros
和number_string
,然后将结果编码为ASCII。 在Python 2.7中,它是无操作的,因为字符串是以ASCII开始的(根据定义,它只包含ASCII数字)。
在Python 3中,它会有所不同; 这里.encode()
会将字符串转换为一个bytes
对象。 但在Python 2中,它没有任何意义。
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
。
有关encode
的含义,请参阅:http://docs.python.org/library/stdtypes.html#str.encode
对于语言参考(假设您使用的是Python 2):http://docs.python.org/reference/index.html
在这种情况下, 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()
你可以在你的代码翻译中跟着第二个。
链接地址: http://www.djcxy.com/p/1543.html