• ベストアンサー

python プログラミング

pythonで、 def CircleArea(): a=r*r*3.14 print(r,a) というプログラムをunixのvimでcircle.pyで保存しました。 今度はこれをpythonで実行したいと思って, ターミナルに, circle.pyと入力しましたが, 実行しません。どうすればよろしいでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • ki073
  • ベストアンサー率77% (491/634)
回答No.8

まずエラーが出る原因から、 u=parallax(a) ですが、関数名はParallaxと大文字から始まっているので、合わせてください。また引数がaになっていますが、sのはずです。 それと、 t=float(input("b?") は)が不足しています。 次に改良点ですが、 printの中でまたにParallax(s)が呼ばれていますので、uに変更しました。 もうひとつ関数の中の数値が整数型になっています。このプログラムでは問題はないのですが、もし整数/整数を実行した場合には、結果が浮動小数点にならずに整数で切り捨てられてしまいますので大きな誤差になります。特に理由がなければ浮動小数点にした方が良いように思います。 s=float(input("a?"))が関数定義の間に入っていました。これでも正常に動作しますが、関数定義とは場所を分けた方が気持ちがよいので、下に移しました。 修正したものは以下の通りです。 #!/usr/bin/env python from math import* def Parallax(a): return 1.0/a def AbMagnitude(b,u): return b-5.0*log(u/10.0) s=float(input("a?")) u=Parallax(s) t=float(input("b?")) print(s,u,t,AbMagnitude(t,u))

leibniz1098
質問者

お礼

ありがとうございます。前の補足の後、自分なりに間違いを見つけて、プログラムを実行できるようにしたものと、今回の改良されたプログラムがほとんど一致していたのでよかったです。 丁寧な添削、回答を長い間ありがとうございました。

その他の回答 (7)

  • ki073
  • ベストアンサー率77% (491/634)
回答No.7

No.6の補足欄について これまでの回答で必要な情報は全て書いています。もう一度読み直してください。 自分で作ったプログラムを書き込んでください。 添削はいたします。

leibniz1098
質問者

補足

circle.pyのプログラム作成はできました。ありがとうございます。 次に、 #!/usr/bin/env python from math import* def Parallax(a): return 1/a s=float(input("a?")) def AbMagnitude(b,u): return b-5*log(u/10) u=parallax(a) t=float(input("b?") print(s,Parallax(s),t,AbMagnitude(t,u)) というプログラムを作りましたが、printのところで、エラーが出ますどうしてでしょうか。 よろしくお願いします。

  • ki073
  • ベストアンサー率77% (491/634)
回答No.6

man xargs でコマンドの使い方が分かりますので調べてみてください。 -L 1が必要かは cat data.txt |xargs -p -L 1 ./circle.py cat data.txt |xargs -p ./circle.py のように-pを追加すると実行されるコマンドが分かりますので試してみてください。

leibniz1098
質問者

補足

ありがとうございます。 手間を取ってすみませんが、 前の回答・質問に関してなのですが、def CircleArea(r,b)の関数の値を使って、def Time(CircleArea(r,b)) 3*CircleArea(r,b)を、計算したいのですが、どうすればよいでしょうか? よろしくお願いします。

  • ki073
  • ベストアンサー率77% (491/634)
回答No.5

表にするなら、単純な計算は表計算ソフトでやるのが早いですが。 なんとなく丸投げっぽいですが、Pythonでやるのは基本の基本なので考えてもらうとして No.3のプログラムを使って一括して計算する方法を書いておきます。 まず、1行に2つの数値を空白(tabでも良さそう)で区切って書いたファイルを作ります。 1 2 4 5 6 8 こんな感じのファイルdata.txtを作ったとします。 それぞれの行を引数として渡して ./circle.py 1 2 ./circle.py 4 5 ./circle.py 6 8 と3回実行してくれれば全部計算されます。 UNIX系ではこのようなことをうまくやってくれるxargsがあります。 cat data.txt|xargs -L 1 ./circle.py のように使います。

leibniz1098
質問者

補足

cat data.txt|xargs -L 1 の-L 1の意味は何でしょうか。簡単な質問かもしれませんが、ご教授お願いします。

  • ki073
  • ベストアンサー率77% (491/634)
回答No.4

>3行目をreturn r*r*b*3.14として、r,bを両方聴くにはどうしたらいいでしょうか? まず、関数def CircleArea(r):にbも渡せるように、 def CircleArea(r, b):のようにしまします。 a=float(input("r?"))と同じように、bに関してもう一行追加します。このあたりは基本中の基本で自分で考えてみてください。 余談ですが、 コマンドから数値を指定する方法を書いておきます。 #!/usr/bin/python import sys param = sys.argv r=float(param[1]) b=float(param[2]) print (r,b, r*r*b*3.14) 関数にしていないので字下げは必要ありません。 カレントディレクトリにある場合には ./circle.py 3 5 のように後ろにr, bの値を入れると計算できます。

leibniz1098
質問者

補足

ありがとうございます。うまくいきました。 また、質問なのですが、いちいち、データを1つずつ打ち込むのは大変なので、表で一括にして、プログラムを実行する方法はあるのでしょうか? よろしくお願いします。

  • ki073
  • ベストアンサー率77% (491/634)
回答No.3

関数の定義しかありませんので、実行ができていないのです。 入力と関数呼び出しを追加しておきました。 三行目のreturnから始まる行だけ、前に空白をいれて関数の定義として認識させてください。 #!/usr/bin/python def CircleArea(r): return r*r*3.14 a=float(input("r?")) print (a, CircleArea(a))

leibniz1098
質問者

補足

ありがとうございます。うまくいきました。 また、質問ですが、3行目をreturn r*r*b*3.14として、r,bを両方聴くにはどうしたらいいでしょうか?

  • ki073
  • ベストアンサー率77% (491/634)
回答No.2

>実行権限はどこで与えるのでしょうか? 作成したファイルcircle.pyに対して与えます。 chmod a+x circle.py のコマンドで可能です。

leibniz1098
質問者

補足

実行権限をつけて実行したのですが、rについて聞いてきません。どうすればよろしいでしょうか?

  • ki073
  • ベストアンサー率77% (491/634)
回答No.1

最初の行にpythonのある場所を以下のように指定します #!/usr/bin/python またはこちらでも #!/usr/bin/env python 二行目以降からプログラムを書きます そして実行権限を与えます。 chmod a+x circle.py これで実行できます。 カレントディレクトリにcircle.pyがある場合には ./circle.py でないと実行できない場合ばあります。

leibniz1098
質問者

補足

すみません。1つ分からないところがあるのですが、実行権限はどこで与えるのでしょうか? よろしくお願いします。

関連するQ&A

専門家に質問してみよう