有没有办法在不创建空白元组的情况下返回多个结果,将每次迭代添加到它,并返回元组?
我只想摆脱循环结束时隐式返回的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())
答案 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..}
结构的字典。每次都可以有不同数量的结果。