【问题标题】:Function not looping back when an certain condition is met满足特定条件时函数不循环
【发布时间】:2018-03-26 15:42:18
【问题描述】:

我正在构建一个简单的毕达哥拉斯定理计算器,这是我不久前写的,目的是制作一个更高级的版本,作为对类和函数的介绍。我已经成功地将它编程为求解 c,a 或 b,并在用户需要进行另一次计算时循环回计算函数。

我最近尝试添加一个主菜单功能,所以如果用户需要解 c,现在需要解 b,他/她可以返回主菜单选择他们需要的选项。遇到了一些困难,我设法将它编码到了它的位置

  1. 返回主菜单
  2. 用户选择了另一个选项
  3. 用户根据需要执行计算
  4. 1-3次重复成功

但是如果他们尝试返回并选择另一个选项,它只会返回到 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 这是我在帮助板上的第一个问题,如果我没有做对,请放轻松。

【问题讨论】:

  • 这是很多代码。请尝试将其缩减为 minimal reproducible example,这仍然表明您正在寻求帮助。
  • 您需要在以pytha.mainmenu() 开头的代码周围放置一个循环。此外,您的行 quit 不会做任何有用的事情,如果您想退出脚本,请调用 quit(),但如果您只想退出该循环,那么您应该使用不同的名称作为 quit is a builtin。跨度>

标签: python loops


【解决方案1】:

您不需要最后的查询语句。在方法中包含对您的方法的调用或创建一个新方法以返回主菜单。在处理可能的小数时,我还建议使用 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()。

我为您的回复添加了 .lower(),以防用户执行 OPT1 或 Opt1。

我创建了一个重新运行函数以在每次操作后调用。第一次运行后它会自动转到此位置。

我还使用 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)

【讨论】:

  • 非常感谢。我对编程很陌生,还不知道如何用我的代码解决问题。这确实帮助我理解和使用不同的方法。再次感谢!
  • 不客气。如果这回答了您的问题,请将其选为最佳答案并关闭已回答的问题。
猜你喜欢
  • 2013-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
相关资源
最近更新 更多