2012-08-09 132 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