次のコードは悪い習慣ですか?
for i in some_values:
do_whatever(i)
do_more_things(i)
i
どういうわけか、変数はforループ内のブロックのスコープ内にとどまる必要があるように感じます。ただし、python 2.7では、ループ後に再利用できます。
Pythonはその機能を公式にサポートしていますか、それとも私は言語を悪用していますか?
次のコードは悪い習慣ですか?
for i in some_values:
do_whatever(i)
do_more_things(i)
i
どういうわけか、変数はforループ内のブロックのスコープ内にとどまる必要があるように感じます。ただし、python 2.7では、ループ後に再利用できます。
Pythonはその機能を公式にサポートしていますか、それとも私は言語を悪用していますか?
はい、それは公式です:
for_stmt ::= "for" target_list "in" expression_list ":" suite
["else" ":" suite]
> The target list is not deleted when the loop is finished
http://docs.python.org/reference/compound_stmts.html#for
後のターゲットリストfor
は単なる変数ではないことに注意してください。
for some_list[blah] in...
for some_object.foo in...
for a[:n] in ...:
など。これらのものは、ループの後で単純に消えることはできません。
CやJavaなどの言語を使用している場合、Pythonはスコーピングに関して少し特別な感じがすることがあります。前の答えが言うように、コードは絶対に有効ですが、私はそれに反対することをお勧めします。特に読みにくいコードが作成され、さらに、some_values
空であることが判明した場合は、コードの最後の行で例外が発生します。
したがって、あなたの質問に対する答えは-はい、それは公式にサポートされていますが、ほとんどの場合、それは推奨される戦略ではありません。
この手法を使用して、いくつかの基準に一致するアイテムのリストをスキャンできます。
for item in iter:
if interesting(item):
break
else:
raise ValueError('iter is boring.')
handle(item)
@petrが言ったように、それは不自然に聞こえます。それが自然であることが許されているからではなく、あなたがそれを使わなければならないからでもありません。
ユースケースのあるロジックには当てはまらないかもしれませんが、私はむしろこのようなものを持っていますbreak
:
for i in some_values:
do_whatever(i)
else:
do_more_things(i)
しかし、これは空であると評価されたNameError
場合でも上昇しますが、より明確に聞こえます。some_values
内部スコープの明確な読みやすさは得られませんが、インデントがそれを示唆している可能性があります。
しかし、他の人が言ったように、特定のOPの質問に答えるために、はい、それは合法です。
それは機能ではありません。あなたが書いたように、変数はスコープに残ります。これは通常のインタプリタの動作です。