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

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

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

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

Q&A

解決済

2回答

5626閲覧

[python]is not Noneという表現について

hiroshimaeasyry

総合スコア15

Python

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

0グッド

0クリップ

投稿2018/08/21 10:04

果物の税込価格を返すプログラムを作成したい

<前提>
・辞書fruits_priceはキーに果物の名前、値に価格を持っている
・変数taxは税率(%)
・関数get_priceは指定した果物の名前の価格を辞書fruitsの中から取得し、税込価格を返す
・辞書fruitsの中に名前が存在しない場合はNoneを返す
・税込み価格は価格 + 価格*税率/100の答えを小数点以下を切り捨てたもの
・関数get_priceがNoneを返さなかった場合、果物の名前と価格を表示し、Noneの場合は登録されていない旨を表示する

先に正解を記載します

python

1fruits_price = {'りんご': 100, 2 'みかん': 50, 3 'もも': 300} 4 5tax = 8 6 7def get_price_in_tax(fruit_name): 8 if fruit_name not in fruits_price: 9 return 10 return int(fruits_price[fruit_name] * (tax / 100 + 1)) 11 12 13 14def main(): 15 # 今日仕入れた果物 16 today_fruits = ['ぶどう', 'りんご', 'みかん'] 17 for fruit in today_fruits: 18 fruit_price = get_price_in_tax(fruit) 19 if fruit_price is not None: 20 print('{}の税込価格は{:,d}円です'.format(fruit, fruit_price)) 21 else: 22 print('{}の価格は登録されていません'.format(fruit)) 23 24 25if __name__ == '__main__': 26 main() 27

よく分からない点①

get_price_in_taxメソッド内で、税込価格を返すのはわかりますが、
if分の条件分岐でfruits_priceの中にfruit_nameが入っていなかったら
returnするものって何なのでしょうか?

よく分からない点②

mainメソッド内の条件分岐で、
if fruit_price is not None:
の意味は fruit_priceがNone(偽)じゃなければ
税込価格を出力する、という意味合いだと思いますが、
なぜこのような遠回しな言い方をしなければいけないのかわかりません。
そもそもNoneの性質がよくわかっておらず、なぜ==や!=ではなくて、
is や is notを使うのか、よくわかっていません。

下のように記述した結果、違う出力結果が出てきました。

python

1fruits_price = {'りんご': 100, 2 'みかん': 50, 3 'もも': 300} 4 5tax = 8 6 7 8def get_price_in_tax(fruit_name): 9 for frupri in fruits_price.values(): 10 includetax = frupri * (100 + int(tax)) / 100 11 return int(includetax) 12 13 14def main(): 15 # 今日仕入れた果物 16 today_fruits = ['ぶどう', 'りんご', 'みかん'] 17 for fruit in today_fruits: 18 fruit_price = get_price_in_tax(fruit) 19 if fruit in fruits_price: 20 print('{}の税込価格は{:,d}円です'.format(fruit, fruit_price)) 21 else: 22 print('{}の価格は登録されていません'.format(fruit)) 23 24 25if __name__ == '__main__': 26 main() 27

初歩的な質問かも知れませんが、教えていただけるとありがたいです。

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

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

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

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

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

guest

回答2

0

よく分からない点①

return文は特に何も与えなければNoneを返します。

よく分からない点②

!= Noneでも機能的には同じ結果が得られます(ただし意図的にそうならないコードを書くことはできます。絶対確実にNoneでないことを保証したければisを使った方が良いです)。

isというのはいわゆるアドレス比較で、高速に処理されます。
参考:
PythonではNoneの比較は==ではなくisを使う - こんにちはこんにちはmonmonです!

2つめのコードは、get_price_in_taxが引数のfruit_nameに関わりなく辞書のいずれかの要素に該当するものを返すという処理ですが、まったく意図している処理と違うのでは?

投稿2018/08/21 10:16

hayataka2049

総合スコア30933

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

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

hiroshimaeasyry

2018/08/21 14:21

素早いご回答ありがとうございます。 >2つめのコードは、get_price_in_taxが引数のfruit_nameに関わりなく辞書のいずれかの要素に該当するものを返すという処理ですが、まったく意図している処理と違うのでは? まったく意図している処理と違います。 もしよろしければ、なぜこのコードがget_price_in_taxが引数のfruit_nameに関わりなく辞書のいずれかの要素に該当するものを返すという処理、になっているのか教えていただけますでしょうか?
hayataka2049

2018/08/21 14:33

その関数自体は引数を消しても動きますよね、というのがまず一つ。そもそもfruit_nameが計算のプロセスに何ら関与していない時点でおかしいのです dict.values()はdictの値をランダムな順番で返します。また、return文が実行されると関数はその時点で処理打ち切りになって返ってしまいます なので、どれかのフルーツの値段に対して税込価格を計算する、というまったく出鱈目な処理をしています
hiroshimaeasyry

2018/08/22 10:09

非常によくわかりました!ありがとうございます! 意味がわかり、非常に間抜けなコードを書いてしまったと恥ずかしく思います!
guest

0

ベストアンサー

get_price_in_taxメソッド内で、税込価格を返すのはわかりますが、

if分の条件分岐でfruits_priceの中にfruit_nameが入っていなかったら
returnするものって何なのでしょうか?

Pythonでは、単にreturnとだけ書いた場合はreturn Noneと同じ意味です。

mainメソッド内の条件分岐で、

if fruit_price is not None:
の意味は fruit_priceがNone(偽)じゃなければ
税込価格を出力する、という意味合いだと思いますが、
なぜこのような遠回しな言い方をしなければいけないのかわかりません。
そもそもNoneの性質がよくわかっておらず、なぜ==や!=ではなくて、
is や is notを使うのか、よくわかっていません。

==オブジェクトが同値であるか判定し、
isオブジェクトが同一であるか判定します。

この差はなかなか理解しがたいものがあるので、
とりあえず『Noneのときはisを使うんだな』という感覚でも問題ないと思います。

調べると説明はいろいろ出てきますので、まずはひととおり読んでみましょう。
Google - python == is

下のように記述した結果、違う出力結果が出てきました。

その疑問に基づいてis notを置き換えるならば!=では。
ふつう(註)はそれでも期待通り動作するはずです。

註:
object.__eq__をオーバーライドすればハック可能ではあります。
同一オブジェクトの比較でFalseを返す実装なんて、真っ当な人なら採用しませんが。

追記:
良く考えれば、nan同士の比較は常にFalseを返すんでした。

Python

1>>> nan = float('nan') 2>>> 3>>> nan is nan 4True 5>>> nan == nan 6False

ただし、これはかなり特殊なケースです。
普通はa is bがTrueならa == bもTrueになると思ってよいでしょう。

投稿2018/08/21 10:15

編集2018/08/21 14:24
LouiS0616

総合スコア35660

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

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

hiroshimaeasyry

2018/08/21 14:17

ご丁寧な回答ありがとうございます。 >Pythonでは、単にreturnとだけ書いた場合はreturn Noneと同じ意味です。 非常にシンプルでよくわかりました。 >その疑問に基づいてis notを置き換えるならば!=では。 そもそも条件分岐のifで、「〜なら」を「None じゃないなら」と置き換える発想が なかったですしそもそもis notすらも頭になかったのですが、 今回の件で学ばせていただきました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問