Python 函数不返回列表

Python 函数不返回列表,python,python-2.7,Python,Python 2.7,我有一个简单的脚本来生成英国彩票号码(7个号码,1到49个)。 我的代码有一个函数,它可以在一个列表中生成7个随机数,在列表上运行set,删除重复的数字,检查列表中是否还有7个成员,如果没有,该函数会调用自身生成7个新数字 但是,当函数调用自身时,它不会返回列表 如果我知道我做错了什么,我会很感激的 from random import randint def lotto(): l = [] for r in range(1,8): l.append(rand

我有一个简单的脚本来生成英国彩票号码(7个号码,1到49个)。 我的代码有一个函数,它可以在一个列表中生成7个随机数,在列表上运行set,删除重复的数字,检查列表中是否还有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]
以及一个工作正常的示例运行:

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]

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

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

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

if(len(set(l)) !=7):
    return lotto()
递归调用

lotto()
实际上不返回由
lotto()
返回的值。你需要使用

return lotto()
相反。(请注意,与其使用尾部递归调用,不如使用循环。)

也就是说,对于你的实际问题有一个更简单的解决方案,即。Python2.x版本:

import random
print random.sample(xrange(1, 50), 7)
import random
print(random.sample(range(1, 50), 7))
Python 3.x版本:

import random
print random.sample(xrange(1, 50), 7)
import random
print(random.sample(range(1, 50), 7))
递归调用

lotto()
实际上不返回由
lotto()
返回的值。你需要使用

return lotto()
相反。(请注意,与其使用尾部递归调用,不如使用循环。)

也就是说,对于你的实际问题有一个更简单的解决方案,即。Python2.x版本:

import random
print random.sample(xrange(1, 50), 7)
import random
print(random.sample(range(1, 50), 7))
Python 3.x版本:

import random
print random.sample(xrange(1, 50), 7)
import random
print(random.sample(range(1, 50), 7))

谢谢大家。这就成功了。我(显然)完全不知道有必要在回报声明中加入lotto(),老实说,我仍然不太清楚为什么!但这是方法。再次感谢。为了表明问题已解决,请按旁边的复选标记将他的答案标记为已接受。拉纳鲁-我做了,但它告诉我必须等待x分钟才能将其标记为已解决。@nickl“我仍然不太确定为什么”,如果不返回函数调用的第一个实例lotto调用返回的值(在所有递归完成后)将从
if:else:
块中掉出来,什么也不返回。谢谢大家。这就完成了。我(显然)完全不知道有必要使用lotto()在回信声明中,老实说,我仍然不太确定为什么!但这是方式。再次感谢。为了表明问题已经解决,请按旁边的复选标记将他的答案标记为已接受。拉纳鲁-我做了,但它告诉我必须等x分钟才能将其标记为已解决。@nickl“我仍然不太确定为什么”如果不返回从lotto调用返回的值,则函数调用的第一个实例(在所有递归完成之后)将脱离if:else:块而不返回任何内容。这确实使事情变得更简单,我将使用该示例方法,非常感谢。这确实使事情变得更简单,我将使用该示例方法,非常感谢。