質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

2432閲覧

defの使い方について

mau

総合スコア13

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/03/12 01:29

編集2019/03/12 23:01

平素よりお世話になっております。pythonの関数についていまいちわからないので質問させていただきます。
関数(def)→同様の動作をいたるところで繰り返し行うもの
という認識をしています。そのことを踏まえて次のプログラムを書いてみたのですがうまく動作しません。

def calc_fee(): age=int(input("あなたの年齢を教えてください。")) dotw=input("本日は月曜日ですか?はい1いいえ2") fee=2000 if age<3: fee=0 elif age<6: fee=1000 elif age>=60: fee=1500 if is_monday==1: fee=fee*0.8 print(fee) flg=0 feeT=0 while flg==1: calc_fee() feeT=feeT+fee flg=input("まだ人はいますか?はい1いいえ2")

この手の内容であれば、わざわざdefを使わなくてもできる内容ではあるのですがdefを使った場合はどのように動作できるのだろうと思い作ってみました。しかし、inputを使うと動作しなくなるという現象が発生してしまいました。また、定義した関数を利用する際、引数をinputを使い代入するということは可能でしょうか?引数は必ず整数型や実数型でなければいけないのでしょうか?
例えば、

def calc_fee(age,is_monday): fee=2000 if age<3: fee=0 elif age<6: fee=1000 elif age>=60: fee=1500 if is_monday==True: fee=fee*0.8 print(fee) calc_fee(18,True) calc_fee(3,False) calc_fee(60,True) x=input("年齢を教えてください") calc_fee(x,False)

回答よろしくお願いします。

修正後

def calc_fee(): age=int(input("あなたの年齢を教えてください。")) dotw=int(input("本日は月曜日ですか?はい1いいえ2")) fee=2000 if age<3: fee=0 elif age<6: fee=1000 elif age>=60: fee=1500 if is_monday: fee=fee*0.8 print(fee) flg=0 feeT=0 while flg==1: calc_fee() feeT=feeT+fee flg=int(input("まだ人はいますか?はい1いいえ2"))
def calc_fee(age,is_monday): fee=2000 if age<3: fee=0 elif age<6: fee=1000 elif age>=60: fee=1500 if is_monday==True: fee=fee*0.8 print(fee) calc_fee(18,True) calc_fee(3,False) calc_fee(60,True) x=int(input("年齢を教えてください")) calc_fee(x,False)

上の方はエラーすらでないで動かいない状態です。
下の方は、
x=input("年齢を教えてください")→x=int(input("年齢を教えてください"))
に変えることで、無事動きました。ありがとうございました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gogojp

2019/03/12 01:48

プログラムはコードタグ使って記述してください。 Pythonはインデントが重要になるので、編集の方お願いします。
mau

2019/03/12 02:01

すいませんでした。コードタグを使い投稿しなおしました。回答よろしくお願いします。
Q71

2019/03/12 12:16

20歳のfeeはいくら? else 句に範囲漏れがありますよ。 境界テストなら3,6,60だけでなく、2,3,4,5,6,7,59,60,61と、コード中の分岐点の前後も含めましょう。
mau

2019/03/12 22:38

範囲外はfee=2000としているはずですが、elifかelseで範囲指定をした方がいいものなんでしょうか?
guest

回答3

0

型の問題についてはotnさんのご指摘の通りですが、重ねて言えばfee=0のような関数内での代入はすべてローカル変数への代入になりますので、意図通り動かないと思います。

関数(def)→同様の動作をいたるところで繰り返し行うもの

だと単純に呼び出した時点で関数内の一行目にジャンプし、実行が終われば戻ってくるだけ・・・と認識しておられるかと思いますが、実際はそれほど単純ではありません。呼び出し元と呼び出し先で名前空間が変わります。

あえて例えで書くと、普段は普通の机で仕事をしているけど、なにか特別な作業をするために荷物を持って別の机に移動してそこで作業する。作業が終わったら移動先の机の上のものは原則破棄されるので、元の机と同じ位置に置いておけば元の机に戻って使える訳ではなく、意識的に持ち帰らないといけないという感じです。

投稿2019/03/12 07:48

編集2019/03/12 07:54
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mau

2019/03/12 08:14

回答ありがとうございます。関数内で生成されたものは別の箱に入れなければ、生成したどまりになってしまうということなのですね。すなわち、料理は作ったはいいけど、作ったものをそのままゴミ箱に捨ててしまうという状態なのですね。しかし、変数の参照以前の話で、そもそもinputの文章すら表示されないのです。
hayataka2049

2019/03/12 08:53 編集

otnさんの回答を参考に修正してもできませんか? エラーの全文(というか実行後に表示される文字列すべてのコピペ)と修正したコードを質問に追記してください。
hayataka2049

2019/03/13 06:49

flg=0 feeT=0 while flg==1: flg=0で初期化したなら、いきなりwhile False:ですねぇ
mau

2019/03/13 09:19

確かにそうですね。お恥ずかしいミスをしました。ご指摘ありがとうございます。
guest

0

ベストアンサー

少し直してみましたがどうでしょうか?
計算を行うcalc_fee()と、それを呼び出すmain()に分けてみました。
main()を実行するだけで動作します。
具体的には、これらを直しました。

  • dotwが利用されていなかった
  • flgが0でwhileが実行されていなかった
  • 関数外でfeeが定義されていなかった

Python3

1def calc_fee(age, dotw): 2 if age < 3: 3 fee = 0 4 elif age < 6: 5 fee = 1000 6 elif age >= 60: 7 fee = 1500 8 else: 9 fee = 2000 10 11 if dotw == 1: 12 fee *= 0.8 13 return fee 14 15 16def main(): 17 flg = 1 18 feeT = 0 19 while flg == 1: 20 age = int(input("あなたの年齢を教えてください。")) 21 dotw = int(input("本日は月曜日ですか?はい1いいえ2")) 22 fee = calc_fee(age, dotw) 23 feeT += fee 24 print(feeT) 25 flg = int(input("まだ人はいますか?はい1いいえ2")) 26 27 28main() 29

投稿2019/03/13 06:26

編集2019/03/13 06:45
nuts3745

総合スコア30

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mau

2019/03/13 09:29

なるほど、main関数と計算するための関数に分けて処理を分かりやすくしたこと、またローカル変数にすることで仮に他の場所でflgを使えるという感じにして下さったのですね。main()はすごくC言語ぽくて好きです。
guest

0

x=input("年齢を教えてください")

int()が抜けています。

あと、

if is_monday==True:

は、普通は、
if is_monday:と書きます。

投稿2019/03/12 01:47

otn

総合スコア84505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mau

2019/03/12 02:00

回答ありがとうございます。x=input("年齢を教えてください")ですが、なぜ文字列は引数として扱えないのかということを伺いたいのです
otn

2019/03/12 02:02

文字列でも使えますよ。 その場合は、calc_fee 側でageをint()してください。
mau

2019/03/12 02:12

つまり、strのままだと機能しないということなんですね
otn

2019/03/12 02:21

文字列だと、数値である3や6や60との大小比較ができません。 大小比較は、数値同士(数学的な意味での比較)、または、文字列同士(辞書順でどちらが先になるか)で行います。数値と文字列の大小比較はできません。
mau

2019/03/12 02:42

引数を文字型で代入することがエラーにつながっているのではなく、その後の数字と文字の大小比較が行えないのでエラーが起きてしまうのですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問