[解決済み] Pythonで'try'と'if'を使い分ける
質問
のいずれかを決定する根拠はあるのでしょうか?
try
または
if
という構文は、変数が値を持つかどうかをテストするときに使用するのでしょうか?
例えば、リストを返すか、値を返さない関数があるとします。処理する前に結果をチェックしたいのですが、どうすればよいでしょうか?次のうち、どちらがより好ましいでしょうか?
result = function();
if (result):
for r in result:
#process items
または
result = function();
try:
for r in result:
# Process items
except TypeError:
pass;
関連する議論
どのように解決するのですか?
よく、Pythonは EAFP スタイル ("it's easier to ask for forgiveness than permission") を採用しました。 LBYL スタイル("look before you leap")です。私にとっては、効率と読みやすさの問題なのです。
あなたの例では (リストや空文字列を返す代わりに、関数がリストや空文字列を返すとします)
None
を想定した場合、99%の確率で
result
が実際に反復可能な何かを含むのであれば、私なら
try/except
のアプローチです。例外が本当に例外的であれば、その方が速いでしょう。もし
result
は
None
を使用すると、50%以上の確率で
if
の方がいいかもしれません。
これを裏付けるために、少し計測してみます。
>>> import timeit
>>> timeit.timeit(setup="a=1;b=1", stmt="a/b") # no error checking
0.06379691968322732
>>> timeit.timeit(setup="a=1;b=1", stmt="try:\n a/b\nexcept ZeroDivisionError:\n pass")
0.0829463709378615
>>> timeit.timeit(setup="a=1;b=0", stmt="try:\n a/b\nexcept ZeroDivisionError:\n pass")
0.5070195056614466
>>> timeit.timeit(setup="a=1;b=1", stmt="if b!=0:\n a/b")
0.11940114974277094
>>> timeit.timeit(setup="a=1;b=0", stmt="if b!=0:\n a/b")
0.051202772912802175
つまり
if
ステートメント
常に
を設定するのはほぼ無料です。
try/except
ブロックがあります。 しかし
Exception
実際に発生すると、そのコストははるかに高くなります。
モラルです。
-
を使うのは全く問題ありません("pythonic")。
try/except
をフロー制御のために使用します。 -
が、最も理にかなっているのは
Exception
は、実際には例外的なものです。
Pythonのドキュメントから。
EAFP
許しを乞うのは簡単だ。 許可することです。この一般的なPythonのコーディングは は、有効な キーまたは属性で 例外は、その仮定が証明された場合 を使用します。このクリーンで高速なスタイルは を多用することが特徴です。
try
とexcept
ステートメントを使用します。この とは対照的な手法です。 LBYL 他の多くの言語で一般的なスタイル C言語など
関連
-
[解決済み】 NameError: グローバル名 'xrange' は Python 3 で定義されていません。
-
[解決済み] 関数内でグローバル変数を使用する
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで辞書に新しいキーを追加するにはどうすればよいですか?
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] Pythonで例外を手動で発生(スロー)させる
-
[解決済み] モジュールの関数名(文字列)を使って、モジュールの関数を呼び出す。
-
[解決済み】forループを使った辞書の反復処理
-
[解決済み】Pythonに三項条件演算子はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
python implement mysql add delete check change サンプルコード
-
Pythonコードの可読性を向上させるツール「pycodestyle」の使い方を詳しく解説します
-
パッケージングツールPyinstallerの使用と落とし穴の回避
-
[解決済み】お使いのCPUは、このTensorFlowバイナリが使用するようにコンパイルされていない命令をサポートしています。AVX AVX2
-
[解決済み】numpyの配列連結。"ValueError:すべての入力配列は同じ次元数でなければならない"
-
[解決済み】pygame.error: ビデオシステムが初期化されていない
-
[解決済み】「SyntaxError.Syntax」は何ですか?Missing parentheses in call to 'print'」はPythonでどういう意味ですか?
-
[解決済み】Flaskのテンプレートが見つからない【重複あり
-
[解決済み] 環境変数の値にアクセスする方法
-
[解決済み] 与えられたキーがすでに辞書に存在するかどうかをチェックする