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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

2回答

5070閲覧

Pythonのif文省略について

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2018/09/01 04:05

2つの関数ってどう違うんですか

python

1def f(x=None): 2 if x: 3 return x 4 else: 5 pass 6 7def g(x=None): 8 if x is not None: 9 return x 10 else: 11 pass 12 13f(5) # 5 14g(5) # 5 15f() # None 16g() # None

dis.disで調べたら

dis.dis(f) """ 2 0 LOAD_FAST 0 (x) 2 POP_JUMP_IF_FALSE 8 3 4 LOAD_FAST 0 (x) 6 RETURN_VALUE 5 >> 8 LOAD_CONST 0 (None) 10 RETURN_VALUE """ dis.dis(g) """ 2 LOAD_CONST 0 (None) 4 COMPARE_OP 9 (is not) 6 POP_JUMP_IF_FALSE 12 3 8 LOAD_FAST 0 (x) 10 RETURN_VALUE 5 >> 12 LOAD_CONST 0 (None) 14 RETURN_VALUE """

って感じで違うじゃんみたいな

もし得られる結果が一般的に同じならLOAD等の処理が多い関数g()の方が明らかに冗長ですよね?

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

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

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

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

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

guest

回答2

0

ベストアンサー

NoneかどうかとFalseかどうかはまったく別の問題です。

参考:
4. 組み込み型 — Python 3.6.5 ドキュメント 4.1. 真理値判定

また、 本当は if x is not None と書いているつもりで、 if x と書いている場合は注意してください - たとえば、デフォルトの値がNoneになる変数や引数に、何かしら別の値が設定されているかどうかをテストする場合です。この「別の値」は、ブール型のコンテクストでは False と評価される(コンテナのような)型かもしれませんよ!

はじめに — pep8-ja 1.0 ドキュメント プログラミングに関する推奨事項

余談ですが、gは恒等関数にしてよさそうな気がします。

投稿2018/09/01 04:14

hayataka2049

総合スコア30935

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

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

退会済みユーザー

退会済みユーザー

2018/09/01 04:20

あくまでテキトーに書いた例文なのでそれはそうだと思いますw ただまあ、OSSとかみてて絶対に`None`と判定されないようなオブジェクトしかこない文のなかで、 `if x is not None`とか使ってたのが不思議だったので
hayataka2049

2018/09/01 04:23

その方がコードの意図が明確になり、可読性が上がります。 また、一般にis比較(オブジェクトのid(アドレス)に基づく比較)はかなり高速です。
退会済みユーザー

退会済みユーザー

2018/09/01 04:25

可読性は確かにこちらのほうがあるかもしれません。ありがとうございます。
hayataka2049

2018/09/01 04:25

timeitで実測してみました。型や中身によって多少の速度差はあると思いますが…… >>> import timeit >>> obj = "hoge" >>> timeit.timeit(lambda : bool(obj)) 0.6472279839981638 >>> timeit.timeit(lambda : obj is None) 0.3192401329979475 >>> timeit.timeit(lambda : obj is not None) 0.35001876699971035 真理値変換よりis比較の方が普通に速い
hayataka2049

2018/09/01 04:31

でもこれはbool関数の実装が遅いだけかもしれません ということで質問文のfとgで実測したところ、ほとんど差は認められませんでした。可読性で選んで良いと思います
guest

0

None以外にもFalseに判定される要素があるのです。

Python

1def f(x=None): 2 if x: 3 return x 4 else: 5 pass 6 7def g(x=None): 8 if x is not None: 9 return x 10 else: 11 pass 12 13f(0) # None 14g(0) # 0

0の他にも、空のシーケンスなどがあてはまります。もちろんFalse自体も。

投稿2018/09/01 04:07

編集2018/09/01 04:10
LouiS0616

総合スコア35668

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

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

退会済みユーザー

退会済みユーザー

2018/09/01 04:17 編集

なるほど 絶対的に0や空のリストなどが引数に来ない関数の場合は if x: something() の比較は安全だと言えますか?一般的に`is not None`が使われてるイメージがあります
LouiS0616

2018/09/01 04:23 編集

絶対に空のシーケンスや0が渡されないという仮定は案外難しいので、私なら避けます。 計測しないと断定はできませんが、速度的にも劇的に優位とは思えないですし。
退会済みユーザー

退会済みユーザー

2018/09/01 04:24

なるほど確かにそうかも知れません。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.40%

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

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

質問する

関連した質問