嗨,我是python的新手,我写了一个简单的计算器,我想问一下代码是否写得很好,或者是否有人有任何关于如何编写更好的提示。
def addidtion(): if choose == 1: print("Your result:", firstNum + secondNum) def subtraction(): if choose == 2: print("Your result:", firstNum - secondNum) def multiplication(): if choose == 3: print("Your result:", firstNum * secondNum) def division(): if choose == 4: print("Your result:", firstNum / secondNum) print("Welcome to the calculator,") firstNum = float(input("Give me first number: ")) secondNum = float(input("Give me second number: ")) choose = int(input("Choose one option:\n" "1.Addition\n" "2.Subtraction\n" "3.Multiplication\n" "4.Division\n")) addidtion() subtraction() multiplication() division()
如果我想使用你的功能;会很难。我必须修改程序的全局范围,并且必须了解choose
.
始终将变量作为参数传递给函数。
def addition(choose, firstNum, secondNum): if choose == 1: print("Your result:", firstNum + secondNum)
不要包括choose
在你的addition
和这样的功能中。它根本不属于那里,意味着所有对加法的调用都必须是addition(1, lhs, rhs)
.
你已经写了四次相同的打印,你真的应该返回操作的结果,然后再写一次打印。
def addition(lhs, rhs): return lhs + rhs def subtraction(lhs, rhs): return lhs - rhs def multiplication(lhs, rhs): return lhs * rhs def division(lhs, rhs): return lhs / rhs print("Welcome to the calculator,") lhs = float(input("Give me first number: ")) rhs = float(input("Give me second number: ")) choose = int(input( "Choose one option:\n" "1.Addition\n" "2.Subtraction\n" "3.Multiplication\n" "4.Division\n" )) if choose == 1: result = addition(lhs, rhs) if choose == 2: result = subtraction(lhs, rhs) if choose == 3: result = multiplication(lhs, rhs) if choose == 4: result = division(lhs, rhs) print("Your result:", result)
我们可以通过将选项存储在列表或字典中来进一步简化代码。列表更容易学习,但要求选项从 0 开始。
我们可以在 中存储一个[``]
选项列表 ( ),options
用一个 分隔每个选项,
。然后,我们可以从列表中的项目(1之中0
,第2之中1
,...)使用[0]
。
>>> options = [addition, subtraction, ...]>>> options[0](1, 2)3
def addition(lhs, rhs): return lhs + rhs def subtraction(lhs, rhs): return lhs - rhs def multiplication(lhs, rhs): return lhs * rhs def division(lhs, rhs): return lhs / rhs options = [ addition, subtraction, multiplication, division, ] print("Welcome to the calculator,") lhs = float(input("Give me first number: ")) rhs = float(input("Give me second number: ")) choose = int(input( "Choose one option:\n" "0.Addition\n" "1.Subtraction\n" "2.Multiplication\n" "3.Division\n" )) print("Your result:", options[choose](lhs, rhs))
我们可以将函数更改为 lambdas。这些是没有名称的函数。
options = [ lambda lhs, rhs: lhs + rhs, lambda lhs, rhs: lhs - rhs, lambda lhs, rhs: lhs * rhs, lambda lhs, rhs: lhs / rhs, ]
通过为每个 lambda 提供一个名称,我们可以构建选项表。我们可以通过:
更改options
为具有名称和函数的元组。
options = [ ("addition", lambda lhs, rhs: lhs + rhs), ...]
用于enumerate
在options
获取名称(和函数)的同时获取索引。
for index, (name, _) in enumerate(options): pass
使用 f 字符串将索引和名称格式化为字符串。
好答案。让我想起了另一个最近的问题:使用 break 语句来控制逻辑的基本计算器,在方法和差异上也有一些相似之处(使用运算符库)。
——
匿名的
昨天
@匿名谢谢。是的,一旦你看过一个“计算器”答案,你就真的看过了:) 每个人都有不同的口味……但它们基本上都是一样的。
——
佩隆瑞兹
♦
昨天
如果你正在做[ ("addition", lambda lhs, rhs: lhs + rhs), ... ]<-- 这个带有名字和 lambda 的列表,为什么不把它做成字典呢?
——
伊斯梅尔·米格尔
17 hours ago
1
@IsmaelMiguel OP 的初始代码按索引选择了操作。您可能会争辩说,用户通过键入字符串来选择操作会更直观,但 IMO 与 OP 的初始意图相比有太大的变化。如果该列表是一个 dict,则查找与特定索引对应的字典元素会困难得多,甚至不能保证在 3.7 之前的 Python 版本上正常工作
——
永比尔特
17 hours ago
@ymbirtt 这是一个很好的观点。我不熟悉 Python 3.6 以下的任何内容,而且我不擅长 Python 3.7,所以,我相信你的话。
——
伊斯梅尔·米格尔
17 hours ago
不要依赖全局变量。您正在试验函数是件好事;但是,您并没有真正利用它们,因为它们对全局变量进行操作而不是接受参数。几乎从不需要全局变量。
代码重复是一个警告信号。这些函数是重复的:它们都包含相同的条件逻辑和打印行为。函数的主要目的之一是减少代码重复。
验证输入。如果用户犯了错误并输入了无效数字,程序将引发异常。
简化用户界面。该程序的用户界面很乏味。每个数字都必须单独键入和输入,然后通过从列表中键入一个数字来选择数学运算。考虑到 Python 使用户可以轻松地一次性执行所有数据输入,这让人感觉很尴尬。此外,程序应该有一种直接的退出方式。
无限计算。大多数计算器不限制您执行单个计算。在 Python 中没有充分的理由进行这种限制。
学习语言比重新发明简单的东西更好。编程语言是非常好的数学。事实上,它们通常具有用于加法、减法等的内置函数。所以根本没有充分的理由来编写这样的函数。更好的是了解语言的内置功能。
使用数据结构消除逻辑。你的程序的很多逻辑都是围绕着处理用户的选择和采取正确的行动来响应的。很多时候,可以通过使用适当的数据结构来消除这样的
# Get arithmetic functions for free, from the Python standard library. import operator operations = { '+': operator.add, '-': operator.sub, '*': operator.mul, '/': operator.truediv, } print('Welcome to the calculator.') # Support multiple calculations. while True: # Support an easy way to quit. inp = input('=> ').strip() if not inp: break # Handle invalid input. Enhance as needed. try: a, op, b = inp.split() # No conditional logic, thanks to our data structure. result = operations[op](float(a), float(b)) print(result) except Exception: print('Invalid input.')
评论专区