在raw_input中输入浮点数,整数或方程式来定义变量

时间:2013-01-28 16:13:21

标签: python python-2.7 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 :(得分:1)

您需要自己解析字符串(ast模块可能有用),或者使用eval

>>> s = '6*pi'
>>> eval(s,{'__builtins__': None, 'pi': np.pi})
18.84955592153876

请注意,用户可以使用eval进行一些nasty things。我的解决方案可以保护您免受大多数,但不是全部 - 预先检查字符串以确保没有任何__会使其更安全(这会消除所有我所知道的漏洞,但可以是其他人)

答案 1 :(得分:0)

  

我希望用户输入数字,或类似6 *   np.pi(6Pi)。

要实现这一点,您需要做两件事:

  • 首先,检查您的输入是int还是float

    这很简单。您可以通过多次isinstance检查

  • 进行检查
  • 如果没有,那么您需要将输入作为命令执行并将输出保存在变量中

    一旦确定它是一个命令,那么您可以使用execeval命令来执行输入并将输出存储在变量中。

    示例:exec("""v = 6*2""")v = eval("6*2")两者都将12分配给v

答案 2 :(得分:0)


我使用的是Python 2.7和Ecplise工作区。 这个源代码对我来说很合适,使用 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"

在这里,输入:
姓名:&#34;先生! Guido von Rossum&#34; 和半径: 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

思考,可能会帮助你或其他人 感谢