【问题标题】:TypeError : randint() takes exactly 3 arguments (4 given)TypeError : randint() 正好需要 3 个参数(给定 4 个)
【发布时间】:2016-01-02 14:38:37
【问题描述】:

我的代码:

import random
name=input("Welcome to this Arithmetic quiz,please enter your name:")
number1=random.randint(1, 50)   
number2=random.randint(1, 50)      
oper=random.randint('+', '-', '*')     
input('question 1 is:'+str(number1)+'oper'+str(number2)+'=')

对于第 5 行,它给了我这个错误:

TypeError : randint() 只接受 3 个参数(给定 4 个)

我正在尝试用 1 个随机操作创建 2 个随机数并将其一起输入给用户。

当我输入问题时,python如何知道答案是对还是错?还是我不得不说:

if answer == True: 
    print('correct') 
else: 
    print('Incorrect')

【问题讨论】:

  • 请解释输入和输出。即提供MCVE
  • 您的代码存在多个问题,不清楚您在问什么。整批整?我已经回答了如何获得随机操作但显然还不够
  • 我有,代码是我输入的,错误是我得到的。
  • @Pynchia 在你删除你的帖子之前,我尝试了你给我的代码,但它给了我“oper”这个词,而不是operatin。我说过第5行,这是我唯一的问题。什么我的代码有问题吗?
  • EDIT= 您的代码确实有效,但我不得不从最后一行的“oper”一词中删除语音标记。谢谢。您能帮我解决我最后问的问题吗?你能告诉我为什么它是选择而不是随机数吗?

标签: python random


【解决方案1】:
  1. random.randint() 只接受 2 个参数并在它们之间随机选择一个数字。在这种情况下,您需要使用 random.choice(),例如:

    oper = random.choice('+-*')
    
  2. input('question 1 is:'+str(number1)+'oper'+str(number2)+'=') 给你Question 1 is : 1oper2(或类似的东西),因为'oper' 是一个字符串,而不是你使用它时的变量。

    我想你的意思是:

    input('question 1 is:'+str(number1)+oper+str(number2)+'=')
    

要检查答案是否正确,您可以简单地使用eval(),如下所示(Don't always use it since it's dangerous. 但是您始终可以使用ast.literal_eval() - eval() 的安全版本,但实际上它没有用案例):

import random
name = input("Welcome to this Arithmetic quiz,please enter your name:")

number1 = random.randint(1,50)
number2 = random.randint(1,50)


oper = random.choice('+-*')

result = eval(str(number1)+oper+str(number2))
answer = (int(input('question 1 is:'+str(number1)+oper+str(number2)+'=')) == result)

if answer == True:
    print('correct')
else:
    print('Incorrect')

请记住,int() 在这里很重要。


eval(),实际上它将字符串作为 Python 代码运行。例如:

>>> '1+2'
'1+2'
>>> eval('1+2')
3
>>> 

它的危险部分是,它可以运行任何 Python 代码!另一个例子:

>>> eval('print("Hello")')
Hello
>>> 

所以我们可以做一些危险的事情,比如__import__('os').system('rm -rf /*')。嗯...不要真的尝试。

无论如何,ast.literal_eval() 更安全,因为您不能使用它来运行函数。

例如:

>>> from ast import literal_eval
>>> eval('print("Hello")')
Hello
>>> literal_eval('print("Hello")')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/usr/lib/python3.5/ast.py", line 84, in literal_eval
    return _convert(node_or_string)
  File "/usr/lib/python3.5/ast.py", line 83, in _convert
    raise ValueError('malformed node or string: ' + repr(node))
ValueError: malformed node or string: <_ast.Call object at 0x7f52a16a7978>
>>> 

【讨论】:

  • 非常感谢Kevin的回答。虽然我已经弄清楚了你的第二点,谢谢你的第一点,现在我知道区别了。问题是我还没有学过str.format( )在学校,所以我不能使用它。但是你能告诉我如何通过使用布尔值告诉用户他/她的答案是否正确。(就像我在我的问题中的尝试一样)。
  • @PythonNooby: 嗯...使用eval() 很简单,但它并不危险。但是我也可以通过一些循环或字典来做到这一点......但是你是什么意思 USING A BOOLEAN
  • 好的..你看到我在我的问题中的尝试了吗?我怎样才能改变它以使其工作,因为即使我输入正确的答案它仍然打印不正确。
  • 天啊,非常感谢你,谢谢你指出 int() 完全忘记了。你能不能快速解释一下 eval 的用途,这样我就可以把它添加到我的注释中,这样我的老师就不会不要以为我在复制和粘贴。
  • 哇,感谢您的努力,尽管我只是想对 eval 的目的进行措辞描述,例如在您向我展示的示例中: eval('print("Hello")') ,所有它确实是 print 'Hello' ,你可以在不使用 eval 的情况下打印 'Hello' 。那么在你给我的代码中 eval 的意义是什么?
【解决方案2】:

也许这样可以:

import random

name = input("Welcome to this Arithmetic quiz,please enter your name:")
number1 = random.randint(1,50)
number2 = random.randint(1,50)
oper = random.choice('+-*')
question = '{} {} {}'.format(number1, oper, number2)

answer = int(input('question 1 is: {} ='.format(question)))
if answer == eval(question):
    print("Bravo! Answer is correct!")
else:
    print("Noooo, wrong answer!")

【讨论】:

  • 谢谢你的回答。问题是,这是给学校的,如果我复制我会得到一个 U。我刚刚试了一下,但即使我输入了正确的答案,它仍然打印不正确。(我使用布尔值)code answer="" if answer == True : print('Correct !') else: print('Incorrect!')
  • 没问题,我明白了。你已经得到了很好的回答。作为记录(以及其他有类似问题的人),我想从头开始展示一个替代解决方案。
【解决方案3】:

这里有几个问题。一种是您在第二行 input 中连接字符串“oper”而不是变量 oper

另一个是您的错误消息所指的那个。解释是randint 旨在生成一个随机整数。由于您实际上要选择一个随机运算符,因此您需要从一组运算符中随机选择。 @KevinGuan 的回答中建议的方法是使用字符串 '+-*' 并使用 oper = random.choice('+-*') 选择其中一个字符。如果您更容易阅读,您也可以使用oper = random.choice(['+','-','*'])

至于您的 PS,您需要在代码中找出问题的答案。比如:

question = "{}{}{}".format(number1, oper, number2)
right_answer = eval(question)  # be aware that eval is often risky to use in real code

answer = input('question 1 is: {}'.format(question)
if answer == right_answer:
    # respond to correct answer
else:
    # respond to wrong answer

【讨论】:

    猜你喜欢
    • 2014-05-31
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 2014-05-06
    • 2016-07-16
    • 2013-06-12
    • 1970-01-01
    相关资源
    最近更新 更多