如何让用户使用“sqrt()”+输入来查找输入的平方根?

时间:2014-03-01 07:28:01

标签: python math input sqrt square-root

我还在学习python所以请你好:)我想让用户做这样的事情:

>> sqrt(4) #input
2 #output

>> sqrt(8) #input
2*rad(2) #if this is not possible, just say something like "not valid"

>> 4*4 #1st input
16 #1st output
>> sqrt(ans()) #2nd input
4 #2nd output

我的代码:

from math import sqrt
valid_chars = "0123456789-+/*ansqrt() \n"
while True:
    x = "x="
    y = input(" >> ")
    x += y
    def ans():
        try:
            return z
        except NameError:
            return 0
    if(y == "end" or y == "End" or y == "exit" or y == "Exit" or y == "cancel" or y == "Cancel"):
                        break
    if any(c not in valid_chars for c in y):
        print("WARNING: Invalid Equation")
        continue
    try:
        exec(x)
    except (SyntaxError, ZeroDivisionError, NameError, TypeError, ValueError):
        print ("WARNING: Invalid Equation")
    if not(y == "()"):
        z = x
        print(x)
    else:
        print("WARNING: Invalid Equation")

如果用户输入如下内容:

>> sqrt()x
WARNING: Invalid Equation

我知道我必须将valid_chars更改为:

valid_chars = "0123456789-+/*ansqrt() \n"

或者其他什么。然而,对于其他人,我几乎没有任何线索。提前感谢您,如果您有任何疑问或认为这是不完整的,请评论一下! :)另外,不要回答:D

更新

一些想法:

取“()”内部或外部的值。然后使该值等于例如“s”。之后:

d = sqrt((int(s)))
print (d)

但是,我需要的东西会排除导致错误的输入,因此程序不会崩溃。

另外,我没有公开这个,所以你可以忽略这样一个事实,即将python语句作为输入是一个坏主意。但是,我对如何与eval()做同样的事情感兴趣。感谢

更新的代码:

问题已解决:

                from math import sort
                valid_chars = "0123456789-+/*ansqrt() \n";
                while True:
                    x = "x="
                    y = input(" >> ")
                    x += y
                    def ans():
                        try:
                            return z
                        except NameError:
                            return 0
                    if(y == "end" or y == "End" or y == "exit" or y == "Exit" or y == "cancel" or y == "Cancel"):
                        break
                    if any(c not in valid_chars for c in y):
                        print("WARNING: Invalid Equation")
                        continue
                    try:
                        exec(x)
                    except (SyntaxError, ZeroDivisionError, NameError, TypeError, ValueError):
                        print ("WARNING: Invalid Equation")
                    else:
                        if not(y == "()"):
                            z = x
                            print(x)
                        else:
                            print("WARNING: Invalid Equation")

1 个答案:

答案 0 :(得分:3)

我会以不同的方式尝试做你想要的答案。顺便说一句,你不应该使用' eval()'通常但在这种情况下我认为这是最简单的方法:

编辑:eval()是邪恶的,一般不应该使用!但是我仍然建议这个答案,因为OP明确表示他不会公开代码,并且他知道在评估用户输入时所涉及的风险。

import sys
from math import sqrt

while True:
  question = raw_input('Please input an equation: \n')
  if question == 'exit()':
    sys.exit('Bye')
  try:
    answer = eval(question)
    ans = answer
  except:
    print 'Invalid operation'
    continue
  print answer

输出(适用于Python 2.7):

>>Please input an equation: 
>>sqrt(16)    
>>4.0
>>Please input an equation: 
>>sqrt(ans)
>>2.0
>>Please input an equation:
>>exit()
>>Bye