0

我有一个简单的脚本来生成英国彩票号码(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]
4

2 回答 2

3

您没有返回递归调用的结果。

if(len(set(l)) !=7):
    return lotto()
于 2012-08-09T18:34:17.530 回答
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))
于 2012-08-09T18:34:22.740 回答