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

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

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

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

Q&A

解決済

1回答

2055閲覧

function内の変数がfunction扱いになってしまってunsupported operand type(s) が表示される

Zawakita

総合スコア7

Python

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

0グッド

0クリップ

投稿2020/03/07 15:56

やったこと

math.floorを使って指定した桁数で切り捨てる関数int_floor()を作りました。

やりたいこと

この関数の戻り値をうまく使って、他の関数をすっきり記述したい。

問題点

このように普通に第一引数に数字を入れれば問題なく実行できるのですが、

python

1def int_floor(num, range): 2 return int(math.floor(num / float(range) * range)) 3 4int_floor(1650, 100)

他の関数の中で使うとエラーが出ます。

python

1import math 2price = 3.75 3num_pack = 50 4qua_pack = 50 5tariff_rate = 0.298 6rate = 107.98 7transport_fee = 68.82 8 9def main(): 10 pay = calc_pay(price, num_pack, transport_fee, rate) 11 tax = calc_tax(price, num_pack) 12 tariff = calc_tariff(tariff_rate) 13 consumption = calc_consumption() 14 local_con = calc_LocalConsumption() 15 tobaccotax = calc_TobaccoTax() 16 17 print( 18 "代金:", pay, "\n", 19 "課税価格:", tax, "\n", 20 "関税:", tariff, "\n", 21 "消費税:", consumption, "\n", 22 "地方消費税:", local_con, "\n", 23 "たばこ税:", tobaccotax, "\n", 24 "合計税金額:", tariff + consumption + local_con + tobaccotax, "\n", 25 "合計金額:",pay + tariff + consumption + local_con + tobaccotax, "\n", 26 ) 27 28def int_floor(num, range): 29 return int(math.floor(num / float(range) * range)) 30 31def calc_pay(price, num_pack, transport_fee, rate): 32 return int(math.ceil((price * num_pack + transport_fee) * rate)) 33 34def calc_tax(price, num_pack): 35 return int(math.ceil(price * num_pack *0.6)) 36 37def calc_tariff(tariff_rate): 38 return int_floor(int_floor(tax, 1000) * tariff_rate, 100) 39 40def calc_consumption(): 41 return int_floor(int_floor(pay + tariff, 1000) * 0.078, 100) 42 43def calc_LocalConsumption(): 44 return int_floor(consumption * 22 / 78, 100) 45 46def calc_TobaccoTax(num_pack, qua_pack): 47 return 13244 * num_pack * qua_pack / 1000 48 49main() 50 51

このようにint_floorのreturnをint_floorの第一引数に代入する形にするとエラーが出てしまいます。

python

1TypeError Traceback (most recent call last) 2<ipython-input-25-263240bbee7e> in <module> 3----> 1 main() 4 5<ipython-input-24-5926fed5c615> in main() 6 10 pay = calc_pay(price, num_pack, transport_fee, rate) 7 11 tax = calc_tax(price, num_pack) 8---> 12 tariff = calc_tariff(tariff_rate) 9 13 consumption = calc_consumption() 10 14 local_con = calc_LocalConsumption() 11 12<ipython-input-24-5926fed5c615> in calc_tariff(tariff_rate) 13 36 14 37 def calc_tariff(tariff_rate): 15---> 38 return int_floor(int_floor(tax, 1000) * tariff_rate, 100) 16 39 17 40 def calc_consumption(): 18 19<ipython-input-24-5926fed5c615> in int_floor(num, range) 20 27 21 28 def int_floor(num, range): 22---> 29 return int(math.floor(num / float(range) * range)) 23 30 24 31 def calc_pay(price, num_pack, transport_fee, rate): 25 26TypeError: unsupported operand type(s) for /: 'function' and 'float' 27

int_floor()はreturnで整数型を返すようにしているのに、なぜこのようなエラーになるのでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

int_floor(tax, 1000)の部分でtaxを参照しますが、このtaxは「ないはず」です。実際、そのコード単体で実行すると「taxなんか定義されてないよ(NameError: name 'tax' is not defined)」というエラーになります。

taxmain関数のローカル変数にはありますが、下に並んでいる関数の定義はmain関数のスコープ外にあるので、このtaxは参照できません。

Jupyterなどの対話環境では、再起動するまでは以前定義したものが残るので、taxを何らかの形で関数として以前定義していたという可能性が高いです。

とりあえず、Jupyterのカーネルを再起動して、定義している関数は適切に引数を増やすか、グローバル変数として扱うようにしましょう。よくわからなければ変数のスコープの仕組みについて勉強してみてください。

投稿2020/03/07 17:31

hayataka2049

総合スコア30933

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

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

Zawakita

2020/12/02 10:27

遅ればせながらベストアンサーにさせていただきました。おかげさまで解決いたしました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問