我对python很新。
我被要求仅使用字符串命令创建计算器,int / string / float等之间的转换(如果需要),并且使用函数是必需的。 while和for循环也可以使用。
程序需要输入x / y或x / y / z形式,其中x y z是任何正数或负数。其中“/”也可以通过加法乘法和减法来代替。并且操作数和运算符之间可以存在任意数量的空格。这是我到目前为止的想法。
我对+, - ,/和*有一个独特的定义。我会为用户输入的内容创建一个函数。我会用“.lstrip”和“.rstrip”来摆脱空格。
现在我遇到的麻烦是创建输入功能。我对功能很新,这基本上就是我所拥有的。我知道这并不多,但我真的不知道如何正确地进入这个功能。
def multiplication(x,a,y,b,z):
if (a== "*"):
return x*y
if (b== "*"):
return y*z
def division(x,a,y,b,z):
if (a== "/"):
return x/y
if (b== "/"):
return y/z
def addition(x,a,y,b,z):
if (a== "+"):
return x+y
if (b== "+"):
return y+z
def subtraction(x,a,y,b,z):
if (a== "-"):
return x-y
if (b== "-"):
return y-z
def (x,y,z):
x=0
y=0
z=0
zxc=int(input()):# this is where I get stuck and I don't know how to implement x,y,z into the input.
感谢所有帮助。如果您不确定您提供的代码是否过于强烈以至于我的需求,请在浪费您的时间之前询问,制作我不可能使用的代码。我保证尽快回复。
基本上我试图找到一种方法拆分输入的字符串,然后用它开始计算。
答案 0 :(得分:2)
由于这看起来像是家庭作业,我怀疑OP是否可以使用典型的方法来解决问题。我认为这是输入验证和字符串操作的练习;然后是程序流程并理解函数返回值。
您需要做两件事:
对于#1,我们知道有效输入是数字(正整数或负整数),它们必须是表达式的形式。所以这意味着,输入的最小长度将是三个(两个数字和一个数学符号),输入中的字符(字符串)无效。
这是获取用户输入的基本循环:
expression = raw_input('Please enter the expression: ')
expression_result = check_input(expression)
while not expression_result:
print 'You did not enter a valid expression'
expression = raw_input('Please enter the expression: ')
expression_result = check_input(expression)
check_input
方法将根据我们的规则验证用户输入的内容是否准确:
def check_input(input_string):
# Check the basics
if len(input_string) < 3:
return False
# Check if we are getting passed correct characters
for character in input_string:
if character not in '1234567890' or character not in '/*+-':
return False
# Things like /23 are not valid
if input_string[0] in '/*+':
return False
return input_string
输入正确后,下一步是将输入分成需要输入数学函数的各个部分。我会把那部分留给你。
假设你有正确的字符串(也就是说,它是你程序的有效输入),你现在需要将它分成两部分。
所以我们知道我们有一组有限的运算符+,-,/,*
,所以一个想法是使用split()
字符串方法。这很有效:
>>> s = '4+5'
>>> s.split('+')
['4', '5']
您可以尝试将字符串与所有运算符分开,然后检查结果。请注意,将字符串拆分为不存在的字符不会引发任何错误,但您只需返回字符串:
>>> s = '4+5'
>>> s.split('/')
['4+5']
所以一种方法是 - 在运算符上拆分字符串,如果结果列表的长度为&gt; 2,您知道结果列表的第一个成员是运算符的左侧,列表的第二个成员是右侧的任何成员。
这适用于正数,但负数却可以:
>>> s = '-4+3'
>>> s.split('-')
['', '4+3']
好消息是我们不是第一个遇到这个问题的人。还有另一种评估方程的方法,称为Polish notation(也称为前缀表示法)。这是维基百科页面中的算法:
Scan the given prefix expression from right to left
for each symbol
{
if operand then
push onto stack
if operator then
{
operand1=pop stack
operand2=pop stack
compute operand1 operator operand2
push result onto stack
}
}
return top of stack as result
要获得普通表达式(称为中缀),请使用shunting yard algorithm,这是我最喜欢的计算机科学中基于训练的算法。
使用分流场将表达式转换为波兰表示法,然后使用伪代码求解方程式。您可以使用列表作为“堆栈”。
请记住所有输入都在字符串中,因此请确保在进行实际数学运算时将它们转换为整数。
答案 1 :(得分:1)
如果您只是制作玩具计算器,eval()
接受本地和全局变量,那么您可以使用以下内容:
def calculate(x=0, y=0, z=0):
expression = raw_input('Enter an expression: ')
return eval(expression, None, locals())
以下是控制台会话示例:
>>> calculate()
Enter an expression: x + 5 - y
5
请注意eval()
不安全。如果你想要做一些严肃的事情,你将不得不解析表达式。
此外,由于表达式很简单,您可以使用正则表达式在eval
之前验证输入:
def validate(expression):
operator = r'\s*[+\-/*]\s*'
return bool(re.match(r'^\s*(?:x{o}y|x{o}y{o}z)$'.format(o=operator), expression))
答案 2 :(得分:0)
这是使用正则表达式的可能解决方案大纲。错误检查左侧为锻炼。如果这不是功课,你想看到充实的解决方案,view it here
import re
# input is a list of tokens (token is a number or operator)
tokens = raw_input()
# remove whitespace
tokens = re.sub('\s+', '', tokens)
# split by addition/subtraction operators
tokens = re.split('(-|\+)', tokens)
# takes in a string of numbers, *s, and /s. returns the result
def solve_term(tokens):
tokens = re.split('(/|\*)', tokens)
ret = float(tokens[0])
for op, num in <FILL THIS IN>:
# <apply the operation 'op' to the number 'num'>
return ret
# initialize final result to the first term's value
result = solve_term(tokens[0])
# calculate the final result by adding/subtracting terms
for op, num in <FILL THIS IN>:
result += solve_term(num) * (1 if op == '+' else -1)
print result
答案 3 :(得分:0)
我可以替代您的代码。用户可以输入如下内容:8 * 6 / 4-3 + 3,这仍然有效。如果输入字母(d,a,s),它也不会崩溃。非常紧凑。
代码(Python v3.3.0):
valid_chars = "0123456789-+/* \n";
while True:
x = "x="
y = input(" >> ")
x += y
if False in [c in valid_chars for c in y]:
print("WARNING: Invalid Equation");
continue;
if(y == "end"):
break
exec(x)
print(x)