在变量内调用函数(随机)

时间:2014-09-26 22:49:31

标签: python function variables

所以,我有一系列不同的问题,每个问题都会根据调用的函数来询问。我希望每个问题都能得到它,一个随机类型的问题(函数)被调用。我认为这是最好的方法,但我不知道它为什么不起作用。

x = addition_question(int(random.randrange(0,101,1)),int(random.randrange(0,101,1)))

y = multiply_question(int(random.randint(1,10)),int(random.randint(1,10)))

z = subtract_question(int(random.randrange(0,101,1)),int(random.randrange(0,101,1)))

vars = [x,y,z]


import random

print("Question 1:")
print(random.sample(vars,1))
time.sleep(.25)

运行此命令会返回: http://puu.sh/bP9dL/416caa5bc1.png

而不是使用'打印("问题1:")'它出于某种原因打印函数而不调用变量。

注意:错误在于变量的随机化,并调用它们。当我指定我想要使用的问题类型(功能)时,它按计划运行。

print("Question 1:")
addition_question(int(random.randrange(0,101,1)),int(random.randrange(0,101,1))) #creates addition question with randomised numbers between 1 and 101
print("")
time.sleep(.25)

print("Question 2:")
multiply_question(int(random.randint(1,10)),int(random.randint(1,10))) #creates multiplication question with randomised numbers between 1 and 10
print("")
time.sleep(.25)

随意提出有关其余代码的问题!

2 个答案:

答案 0 :(得分:0)

当你写这样的行时:

x = addition_question(int(random.randrange(0,101,1)),int(random.randrange(0,101,1)))

立即调用函数addition_question,并将调用该函数的结果分配给x

你想要做的是创造一些你可以懒得打电话的东西 - 并反复打电话,每次都得到不同的价值。

这样做的方法是定义一个函数:

def x():
    return addition_question(int(random.randrange(0,101,1)),int(random.randrange(0,101,1)))

然后,当然,您不想打印出x,您想致电 x并打印结果

print(random.sample(vars,1)())

这就是全部。


关于您的代码的一些附注:

  • random.randrange返回一个整数;我没有理由将结果传递给int
  • random.sample(spam, n)选择n值而无需替换;当n始终为1时,random.choice(spam)会更简单,更可读地执行相同的操作。
  • random.randrangerange一样,具有其参数的默认值,因此您只需撰写randrange(101),而不是randrange(0, 101, 1)
  • 没有空格的长行代码难以阅读,在StackOverflow或只能容纳80个字符的典型终端窗口等地方更是如此。在参数之间放置空格,将两行断开(或者将它们重新组织成具有存储在临时变量中的中间值的单独行)如果它们变得太长等等。请参阅[PEP 8(http://legacy.python.org/dev/peps/pep-0008/)以获取标准Python样式指南。

答案 1 :(得分:0)

在将函数存储到vars列表之前,您已经调用了函数。只需存储对函数的引用,并在选择一个参数后为参数传递随机值:

questions = (addition_question, multiply_question, subtract_question)
print("Question 1:")
random.choice(questions)(random.randint(1,10), random.randint(1,10))

random.choice()随机选择三个函数引用中的一个,(...)调用后random.choice()部分调用随机函数。在那一刻,我们传入随机挑选的论点。

请注意,我没有在int()的返回值上使用random.randint();该函数已经返回一个整数,并且不需要再将其转换为整数。我还使用了random.choice(),而不是使用样本大小为1的random.sample()

如果您的函数需要不同的随机整数范围,那么您有几个不同的选项:

  • 使用函数存储范围,比如在元组中存储,并在随机调用random.randint()和拾取的函数中选择元组之后:

    questions = (
        (addition_question, 0, 100),
        (multiply_question, 1, 10),
        (subtract_question, 0, 100),
    )
    
    question, low, high = random.choice(questions)
    question(random.randint(low, high), random.randint(low, high))
    
  • 存放lambda;这些是匿名函数,封装在调用时要执行的另一个表达式:

    questions = (
        lambda: addition_question(random.randrange(101), random.randrange(101)),
        lambda: multiply_question(random.randint(1, 10), random.randint(1, 10)),
        lambda: subtract_question(random.randrange(101), random.randrange(101)),
    )
    
    random.choice(questions)()
    

在第一个选项中,我将值调整为可用于random.randint(),在第二个选项中,我使用了最简单的random.randrange()形式;只需一个参数,它就会将开头默认为0,将步骤默认为1