在遍历我的字典时,即使我正确输入了它们,它也不会拾取我的密钥。使用 Python 3.1



需要3个用户输入的计算器:操作符号和数字1-5的拼写。然后将它们转换为数字和符号。用户可以按任意顺序输入。问题是在函数i(1-3)中的for循环中,唯一有效的输入是一个,任何其他输入都不能转换为数字或符号。

dictt = {
'one': 1,
'two': 2,
'three': 3,
'four': 4,
'five': 5,
'add': r"+",
'subtract': r"-",
'multiply': r"*",
'divide': r"/"
}
def i1():
i1 = (input("Please input 'add', 'subtract', 'multiply', 'divide', 'one', 'two', 'three' , 'four', or 'five': "))
num1=0
for k,v in dictt.items():
if i1 == k:
num1 = dictt[k]
return num1
def i2():
i2 = (input("Please input 'add', 'subtract', 'multiply', 'divide', 'one', 'two', 'three' , 'four', or 'five': "))
num2=0
for k,v in dictt.items():
if i2 == k:
num2 = dictt[k]
return num2
def i3():
i3 = (input("Please input 'add', 'subtract', 'multiply', 'divide', 'one', 'two', 'three' , 'four', or 'five': "))
num3=0
for k,v in dictt.items():
if i3 == k:
num3 = dictt[k]
return num3
def main():
x=i1()
y=i2()
z=i3()
listo=[x,y,z]
listn=[]
for i in listo:
if i == int:
listn.append(i)
listo.remove(i)
else:
pass
if len(listn) == 2:
if listo[0] == "add":
result=listn[0]+listn[1]
return f"{listn[0]} + {listn[1]} = {result}"
elif listo[0] == "subtract":
result = listn[0] - listn[1]
return f"{listn[0]} - {listn[1]} = {result}"
elif listo[0] == "multiply":
result=listn[0] * listn[1]
return f"{listn[0]} * {listn[1]} = {result}"
elif listo[0] == "divide":
result=listn[0] / listn[1]
return f"{listn[0]} / {listn[1]} = {result}"
elif len(listn) < 2:
return "not enough numbers"
elif len(listo) != 1:
return "just one operator"

您的迭代因为返回得太早而中断,但是您不需要首先遍历字典来查找其中的项。而不是:

def i1():
i1 = (input("Please input 'add', 'subtract', 'multiply', 'divide', 'one', 'two', 'three' , 'four', or 'five': "))
num1=0
for k,v in dictt.items():
if i1 == k:
num1 = dictt[k]
return num1

:

def i1():
i1 = input("Please input 'add', 'subtract', 'multiply', 'divide', 'one', 'two', 'three' , 'four', or 'five': ")
return dictt.get(i1, 0)

您也不需要i2i3,因为所有这些函数都做完全相同的事情,只是名称不同。而不是:

x=i1()
y=i2()
z=i3()
listo=[x,y,z]

你可以这样写:

listo = [i1(), i1(), i1()]

或:

listo = [i1() for _ in range(3)]

我可能建议通过将所有输入放在一个列表中来简化整个代码,将它们分类为数字和函数,然后应用它们,而不是有一堆if语句:

ops = {
'one': 1,
'two': 2,
'three': 3,
'four': 4,
'five': 5,
'add': ("+", int.__add__),
'subtract': ("-", int.__sub__),
'multiply': ("*", int.__mul__),
'divide': ("/", int.__truediv__),
}

def get_op():
while True:
try:
return ops[input(
"Please input 'add', 'subtract', 'multiply', 'divide', "
"'one', 'two', 'three' , 'four', or 'five': "
)]
except KeyError:
print("Not a valid input.")

def main():
while True:
ops = [get_op() for _ in range(3)]
nums = [n for n in ops if isinstance(n, int)]
f = [f for f in ops if isinstance(f, tuple)]
if len(f) == 1 and len(nums) == 2:
break
else:
print("Must enter exactly two numbers and one operation.")
symbol, func = f.pop()
expr = f" {symbol} ".join(str(n) for n in nums)
return f"{expr} = {func(*nums)}" 
if __name__ == '__main__':
print(main())

我认为你的代码有点复杂,这将很难维护,这可以很简单,如果使用操作符

from operator import add, sub, mul, truediv
from typing import Callable

dictt = {
'one': 1,
'two': 2,
'three': 3,
'four': 4,
'five': 5,
'add': add,
'subtract': sub,
'multiply': mul,
'divide': truediv,
}


def main():
input_msg = "Please input 'add', 'subtract', 'multiply', 'divide', 'one', 'two', 'three' , 'four', or 'five': "

v1 = dictt.get(input(input_msg).strip())
v2 = dictt.get(input(input_msg).strip())
v3 = dictt.get(input(input_msg).strip())

if isinstance(v2, Callable) and v1 and not isinstance(v1, Callable) and v3 and not isinstance(v3, Callable)::
return v2(v1, v3)
else:
return 'Invalid input'


if __name__ == '__main__':
res = main()
print(res)

相关内容

  • 没有找到相关文章

最新更新