在满足特定条件时,函数不会循环返回

时间:2018-03-26 01:41:01

标签: python loops

我正在建立一个简单的毕达哥拉斯定理计算器,我写了一段时间,以作为类和函数的介绍制作更高级的版本。我已成功对其进行编程以解决c,a或b,并在用户需要进行另一次计算时循环计算函数。

我最近尝试添加主菜单功能,因此如果用户需要解决c,现在需要解决b,他/她可以返回主菜单选择他们需要的选项。遇到一些困难,我已经成功将其编码到

的位置
  1. 返回主菜单
  2. 用户选择其他选项
  3. 用户根据需要执行计算
  4. 1-3重复成功
  5. 但是如果他们试图返回并选择另一个选项,它只会返回到python提示符。我很难用文字描述这个问题,因为其他事情也会出错。例如,如果您执行少于2次计算并尝试返回,则您当前使用的方法将继续循环。我不知道为什么会发生这种情况,看来我做的一切都是正确的。我已经尝试过排除故障,但如上所述,我的特殊情况很难描述。我确信我做得不对,我想知道怎么做。我的代码和截图附在下面。

    代码

        ' A Pythagoren Therom Calculator (v.2.0)
    By: Anon_104'''
    #imports
    import time, math
    #Welcome statement (Welcomes the user)
    print("Welcome to the pythagorean theorem calculator!")
    time.sleep(1)
    #a class to organize and keep everything in order ;)
    class pytha:
        #custom function for solving for c
        def cal():
            global ques1
            a = int(input('Please enter the "A" value: '))
            b = int(input('Please enter the "B" value: '))
            print("Calculating...")
            time.sleep(1)
            print('The "C" value is ')
            c = math.sqrt(a*a + b*b)
            print(c)
            ques1 = str(input("Another Calculation? (y/n) Or return to main menu? (back)"))
        #function for solving for a or b, given c
        def cal2():
            global ques2
            var = input('Please input either the "A" or "B" value: ')
            c = input('Please input the "C" value: ')
            var2 = float(c)**2 - float(var)**2
            ans = math.sqrt(var2)
            print('The "A"/"B" value is {0}'.format(ans))
            ques2 = str(input("Another Calculation? (y/n) Or return to main menu? (back)"))
        def mainmenu():
            global query1
            query1 = input('Welcome to the main menu! Solve for "C" or "A"/"B"? (opt1/opt2)')
    pytha.mainmenu()
    
    #The loop and break code for function 1      
    if query1 == 'opt1':
        pytha.cal()
        while ques1 == 'y':
            pytha.cal()
            if ques1 == 'back':
                pytha.mainmenu()
                while query1 == 'opt1':
                    pytha.cal()
            elif ques1 == 'n':
                print("Quitting... ")
                time.sleep(1.6)
                quit
    
    
    
    #The loop and break code for function 2
    if query1 == 'opt2':
        pytha.cal2()
        while ques2 == 'y':
            pytha.cal2()
            if ques2 == 'back':
                pytha.mainmenu()
                while query1 == 'opt2':
                    pytha.opt2
            elif ques2 == 'n':
                print("Quitting... ")
                time.sleep(1.6)
                quit
    

    截图 It doesn't loop again

    P.S这是我在帮助板上做的第一个问题,所以如果我没有做正确的话,那就去吧。

1 个答案:

答案 0 :(得分:0)

最后不需要查询语句。在方法中包含对方法的调用,或者为了返回主菜单而创建一个新方法。我还建议在处理可能的小数时使用float()而不是int(),但我没有改变它。

class Pytha(object):
    def __init__(self):
        import time, math
        self.math = math
        self.time = time
        print("Welcome to the pythagorean theorem calculator!\n")
        self.time.sleep(1)
        self.mainmenu()

    #custom function for solving for c
    def cal(self):
        try:
            a = int(input('\nPlease enter the "A" value: '))
            b = int(input('Please enter the "B" value: '))
            print("Calculating...")
            self.time.sleep(1)
            print('The "C" value is ')
            c = self.math.sqrt(a*a + b*b)
            print(c)
        except ValueError:
            print("\nError: Please enter a number\n")
            self.cal()
        self.rerun()

    #function for solving for a or b, given c
    def cal2(self):
        try:
            var = int(input('\nPlease input either the "A" or "B" value: '))
            c = int(input('Please input the "C" value: '))
            var2 = float(c)**2 - float(var)**2
            ans = self.math.sqrt(var2)
            print('The "A"/"B" value is {0}'.format(ans))
        except ValueError:
            print("\nError: Please enter a number\n")
            self.cal2()
        self.rerun()

    def mainmenu(self):
        query1 = str(input('Welcome to the main menu! Solve for "C" or "A"/"B" or quit program? (opt1/opt2/q)\n'))
        if query1.lower() == "opt1":
            self.cal()
        elif query1.lower() == "opt2":
            self.cal2()
        elif query1.lower() == 'q':
            quit()
        else:
            print("Error: Please type 'opt1' or 'opt2' or 'q'\n")
            self.mainmenu()

    def rerun(self):
        query1 = str(input('\nAnother Calculation? Solve for "C" or "A"/"B" or quit program? (opt1/opt2/q)\n'))
        if query1.lower() == "opt1":
            self.cal()
        elif query1.lower() == "opt2":
            self.cal2()
        elif query1.lower() == 'q':
            quit()
        else:
            print("Error: Please type 'opt1' or 'opt2' or 'q'\n")
            self.rerun()

app = Pytha()           

你可以做更多的事情来清理它。我把所有东西放在课堂上并将所有内容称为self.something()。

如果用户执行OPT1或Opt1,我会为您的回复添加.lower()。

我创建了一个单独的重新运行函数,在每次操作后调用。它在第一次运行后自动进入此状态。

我还使用了try / except作为输入,因为在调用int()时输入非数字字符会得到ValueError。相反,它现在会告诉用户输入一个数字,然后再试一次。

对于退出,您需要将其称为quit()。

一旦调用类, init 就会加载,这允许您执行启动它,例如包括导入,设置变量,打印消息和运行函数。这种方式全包。

最后,标准做法是用大写字母开始你的班级名称(虽然不是要求)。

希望这可以帮助您更好地了解如何使用类。

编辑:

如果您想为自己的工具构建自定义导入,而无需直接与用户互动,可以像这样构建:

class Pythag(object):
    #custom function for solving for c
    def solve_C(a, b):
            from math import sqrt
            a = int(a)
            b = int(b)
            c = sqrt(a*a + b*b)
            return (c)

    #function for solving for a or b, given c
    def solveAB(var, c):
            from math import sqrt
            var = int(var)
            c = int(c)
            var2 = float(c)**2 - float(var)**2
            ans = sqrt(var2)
            return(ans)

然后您可以将其导入另一个脚本。如果您的pythag脚本名为pythag.py,则将其导入为

from pythag import Pythag

然后调用这样的模块:

Pythag.solve_C(4,5)