回报是否优于收益?从我读过它可以。在这种情况下,我无法从if语句获取迭代。基本上该程序所做的是取两点,即开始和结束。如果这两个点相距至少十英里,则需要随机抽样。显示的最终if语句适用于从开始点开始的前20英里,begMi。 nCounter.length = 10并且是一个类成员。所以问题是,如何将代码调整到return语句的工作位置而不是yield?或者在这种情况下收益率是否合理?
def yielderOut(self):
import math
import random as r
for col in self.fileData:
corridor = str(col['CORRIDOR_CODE'])
begMi = float(col['BEGIN_MI'])
endMi = float(col['END_MI'])
roughDiff = abs(begMi - endMi)
# if the plain distance between two points is greater than length = 10
if roughDiff > nCounter.length:
diff = ((int(math.ceil(roughDiff/10.0))*10)-10)
if diff > 0 and (diff % 2 == 0 or diff % 3 == 0 or diff % 5 == 0)\
and ((diff % roughDiff) >= diff):
if (nCounter.length+begMi) < endMi:
vars1 = round(r.uniform(begMi,\
(begMi+nCounter.length)),nCounter.rounder)
yield corridor,begMi,endMi,'Output 1',vars1
if ((2*nCounter.length)+begMi) < endMi:
vars2 = round(r.uniform((begMi+nCounter.length),\
(begMi+ (nCounter.length*2))),nCounter.rounder)
yield corridor,begMi,endMi,'Output 2',vars1,vars2
因此,roughdiff等于两点之间的差异,并向下舍入到最接近的十点。然后减去10,所以样本取自整整十英里的部分;这变得不同。因此,假设一个24的roughDiff被舍入为20,20 - 10,diff +开始点=样本取自mi 60和70之间而不是70到80之间。
该程序有效,但我认为如果我使用return而不是yield会更好。不是程序员。
答案 0 :(得分:7)
return
不是更好,它不同。 return
说&#34;我完成了。这是结果&#34;。 yield
说&#34;这是一系列值中的下一个值&#34;
使用最能表达您意图的那个。
答案 1 :(得分:2)
使用yield
使您的函数成为generator function,这意味着每次调用其(自动创建的)next()
方法时,它都会生成一系列值。
当您想要迭代处理事物时,这很有用,因为这意味着您不必将所有结果保存在容器中然后处理它们。此外,在生成值之前所需的任何初步工作只需要执行一次,因为创建的生成器将在遇到最后yield
之后继续执行代码 - 即它有效地将其转换为所谓的一个coroutine。
生成器函数在return
值而不是yield
值时退出。这通常发生在执行“默认为return None
的情况下”结束时。
从代码的外观来看,我会说使用yield会有利,特别是如果你可以逐步处理结果。另一种方法是让它在完成时将所有值存储在list
和return
之类的容器中。
答案 2 :(得分:1)
我想在某些对象上继续迭代的情况下使用yield
。但是,如果我想使该函数递归,我会使用return
。