内部ブロックで宣言した変数が外部ブロックに存在するかどうかをテストするにはどうすればよいですか?

python
内部ブロックで宣言した変数が外部ブロックに存在するかどうかをテストするにはどうすればよいですか?

このサンプルPythonコードを考えます:

for item in items:
    if somecondition(item):
        requireditem = item
        break

# use item

ループ後に `requireditem`にアクセスできるかどうかを知るにはどうすればよいですか? i.e. リスト内のいくつかの項目について「somecondition(item)」が「True」だった場合。

1つの解決策は次のとおりです。

requireditem = None

for item in items:
    if somecondition(item):
        requireditem = item
        break

if requireditem != None:
    # do something

しかし、私はこれを行うためのPythonの方法は何だろうと思っています。

  0  0


ベストアンサー

あなたはループで他に何かをしていますか? 「somevar」を「True」以外に設定していますか? そうでない場合、おそらくこれはより良いでしょう:

if any(somecondition(item) for item in items):
    # do something

変数は実際に必要ありません。

あなたの編集から:

これを行うより良い方法がまだあります:

required_items = [item for item in items if somecondition(item)]
if required_items:
    # do something
    # if only one required item is ever present, then maybe...
    required_item = required_items[0]

5


このようなものを試すことができます(しかし、あなたの質問は変数スコープに関連していましたか?)

somevar = [somecondition(item)の場合のアイテムのアイテムのアイテム]

if somevar:
    do something

1


参照しているものは「変数スコープ」と呼ばれます。

これは、新しいプログラマーによく説明されている素晴らしい記事です。 http://www.digital-web.com/articles/variable_scope_for_new_programmers/

0


ローカル変数が存在するかどうかをテストする方法があるかどうかを本当に知りたい場合は、 `UnboundLocalError`例外を処理することで確認できます。

try:
    somevar
except UnboundLocalError:
    print "Variable does not exist"
else:
    print "Variable exists"

しかし、これは確かに「pythonic」とは見なされません。 しないでください。 事前に変数を「なし」に設定するか、まったく異なるアプローチを使用してください。

1つの解決策は、Pythonの `for-else`コンストラクトを使用することです。

for item in items:
   if somecondition(item):
       break
else:
   raise NoSuitableItemFound()  # If no break occurred.

0


編集した質問には、次を使用できます

try:
    requireditem = next(item for item in items if somecondition(item))
except StopIteration:
    # error handling, no item found
else:
    # do something with requireditem

リスト内包表記を使用したソリューションとは対照的に、これは最初に一致するアイテムが見つかるまでのみ「アイテム」を走査します。

0


コードに最小限の変更を加えるには、ループ本体でやりたいことを何でも実行してから、ブレークアウトします。 とにかく最初の一致でブレークアウトする必要があります(リスト全体を常にスキャンし、_last_アイテムが条件を満たしている必要がない限り)。

for item in items:
    if somecondition(item):
        # do something with item
        break

ただし、実行したい内容に応じてこれを実行するためのより良い方法があります(他のユーザーがそのようなソリューションを投稿しています)。

0


タイトルとURLをコピーしました