使用return而不是yield

时间:2015-08-06 22:37:24

标签: python class csv

回报是否优于收益?从我读过它可以。在这种情况下,我无法从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会更好。不是程序员。

3 个答案:

答案 0 :(得分:7)

return不是更好,它不同return说&#34;我完成了。这是结果&#34;。 yield说&#34;这是一系列值中的下一个值&#34;

使用最能表达您意图的那个。

答案 1 :(得分:2)

使用yield使您的函数成为generator function,这意味着每次调用其(自动创建的)next()方法时,它都会生成一系列值。

当您想要迭代处理事物时,这很有用,因为这意味着您不必将所有结果保存在容器中然后处理它们。此外,在生成值之前所需的任何初步工作只需要执行一次,因为创建的生成器将在遇到最后yield之后继续执行代码 - 即它有效地将其转换为所谓的一个coroutine

生成器函数在return值而不是yield值时退出。这通常发生在执行“默认为return None的情况下”结束时。

从代码的外观来看,我会说使用yield会有利,特别是如果你可以逐步处理结果。另一种方法是让它在完成时将所有值存储在listreturn之类的容器中。

答案 2 :(得分:1)

我想在某些对象上继续迭代的情况下使用yield。但是,如果我想使该函数递归,我会使用return