首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TypeError: Calculator.main()接受5个位置参数,但给出了6个

TypeError: Calculator.main()接受5个位置参数,但给出了6个
EN

Stack Overflow用户
提问于 2021-12-09 20:29:01
回答 1查看 1.2K关注 0票数 0
代码语言:javascript
运行
复制
import math


class Calculator():
    def __init__(self, num1=0.0, op=None, num2=0.0, result=None):
        self.num1 = num1
        self.op = op
        self.num2 = num2
        self.result = result

    def main(self, num1, op, num2, result):
        if op == "+":
            result = float(num1) + float(num2)
            print(result)
        elif op == "-":
            result = float(num1) - float(num2)
            print(result)
        elif op == "*":
            result = float(num1) * float(num2)
            print(result)
        elif op == "/" and float(num2) == 0:
            result = None
            print("You can't divide by zero")
            p.main(self, num1, op, num2, result)
        elif op == "/" and float(num2) != 0:
            result = float(num1) / float(num2)
            print(result)
        elif op == "power":
            result = float(num1)**float(num2)
            print(result)
        else:
            print("invalid input")


while True:
    p = Calculator()
    p.main(num1=input("Write a number: "),
           op=input("+ or - or * or / or power: "),
           num2=input("Write another number: "),
           result=None)
    ans = input("Would you like to do another equation: ")
    if ans == "yes":
        p.main()
        ans = input("Would you like to do another equation: ")
    elif ans == "no":
        exit()

我试着将5除以6,以测试是否一切正常,我得到了以下错误:

回溯(最近一次调用):文件"d:\Visual Studio Code\Projects\HelloWorld python\tempCodeRunnerFile.py",第37行,在p.main中(“写一个数字:"),文件"d:\Visual Studio Code\Projects\HelloWorld python\tempCodeRunnerFile.py",第24行,main p.main(self,num1,op,num2,result),TypeError: Calculator.main接受5个位置参数,但给出了6个

EN

回答 1

Stack Overflow用户

发布于 2021-12-09 20:32:15

这一行:

代码语言:javascript
运行
复制
            p.main(self, num1, op, num2, result)

应:

代码语言:javascript
运行
复制
            self.main(num1, op, num2, result)

然而,这将引发一个不同的错误,即通过使用相同的参数调用相同的函数,得到相同的结果,这是对同一个函数的另一次调用(然后重复大约一千次,直到出现递归错误)。相反,您需要提示用户输入新的输入;处理错误的函数应该是从用户获取输入的函数。

让这变得简单的一种方法是使用异常,如果您只将除法除以零并让它引发一个ZeroDivisionError,那么异常就会自动发生。只需要接受输入捕获异常的代码,这样它就可以重新提示用户:

代码语言:javascript
运行
复制
class Calculator():
    def operate(self, num1: float, op: str, num2: float) -> float:
        """Perform one operation according to the value of op.
        May raise ValueError or ZeroDivisionError."""
        if op == "+":
            return num1 + num2
        elif op == "-":
            return num1 - num2
        elif op == "*":
            return num1 * num2
        elif op == "/":
            return num1 / num2
        elif op == "power":
            return num1 ** num2
        else:
            raise ValueError(f"invalid operator {op}")

    def do_one_equation(self) -> None:
        """Prompt the user for input and do one equation.
        Loop on invalid input until we have one successful result."""
        while True:
            try:
                result = self.operate(
                    float(input("Write a number: ")),
                    input("+ or - or * or / or power: "),
                    float(input("Write another number: "))
                )
                print(result)
                return
            except ZeroDivisionError:
                print("You can't divide by zero")
            except ValueError:
                print("Invalid input")


p = Calculator()
while True:
    p.do_one_equation()
    if input("Would you like to do another equation: ") == "no":
        break

注意,在上面的代码中,result变成了operate()方法所编辑的任何内容。函数的参数是它的输入,结果应该是它的输出(即您的return)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70296316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档