2012-08-09 97 views
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] 

回答

2

你不返回的结果递归调用。

if(len(set(l)) !=7): 
    return lotto() 
+0

谢谢大家。这已经成功了。我(显然)完全没有意识到在return语句中必须有lotto(),并且说实话我仍然不太确定为什么!但它是道路。再次感谢。 – nickl 2012-08-09 18:38:12

+0

要显示问题已解决,请通过按旁边的复选标记将其答案标记为已接受。 – Lanaru 2012-08-09 18:45:42

+0

Lanaru - 我做到了,但它告诉我必须先等待x分钟,然后才能将其标记为已解决。 – nickl 2012-08-09 18:53:00

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)) 
+0

这当然会让事情变得更容易,我会使用这种示例方法,非常感谢。 – nickl 2012-08-09 18:40:49