こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

python プログラミング

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

投稿日時 - 2012-10-29 00:00:17

QNo.7771123

困ってます

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

まずエラーが出る原因から、
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))

投稿日時 - 2012-11-12 00:50:37

お礼

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

投稿日時 - 2012-11-12 01:33:18

ANo.8

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(8)

ANo.7

No.6の補足欄について

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

投稿日時 - 2012-11-09 21:16:47

補足

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のところで、エラーが出ますどうしてでしょうか。
よろしくお願いします。

投稿日時 - 2012-11-11 18:38:00

ANo.6

man xargs
でコマンドの使い方が分かりますので調べてみてください。

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

投稿日時 - 2012-11-08 08:11:06

補足

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

投稿日時 - 2012-11-09 16:33:10

ANo.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
のように使います。

投稿日時 - 2012-11-06 19:06:51

補足

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

投稿日時 - 2012-11-07 16:14:17

ANo.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の値を入れると計算できます。

投稿日時 - 2012-11-01 17:25:18

補足

ありがとうございます。うまくいきました。

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

投稿日時 - 2012-11-05 14:43:26

ANo.3

関数の定義しかありませんので、実行ができていないのです。
入力と関数呼び出しを追加しておきました。
三行目のreturnから始まる行だけ、前に空白をいれて関数の定義として認識させてください。

#!/usr/bin/python
def CircleArea(r):
return r*r*3.14
a=float(input("r?"))
print (a, CircleArea(a))

投稿日時 - 2012-11-01 12:09:52

補足

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

投稿日時 - 2012-11-01 15:28:44

ANo.2

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

投稿日時 - 2012-10-30 01:19:37

補足

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

投稿日時 - 2012-10-31 15:14:05

ANo.1

最初の行にpythonのある場所を以下のように指定します
#!/usr/bin/python
またはこちらでも
#!/usr/bin/env python
二行目以降からプログラムを書きます

そして実行権限を与えます。
chmod a+x circle.py
これで実行できます。
カレントディレクトリにcircle.pyがある場合には
./circle.py
でないと実行できない場合ばあります。

投稿日時 - 2012-10-29 17:05:56

補足

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

投稿日時 - 2012-10-29 23:42:19

あなたにオススメの質問