从功能中捕获价值

时间:2014-11-19 17:35:38

标签: python

我在尝试存储下面函数的输出时遇到了麻烦,基本上我正在尝试创建一个数学测验,询问随机基本数学问题,然后能够回答这些问题,同时检查它们是否正确并且想知道是否有人能够帮助我完成代码或让我深入了解我需要学习什么才能完成它。

这是我到目前为止所做的:

print ("Hello to the maths quiz, what is your name?")
name = input()
from random import choice,randint

def rand_task1mathquiz():
    a,b = randint(0,10),randint(0,10)
    random_operations = choice(["+","-","/","*"])
    print("{0} {1} {2}".format(a,random_operations,b))

if __name__ == "__main__":
    for x in range(10):
    rand_task1mathquiz()

1 个答案:

答案 0 :(得分:2)

您要查找的一般模式是return语句。当您想要捕获函数的返回值时,通常,您将函数的结果分配给变量,就像为变量分配静态值一样,除了右侧的()之外它是一个要评估的函数调用,而不是对函数对象的引用。

另请注意您是如何使用库函数randint()choice()range()等的返回值执行此操作的。

def rand_task1mathquiz():
    a,b = randint(0,10),randint(0,10)
    random_operations = choice(["+","-","/","*"])
    return("{0} {1} {2}".format(a,random_operations,b))

if __name__ == "__main__":
    for x in range(10):
        quiz = rand_task1mathquiz()
        print quiz
        # Probably evaluate the returned value somehow, compare to user input

这里改变的分工也值得注意 - 函数返回一个值,调用者打印它。一个有用的功能可以独立运行,无需用户交互;输入/输出功能应尽可能与程序逻辑分开。

如果您想创建一个问题列表,那么现在也很容易:

questions = list()
for x in range(10):
   questions.append(rand_task1mathquiz())
# Now do something with questions

或等效,但使用列表理解可读性稍差:

questions = [rand_task1mathquiz() for _ in range(10)]

进一步的改进可能是让函数同时返回问题和答案;在程序代码中将它们保持在一起是有意义的。

def rand_task():
    a,b = randint(0,10), randint(0, 10)
    ops = {'+': int.__add__, '-': int.__sub__,
        '/': int.__truediv__, '*': int.__mul__}
    random_operation = choice(list(ops.keys()))
    # Should still guard against op='/' with b==0
    return ops[random_operation](a, b), \
        '{0} {1} {2}'.format(a, random_operation, b)

...尽管使用__add__ and friends可能太难以正确理解了。它在安全性方面肯定胜过eval,所以也许你应该尝试一下。