功能不返回列表

时间:2012-08-09 18:32:21

标签: python python-2.7

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

2 个答案:

答案 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))