我有一个简单的脚本来生成英国彩票号码(7个数字,包括1到49)。 我的代码有一个函数,可以在列表中生成7个随机数,在列表中运行设置,删除重复的数字,检查列表中是否还有7个成员,如果不是,则函数调用自身生成7个新数字。
但是,当函数调用自身时,它不会返回列表。
我很高兴知道我在这里做错了什么。
from random import randint
def lotto():
l = []
for r in range(1,8):
l.append(randint(1,49))
print "DEBUG: l=", l
print "DEBUG: set(l)=", set(l), len(set(l))
if(len(set(l)) !=7):
lotto()
else:
print "Before return l, l = ", l
return l
def main():
numbers = lotto()
print numbers
以下是无法正常运行的示例运行:
DEBUG: l= [44, 32, 12, 12, 33, 16, 31]
DEBUG: set(l)= set([32, 33, 44, 12, 16, 31]) 6
DEBUG: l= [46, 20, 10, 24, 16, 35, 44]
DEBUG: set(l)= set([35, 10, 44, 46, 16, 20, 24]) 7
Before return l, l = [46, 20, 10, 24, 16, 35, 44]
None
运行正常的示例运行:
DEBUG: l= [20, 5, 21, 37, 10, 44, 38]
DEBUG: set(l)= set([37, 38, 10, 44, 20, 21, 5]) 7
Before return l, l = [20, 5, 21, 37, 10, 44, 38]
[20, 5, 21, 37, 10, 44, 38]
答案 0 :(得分:2)
您没有返回递归调用的结果。
if(len(set(l)) !=7):
return lotto()
答案 1 :(得分:2)
递归调用
lotto()
实际上并不返回lotto()
返回的值。你需要使用
return lotto()
代替。 (请注意,代替尾部递归调用,最好使用循环。)
也就是说,对您的实际问题有一个更容易的解决方案,即random.sample()
。 Python2.x版本:
import random
print random.sample(xrange(1, 50), 7)
Python 3.x版本:
import random
print(random.sample(range(1, 50), 7))