1

このプログラムを作成したので、ユーザーが定義した値に基づいて 2 つの方程式を解きます。定数 kx と ky は float として定義しました。範囲 - 変数 start と end - については、ユーザーに数値または 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()
4

3 に答える 3

1

文字列を自分で解析するか(astモジュールはおそらく便利です)、次を使用する必要がありますeval

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

ユーザーがでできる厄介なことがいくつかあることに注意してくださいeval私のソリューションはそれらのほとんどからあなたを保護しますが、すべてではありません-文字列がないことを事前にチェックして、__それをさらに安全にします(これにより、私が知っているすべての脆弱性が排除されますが、他の脆弱性が存在する可能性があります)。

于 2013-01-28T16:18:26.183 に答える
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"

ここで、入力:
name: "Sir! Guido von Rossum" and
radius: 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

思った、それはあなたや他の誰かを助けるかもしれません.
ありがとう

于 2016-10-26T11:59:26.017 に答える
0

ユーザーに数値または 6 * np.pi (6Pi) のようなものを入力してもらいたいと思います。

これを実装するには、次の 2 つのことを行う必要があります。

  • まず、入力が int か float かを確認します

    これは簡単です。これは、複数のisinstanceチェックで確認できます

  • そうでない場合は、入力をコマンドとして実行し、出力を変数に保存する必要があります

    コマンドであることを確認したら、execorevalコマンドを使用して入力を実行し、出力を変数に格納できます。

    例 :exec("""v = 6*2""")またはv = eval("6*2")両方に 12 を割り当てるv

于 2013-01-28T16:17:45.340 に答える