在raw_input中输入浮点数、整数或方程以定义变量
我写了一个程序,用来根据用户输入的值解决两个方程。常量 kx 和 ky 我定义为浮点数。对于范围 - 变量的开始和结束 - 我希望用户可以输入一个数字,或者像 6 * np.pi 这样的表达式(6Pi)。现在的情况是,我遇到了一个错误。我该如何定义这个变量,以便让用户可以输入多种类型的内容呢?谢谢!
Traceback (most recent call last):
File "lab1_2.py", line 11, in <module>
x = np.linspace(start, end, 256, endpoint=True)
File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site- packages/numpy/core/function_base.py", line 80, in linspace
step = (stop-start)/float((num-1))
TypeError: unsupported operand type(s) for -: 'str' and 'float'
这是代码:
from pylab import *
import numpy as np
kx = float(raw_input("kx: "))
ky = float(raw_input("ky: "))
print "Define the range of the output:"
start = float(raw_input("From: "))
end = float((raw_input("To: "))
x = np.linspace(start, end, 256, endpoint=True)
y = np.linspace(start, end, 256, endpoint=True)
dz_dx = ((1 / 2.0) * kx * np.exp((-kx * x) / 2)) * ((2 * np.cos(kx *x)) - (np.sin(kx * x)))
dz_dy = ((1 / 2.0) * ky * np.exp((-ky * y) / 2)) * ((2 * np.cos(ky *y)) - (np.sin(ky * y)))
plot(x, dz_dx, linewidth = 1.0)
plot(y, dz_dy, linewidth = 1.0)
grid(True)
show()
3 个回答
0
我正在使用Python 2.7和Eclipse工作区。
这段源代码在我这里运行得很好,使用的是raw_input。
import time
startTime = time.clock()
print "{0:*^80}".format(" Begins ")
name = raw_input('Please give the name : ')
print "Name is : ".ljust(40, '.'), name
print "Length of name : ".ljust(40, '.'), len(name)
print
radius = float(raw_input('Please enter the radius of circle : '))
print "Radius is : ".ljust(40, '.'),radius
diameter = float(2 * radius)
print "Diameter of circle is : ".ljust(40, '.'), diameter
print "\n{0:*^80}".format(" End ")
print "\nElapsed time : ", (time.clock() - startTime)*1000000, "microseconds"
这里,输入:
名字:"Sir! Guido von Rossum" 和
半径:1.1
输出:
************************************ Begins ************************************
Please give the name : Sir! Guido von Rossum
Name is : .............................. Sir! Guido von Rossum
Length of name : ....................... 21
Please enter the radius of circle : 1.1
Radius is : ............................ 1.1
Diameter of circle is : ................ 2.2
************************************* End **************************************
Elapsed time : 3593748.49903 microseconds
希望这对你或其他人有帮助。
谢谢
0
我希望用户能够输入一个数字,或者像 6 * np.pi 这样的表达式(6Pi)。
要实现这个功能,你需要做两件事:
首先,检查你的输入是整数还是浮点数
这很简单。你可以通过多次使用
isinstance
来检查。如果不是,那么你需要把输入当作命令来执行,并把结果保存到一个变量里
一旦你确认它是一个命令,你就可以使用
exec
或eval
来执行这个输入,并把结果存储到一个变量中。举个例子:
exec("""v = 6*2""")
或者v = eval("6*2")
,这两种方式都会把 12 赋值给v
。
1
你需要自己解析这个字符串(可以考虑使用 ast
模块,这个模块可能会很有帮助),或者使用 eval
来处理:
>>> s = '6*pi'
>>> eval(s,{'__builtins__': None, 'pi': np.pi})
18.84955592153876
要注意的是,用户可以用 eval
做一些很危险的事情。我的解决方案可以保护你免受大部分的攻击,但不是全部——在使用之前先检查一下字符串,确保里面没有 __
,这样会更安全(这样可以消除我知道的所有漏洞,但可能还有其他的漏洞)。