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

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

ただいまの
回答率

90.51%

  • Python

    11677questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,381

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

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

 先に正解を記載します

fruits_price = {'りんご': 100,
                'みかん': 50,
                'もも': 300}

tax = 8

def get_price_in_tax(fruit_name):
    if fruit_name not in fruits_price:
        return
    return int(fruits_price[fruit_name] * (tax / 100 + 1))



def main():
    # 今日仕入れた果物
    today_fruits = ['ぶどう', 'りんご', 'みかん']
    for fruit in today_fruits:
        fruit_price = get_price_in_tax(fruit)
        if fruit_price is not None:
            print('{}の税込価格は{:,d}円です'.format(fruit, fruit_price))
        else:
            print('{}の価格は登録されていません'.format(fruit))


if __name__ == '__main__':
    main()

 よく分からない点①

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

 よく分からない点②

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

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

fruits_price = {'りんご': 100,
                'みかん': 50,
                'もも': 300}

tax = 8


def get_price_in_tax(fruit_name):
    for frupri in fruits_price.values():
        includetax = frupri * (100 + int(tax)) / 100
        return int(includetax)


def main():
    # 今日仕入れた果物
    today_fruits = ['ぶどう', 'りんご', 'みかん']
    for fruit in today_fruits:
        fruit_price = get_price_in_tax(fruit)
        if fruit in fruits_price:
            print('{}の税込価格は{:,d}円です'.format(fruit, fruit_price))
        else:
            print('{}の価格は登録されていません'.format(fruit))


if __name__ == '__main__':
    main()

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

よく分からない点①

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

 よく分からない点②

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/21 23:21

    素早いご回答ありがとうございます。

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

    キャンセル

  • 2018/08/21 23:33

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

    キャンセル

  • 2018/08/22 19:09

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

    キャンセル

checkベストアンサー

+1

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を返すんでした。

>>> nan = float('nan')
>>>
>>> nan is nan
True
>>> nan == nan
False

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/21 23:17

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

    キャンセル

同じタグがついた質問を見る

  • Python

    11677questions

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