2016-12-20 4 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

Я не уверен, что вы ожидали 'посетили (v) = true' делать –

ответ

1

Возможно, функция здесь неправильная. Вместо этого попробуйте набор:

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

Я использую a sometimes unintuitive behavior of default arguments в Python для этого примера кода, потому что это удобно, но вы также можете использовать другой способ поддержания общего набора, такие как функции-оболочки, который инициализирует пустой набор, а затем вызывает рекурсивную вспомогательную функцию. (Это позволит вам изучить несколько раз путем сброса набора каждый раз.)

+0

по теме: https://pythonconquerstheuniverse.wordpress.com/category/python-gotchas/ – Shadow

+1

@shadow да, я уже работал над редактирование, чтобы упомянуть об этом :) – Amber

+0

Если вопросник является неэкспертным, возможно, лучше избегать потенциально запутывающих поведений, таких как изменчивые значения по умолчанию. – poolie

0

Нет, вы не можете установить возвращаемое значение функции из-за пределов функции. Вместо этого используйте переменную в вызывающей функции.

Например, здесь вы хотите запомнить, какие узлы вы посетили. A set хорош для запоминания набора объектов.

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

Несколько предостережений об этом:

Если вы называете это дважды, все будет видно, как уже побывал, потому что состояние отслеживается в глобальном. Это похоже на то, что у вас уже есть, но может быть или не быть тем, что вы хотите. Если вы хотите, чтобы иметь возможность дважды повторять, что вам нужно, чтобы передать это вниз в качестве параметра, и предпочтительно добавить вторую функцию, которая запускает рекурсию:

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) 

Кроме того, в зависимости от того, какого типа v и w, Вы может получиться ошибка not hashable, for which see this question.

0

Предполагая, что у вас есть myfunc функция, возвращающая логическое значение, что вы хотите изменить поведение:

_myfunc = myfunc 

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

Таким образом, вы будете запускать фактическую функцию только в желаемых случаях.

Это решение заменяет исходное имя, но вы не обязаны это делать.

Смежные вопросы