从循环中返回多个值,无需获得"无"

时间:2016-12-30 05:10:02

标签: python python-3.x return

有没有办法在不创建空白元组的情况下返回多个结果,将每次迭代添加到它,并返回元组?

我只想摆脱循环结束时隐式返回的None

from random import randint

class Lotto(object):
    def fir_num(self):
        print("First prize:")
        num = randint(000000, 999999)
        return "%06d" % num           #no problem for single value

    def sec_num(self):
        print("Second prizes:")
        i = 0
        while i <= 5:
            i += 1
            num = randint(000000, 999999)
            print("%06d" % num)       #if uses "return", the function returns only one result

L = Lotto()
print(L.fir_num())
print(L.sec_num())

4 个答案:

答案 0 :(得分:3)

您只能从某个功能返回一次。所以最好的方法是在列表中收集结果并返回列表:

from random import randint

def sec_num(count=5):
    return [randint(0, 999999) for _ in range(count)]

for num in sec_num():
    print("%06d" % num)

输出:

710690
816475
087483
572131
292748

您似乎无法访问self。因此,您不需要在示例中显示的案例类。这里有一个简单的功能。

如果您有许多第二个价格,比如说一百万左右,您可以使用yield提高您的功能效率。这会将您的功能变为generator。这是一个全新的概念,可以理解并且需要案例,但是当您深入了解Python时,值得探索。

答案 1 :(得分:2)

您可以尝试修改sec_num()函数以使用以下生成器方法。

from random import randint

class Lotto(object):
    def sec_num(self):
        print("Second prizes:")
        i = 0
        while i <= 5:
            i += 1
            num = randint(000000, 999999)
            yield("%06d" % num)

L = Lotto()
for g in L.sec_num():
     print(g)

yield就像return一样,但它将函数转换为生成器。如果您只是打印L.sec_num(),您将看到一个生成器对象。这是一个可迭代的,所以你可以按照上面的步骤来获取它包含的值。

答案 2 :(得分:2)

这是一个使用yield的好地方 - 你像return一样使用它,但是不是函数返回那个值而是停止,它会在调用者迭代时依次返回多个结果在他们身上。它看起来像这样:

class Lotto:
    def sec_num(self):
        print("Second prizes:")
        i = 0
        while i <= 5:
            i += 1
            num = randint(000000, 999999)
            yield "%06d" % num

L = Lotto()
for num in L.sec_num():
    print(num)

这有点像在函数中构建一个列表,除了它让sec_num专注于它的工作而不是构建列表的管理逻辑;此外,它在某些情况下可能更有效(特别是与stdlib itertools模块结合使用),因为每个新结果仅在调用者想要它时生成而不是必须等待他们都是。如果您确实希望列表中包含所有这些内容,您仍然可以执行此操作:print(list(L.sec_num()))

答案 3 :(得分:0)

在这种情况下,正确的解决方案是返回列表[32372,43483,54579..]或类似{"first":38179,"second":36368..}结构的字典。每次都可以有不同数量的结果。