2016-12-20 9 views
0

ブール関数のデフォルト値をFalseに設定し、コード間の特定の入力値に対してのみTrueに変更したいとします。それを行う方法はありますか?Pythonでブール関数の値を変更する

私は単純なDFS検索コードを作成しようとしています。 私が使用しているコードはこれです:

def visited(v): 
    return False 
def explore(v): 
    visited(v) = True 
    for (v,w) in E: 
     if not visited(w): 
      explore(w) 
+1

visited(v)= True'を実行するとわからない –

答えて

1

機能はおそらく間違ったツールです。代わりに、セットしてみてください:

def explore(v, visited=set()): 
    visited.add(v) 
    for (v,w) in E: 
     if w not in visited: 
      explore(w) 

が便利なので、私はこの例のコードをPythonでa sometimes unintuitive behavior of default argumentsを使用していますが、しかし、あなたはまた、このような初期化ラッパー関数として共有セットを、維持するための別の方法を使用することができますブランクに設定し、再帰ヘルパー関数を呼び出します。 (それはあなたが毎回セットをリセットすることにより、複数回探索しましょうでしょう。)

+0

関連:https://pythonconquerstheuniverse.wordpress.com/category/python-gotchas/ – Shadow

+1

@shadow yeah、私はすでに取り組んでいましたそれに言及するための編集:) – Amber

+0

質問者がおそらくinexpertの場合は、変更可能なデフォルト値のような潜在的に混乱する動作を避けるほうがよいでしょう。 – poolie

0

いいえ、あなたは、関数の外から関数の戻り値を設定することはできません。代わりに、呼び出し関数で変数を使用します。

たとえば、ここでは、あなたが訪問したノードを覚えておきたいと思います。 setは、一連のオブジェクトを覚えておくのに適しています。

def explore(v): 
    visited.add(v) 
    for (v,w) in E: 
     if w not in visited: 
      explore(w) 

このことについて注意のカップル:

あなたはそれを2回呼び出した場合、既に訪問したような状態は、グローバルに追跡されているので、すべてが、見られます。それはあなたがすでに持っているものに似ていますが、あなたが望むものであってもなくてもよいでしょう。 、あなたをvwが何であるかの種類に応じて、また

def explore(v): 
    return explore_down(v, set()) 

def explore_down(v, visited): 
    visited.add(v) 
    for (v,w) in E: 
     if w not in visited: 
      explore(w) 

:あなたは二回反復することができるようにしたい場合は、パラメータとしてこれを伝承する必要があり、好ましくは再帰を開始し第2の機能を追加しますそれらがエラーである可能性がありますnot hashable, for which see this question.

0

をあなたはブール値を返すmyfunc機能を持っていると仮定すると、あなたが行動変更すること:

_myfunc = myfunc 

def myfunc(*args): 
    if some_condition: 
     _myfunc(*args) 
    else: 
     return False 

この道を、あなたは意志望む場合にのみ実際の機能を引き起こす。

このソリューションは元の名前を上書きしますが、これは義務ではありません。

関連する問題