python实例1.3:实现一个基础版的计算器,支持加减乘除和退出程序的功能(详解及其知识点拓展)

您所在的位置:网站首页 用python制作计算器中存在的问题 python实例1.3:实现一个基础版的计算器,支持加减乘除和退出程序的功能(详解及其知识点拓展)

python实例1.3:实现一个基础版的计算器,支持加减乘除和退出程序的功能(详解及其知识点拓展)

2024-07-13 14:54| 来源: 网络整理| 查看: 265

目录

一、主程序代码

二、程序详细分析

三、实例运行

四、程序优化

1.如果用户输入了非法选项

2.如果用户在进行计算时输入了字符串

五、try except 详细分析

try子句

except子句

工作流程

示例分析

六、try except实例分析

例1:处理文件操作异常

例2:处理用户输入类型错误

例3:处理除以零的错误

例4:处理多个异常

例5:捕获所有异常

例6:使用else和finally子句

例7:无指定异常类型

一、主程序代码

以下是一个基础版计算器程序的示例代码,它支持加法、减法、乘法、除法和退出程序的功能。代码采用Python编写:

python

def add(x, y): return x + y def subtract(x, y): return x - y def multiply(x, y): return x * y def divide(x, y): if y != 0: return x / y else: return "除数不能为0!" def main(): while True: print("\n欢迎使用计算器") print("1. 加法") print("2. 减法") print("3. 乘法") print("4. 除法") print("5. 退出程序") choice = input("请输入操作编号(1/2/3/4/5): ") if choice in ('1', '2', '3', '4'): num1 = float(input("请输入第一个数字: ")) num2 = float(input("请输入第二个数字: ")) if choice == '1': print("结果是: ", add(num1, num2)) elif choice == '2': print("结果是: ", subtract(num1, num2)) elif choice == '3': print("结果是: ", multiply(num1, num2)) elif choice == '4': print("结果是: ", divide(num1, num2)) elif choice == '5': print("感谢使用计算器程序,再见!") break else: print("非法输入,编号必须在1到5之间!") if __name__ == '__main__': main()

二、程序详细分析

实现基本操作函数:

add函数完成加法运算:接收两个参数x和y,返回它们的和。subtract函数完成减法运算:接收两个参数x和y,返回它们的差。multiply函数完成乘法运算:接收两个参数x和y,返回它们的乘积。divide函数完成除法运算:接收两个参数x和y,如果y不为零,返回它们的商;如果y为零,则返回提示信息"除数不能为0!"。

主函数(main)逻辑:

无限循环while True:程序会一直运行,直到用户选择退出。

打印菜单:输出计算器功能选项和退出程序的选项。

获取用户输入:通过input函数让用户输入操作编号。

判断用户的选择:通过条件语句(if-elif-else)来执行相应的功能。

如果用户输入1到4之间的数字,则提示用户输入两个数字进行相应的计算并打印结果。如果用户输入是5,则打印退出信息,break语句终止循环,程序结束。如果用户输入的是非法输入(既不是1到4的数字也不是5),则提示用户重新输入。

执行计算:基于用户选择的运算符号,调用上面定义的函数执行计算,并打印出结果。

程序结束条件: 当用户输入5时,程序会打印退出信息,然后通过break语句跳出while循环,结束程序运行。

程序运行检测: 检查点if __name__ == '__main__':决定了此脚本是被直接运行还是被导入到其他文件中,如果是前者,则会执行main()函数,启动计算器程序。

注意:这段代码运行时将请求用户输入数据,除非使用适当的错误处理,否则在输入非数字时会发生错误。在实际应用中,应该添加适当的异常处理来确保程序的健壮性。

三、实例运行

这个错误信息表明在尝试将一个字符串转换为浮点数时出现了问题。具体来说,在使用float()函数转换用户输入的时候,输入的字符串是'ss',而这不是一个有效的浮点数表示,因此引发了ValueError。

为了解决这个问题,我们可以在输入转换的时候加入异常处理,以确保用户输入了有效的数字。

四、程序优化

python

def add(x, y): return x + y def subtract(x, y): return x - y def multiply(x, y): return x * y def divide(x, y): if y != 0: return x / y else: return "分母不能为0" def main(): while True: print("操作选项:") print("1. 加法") print("2. 减法") print("3. 乘法") print("4. 除法") print("5. 退出") choice = input("选择操作(1/2/3/4/5): ") if choice in ('1', '2', '3', '4'): try: num1 = float(input("请输入第一个数字: ")) num2 = float(input("请输入第二个数字: ")) except ValueError: print("输入错误,请确保你输入了有效的数字!") continue if choice == '1': print("结果:", add(num1, num2)) elif choice == '2': print("结果:", subtract(num1, num2)) elif choice == '3': print("结果:", multiply(num1, num2)) elif choice == '4': print("结果:", divide(num1, num2)) elif choice == '5': print("退出程序。") break else: print("非法输入,请输入有效选项(1/2/3/4/5)!") if __name__ == '__main__': main()

以上Python脚本定义了四种基本数学操作,并且提供了一个主函数来执行这些操作。在主函数中,它通过一个无限循环来不断提示用户输入,直到用户选择退出(输入5)。当用户选择一个操作并输入数字时,程序会尝试将输入转换为浮点数,如果转换失败(例如用户输入了'ss'),程序会捕捉到ValueError异常,并提示用户输入错误,让用户有重新输入的机会。在除法函数中,还有一个检查来防止除以零的错误。

再次运行:

五、异常处理分析

1.如果用户输入了非法选项

即输入了除了'1', '2', '3', '4', '5'之外的任何其他选项,那么程序会进入到最后的else语句块。在这个else块中,程序会输出一条消息:“非法输入,请输入有效选项(1/2/3/4/5)!”。

这条消息作为用户指引和反馈,告诉用户他们需要选择正确的选项。之后,由于这些语句在一个while循环中,程序会再次回到循环的开始处,重新显示操作选项,并提示用户再次输入正确的操作选项。

用户只有提供有效的选项('1', '2', '3', '4', '5')程序才会进入到相应的分支执行加法、减法、乘法、除法或者退出循环终止程序。这样设计可以确保用户只能执行预定义的操作,从而避免非法输入引起的错误。

2.如果用户在进行计算时输入了字符串

比如在提示"请输入第一个数字:"或"请输入第二个数字:"后输入了'ss',程序中的异常处理部分将起作用。

这是由于当程序尝试将输入的字符串(通过float(input("请输入第一个数字: "))或float(input("请输入第二个数字: ")))转换为浮点数时,float()函数无法处理非数字的字符串。因此,当它尝试解析'ss'为一个浮点数时,会引发一个ValueError。

程序结构中try语句块内包含了可能引发异常的代码,而except语句块定义了当特定异常发生时如何响应。对于这个具体情况,若ValueError被触发,程序会执行except下的代码:

python

try: num1 = float(input("请输入第一个数字: ")) num2 = float(input("请输入第二个数字: ")) except ValueError: print("输入错误,请确保你输入了有效的数字!") continue

在这个except块中,程序首先打印出消息"输入错误,请确保你输入了有效的数字!",提醒用户输入了无效输入。接着,该语句块最后的continue会引导程序跳过剩下的代码,并回到while循环的起始处,提示用户再次进行操作选项的选择。

因此,程序不会在遇到无效输入时崩溃或退出,反而会给予用户纠正并重新输入的机会。这样的设计提高了程序的鲁棒性,允许用户在错误输入后能够继续使用程序,而不必重新启动它。

五、try except 详细分析

在Python程序中,try和except是异常处理语句,它们组成了所谓的try块。这种结构的主要目的是增加程序的容错性,使程序能够优雅地处理可能引发错误的代码。下面是try-except结构的详细分析:

try子句

作用:try子句中放置的是那些可能会出错的代码行。出错是指在运行时可能会引发异常(即运行时错误)的代码。原理:当Python解释器执行到try子句的代码时,它会监视这些代码行是否有异常发生。如果所有代码都正常执行了,那么except子句将被忽略,程序将继续执行try块后面的代码。

except子句

作用:与try配对的except子句会指定一个异常类型和一个当这种类型的异常发生时如何响应的代码块。原理:  如果try子句中的代码抛出了一个异常,Python解释器就会寻找配对的except子句。 如果发生的异常与except子句中指定的异常类型匹配,except子句后面的代码将被执行。如果except后面没有明确指定异常类型(即通用的except),那么它会捕获所有类型的异常。

工作流程

假设有以下代码结构:

python

try: # 可能抛出异常的代码 except ExceptionType: # 当特定类型的异常被抛出时执行的代码

这里的ExceptionType是特定的异常类。例如,在我们之前的程序中,使用了ValueError,这是在尝试执行一个无效的数学运算或函数调用时常见的异常类型。

当try子句中的代码引发ExceptionType类型的异常时,程序的执行将跳到except子句。在except子句中,可以进行相应的错误处理。这可能包括记录错误消息、提供用户反馈、尝试恢复程序状态、重试操作,或者只是简单地打印一个错误消息并继续执行程序的其余部分。

示例分析

在我们之前讨论的例子中:

python

try: num1 = float(input("请输入第一个数字: ")) num2 = float(input("请输入第二个数字: ")) except ValueError: print("输入错误,请确保你输入了有效的数字!") continue

用户输入被转换成浮点数的尝试写在了try块中。如果用户输入的是一个无法转化为浮点数的字符串,比如说字母或特殊字符,float()函数会引发一个ValueError。except ValueError子句将捕捉到这个异常,执行它下面的代码,即打印出警告信息并使用continue语句返回到while循环的开始,给用户另一次输入的机会,而不是让整个程序崩溃。

使用try和except是Python编程中常用的错误处理机制,有效地预防了程序执行过程中可能出现的意外情况所导致的程序终止。

六、try except实例分析

下面是try-except在不同情况下的使用实例:

例1:处理文件操作异常

读写文件时很可能会发生异常,如文件不存在、权限错误等。这可以通过try-except来处理:

python

try: with open('example.txt', 'r') as file: data = file.read() except FileNotFoundError: print("文件未找到,请检查文件路径是否正确。") except PermissionError: print("没有权限读取文件。")

例2:处理用户输入类型错误

程序请求用户输入一个整数,但用户可能输入了一个字符串。以下代码演示如何处理这种情况:

python

try: number = int(input("请输入一个整数: ")) print(f"您输入的数字是: {number}") except ValueError: print("这不是一个整数,请输入一个整数。")

例3:处理除以零的错误

在数学运算中,除以零会引发异常。这里展示如何通过try-except来捕获这个错误:

python

try: num1 = float(input("请输入被除数: ")) num2 = float(input("请输入除数: ")) result = num1 / num2 print(f"结果是: {result}") except ZeroDivisionError: print("除数不能为零。")

例4:处理多个异常

有时,一个操作可能抛出多种类型的异常,我们可以用一个except语句块捕获它们:

python

try: value = int(input("请输入一个数字: ")) result = 10 / value except (ValueError, ZeroDivisionError) as e: print(f"发生错误:{e}")

例5:捕获所有异常

如果不确定应该捕获哪种异常,或者想要对所有异常做通用处理,可以捕获所有类型的异常:

python

try: # 危险操作 pass except Exception as e: print(f"程序中出现了未知错误:{e}")

使用Exception捕获所有异常要谨慎,因为这可能会隐藏一些重要的、应该被修正的编程错误。通常建议尽可能捕获具体的异常类型。

例6:使用else和finally子句

try-except结构还可以搭配else和finally子句一起使用,else用于在没有异常发生时执行代码,finally用于无论是否发生异常均需执行的清理代码:

python

try: num = int(input("请输入一个整数: ")) except ValueError: print("这不是一个有效的整数。") else: print(f"您输入了整数: {num}") finally: print("这段代码总会执行。")

上述例子中,如果用户输入了有效的整数,程序会执行try块中的代码然后执行else中的代码。如果用户输入无效,抛出了ValueError,则会执行except块中的代码。不论程序如何运行,finally中的代码始终会执行,这在需要释放资源或执行一些最终操作时非常有用。

例7:无指定异常类型

如果 except 后不跟任何具体的异常类型,它将捕获所有的异常。这种做法并不推荐,因为它可能隐藏潜在的错误。

python

try: # 代码块 except: # 处理所有异常,但不推荐这样做


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3