我试图让用户回答一些基本的算术问题。 我为每个加法,减法,除法定义了一个函数(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
答案 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
在程序开始时生成,并且在两次调用相同函数时它们不会更改。即使您的循环成功完成,您也会看到使用完全相同的数字重复相同的问题。
为了解决这个问题,我更改了所有算术函数以接受两个参数rand1
,rand2
,并替换每次出现的rand3
,rand4
,{ {1}}&amp; rand5
与rand6
&amp;分别为rand1
。
您应该在列表中放置需要调用的函数而不使用括号 即 取代
rand2
与
ADD=Add()
SUB=Sub()
DIV=Div()
Arith=[ADD,SUB,DIV]
在循环中:
Arith=[Add, Sub, Div]
的随机函数Arith
&amp;生成rand1
rand2