访问已放入列表中的功能

时间:2014-10-25 18:44:43

标签: python-3.x

我试图让用户回答一些基本的算术问题。 我为每个加法,减法,除法定义了一个函数(def),但是我怎样才能让我的程序每次都随机选择它?

我已经尝试了这个,但它不起作用:

import random
from random import shuffle

numbers = [1,2,3,4,5,6,7,8,9]
rand1=random.randint(0,len(numbers)-1)
rand2=random.randint(0,len(numbers)-1)
rand3=random.randint(0,len(numbers)-1)
rand4=random.randint(0,len(numbers)-1)
rand5=random.randint(0,len(numbers)-1)
rand6=random.randint(0,len(numbers)-1)

def Add():
    print("What is", rand1,"+",rand2,"?")
    user=int(input("Answer here: "))
    if user == rand1+rand2:
        print("Well done")
    else:
        print("No")


def Sub():
    print("What is", rand3,"-",rand4,"?")
    user=int(input("Answer here: "))
    if user == rand3-rand4:
        print("Well done")
    else:
        print("No")


def Div():
    print("What is", rand5,"/",rand6,"?")
    user=float(input("Answer here: "))
    if user == float("{0:.1f}".format(rand5/rand6)):
        print("Well done")
    else:
        print("No")       


name = input("Hi. What is your name?\n")
print("Hello",name)



ADD=Add()
SUB=Sub()
DIV=Div()


Arith=[ADD,SUB,DIV]

x=1
while x<=10:
    print(random.choice(Arith))
    x+=1

4 个答案:

答案 0 :(得分:0)

[不是一个真正的答案,只是一个长期的,格式化的评论]

 ADD = Add()

表示“执行函数add并将名称ADD绑定到函数返回的对象”,而您可能认为将ADD名称绑定到函数对象。

请在翻译提示下试试

>>> def t3e(): return 3
>>> A = t3e()
>>> B = t3e    # NO PARENTHESES 
>>> print(A)
>>> print(B)
你看到了区别吗?

下一步,功能列表。在这一点上,我希望您了解您的计划中发生的事情,但请尝试这个

 >>> L1 = [ t3e(), t3e(), t3e()]
 >>> print(L1)
 [ 3, 3, 3]
 >>> 

函数列表Arith,如在程序中,不是函数列表,它是返回值的列表!注意:你的函数Sum等返回None,所以Arith是一个满是None的列表。

现在,

>>> L2 = [ t3e, t3e, t3e ] # NO parentheses!
>>> print(L2[0])
<function div at 0x7f640f2b8668>
>>> print(L2[0]())
3

你尝试过每一步吗?您现在了解函数对象(在pythonspeak中,可调用对象)与其调用之间的区别吗?你必须将 callables 存储在一个容器(这里是一个列表)中,从容器中检索一个元素(你使用random.choice,这里我使用了索引,但它是一样的)和使用()调用可调用

>>> random.choice(L2)
<function t3e>
>>> random.choice(L2)()
3

请注意,我选择在我的示例中使用程序中的不同名称和语义,这是有充分理由的。

答案 1 :(得分:0)

ADD=Add()调用Add()并将ADD设置为返回值,即None。同样接下来的两行。 Arith=[ADD,SUB,DIV]Arith设置为[None, None, None]。你的问题的直接答案是摆脱这四行并将循环改为

for i in range(10):
    random.choice((Add, Sub, Div))()

这仍然存在一个问题,即Div要求人们输入0.2857142857142857(在我的机器上)这样的数字才能“正确”#39;这是我的程序版本。

from operator import add, sub, mul, floordiv
from random import choice

tries = 10
maxn = 9
numbers = list(range(1, maxn+1))
ops = (('+', add), ('-', sub), ('*', mul), ('//', floordiv))

for i in range(tries):
    left = choice(numbers)
    right = choice(numbers)
    op = choice(ops)
    print("What is", left, op[0], right,"?")
    try:
        user = int(input("Answer here: "))
    except ValueError:
        user = None
    if user == op[1](left, right):
        print("Well done")
    else:
        print("No")

(在回答关于&#39; op&#39;的问题时添加)op是一个元组(对),op [n]选择元组的一个成员。 3行包含&#39; op&#39;可以用以下内容代替,这可能更清楚。

symbol, function = choise(ops)
...
    print("What is", left, symbol, right,"?")
    ...
    if user == function(left, right):

答案 2 :(得分:0)

@gboffi

我扩展了你的例子,直到它对我有意义并且有效:


import random

def t1e():
    return 1

def t2e():
    return 2

def t3e():
    return 3

def t4e():
    return 4

def t5e():
    return 5

L2 = [t1e,t2e,t3e,t4e,t5e]

print(random.choice(L2)())

现在这个程序(主要是)正在运作:


import random
from random import shuffle

numbers = [1,2,3,4,5,6,7,8,9]
rand1=random.randint(0,len(numbers)-1)
rand2=random.randint(0,len(numbers)-1)
rand3=random.randint(0,len(numbers)-1)
rand4=random.randint(0,len(numbers)-1)
rand5=random.randint(0,len(numbers)-1)
rand6=random.randint(0,len(numbers)-1)

def Add():
    print("What is", rand1,"+",rand2,"?")
    user=int(input("Answer here: "))
    if user == rand1+rand2:
        print("Well done")
    else:
        print("No")


def Sub():
    print("What is", rand3,"-",rand4,"?")
    user=int(input("Answer here: "))
    if user == rand3-rand4:
        print("Well done")
    else:
        print("No")


def Div():
    print("What is", rand5,"/",rand6,"?")
    user=float(input("Answer here: "))
    if user == float("{0:.1f}".format(rand5/rand6)):
        print("Well done")
    else:
        print("No")       


name = input("Hi. What is your name?\n")
print("Hello",name)


Arith=[Add,Sub,Div]

x=1
while x<=10:
    print(random.choice(Arith)())
    x+=1

答案 3 :(得分:0)

您的脚本存在一些问题。

首先,

数字数组并非真正必要

numbers = [1,2,3,4,5,6,7,8,9]
rand1=random.randint(0,len(numbers)-1)

可以替换为

rand1=random.randint(0,9)

其次,

rand1 ... rand6在程序开始时生成,并且在两次调用相同函数时它们不会更改。即使您的循环成功完成,您也会看到使用完全相同的数字重复相同的问题。

为了解决这个问题,我更改了所有算术函数以接受两个参数rand1rand2,并替换每次出现的rand3rand4,{ {1}}&amp; rand5rand6&amp;分别为rand1

第三,

您应该在列表中放置需要调用的函数而不使用括号 即 取代

rand2

ADD=Add()
SUB=Sub()
DIV=Div()


Arith=[ADD,SUB,DIV]

最后,

在循环中:

  • 获取Arith=[Add, Sub, Div] 的随机函数
  • 随机数Arith&amp;生成rand1
  • 使用两个随机数
  • 调用该函数
  • 计数器增加1

tl; dr:这是我的修改后的代码

rand2