Есть ли лучший способ написать этот код в python?
result = slow_function()
if result:
return result
[...]
Функция slow_function
может возвращать значение или None
, и она медленная, поэтому это невозможно:
if slow_function():
return slow_function()
Нет ничего плохого в первом способе, но использование временной переменной кажется излишним для python.
Этот код очень полезен, когда вы решаете проблему с использованием рекурсивных вызовов по f
и с локальным допущением, например, вы выбираете элемент из списка, а затем проверяете, есть ли приемлемое решение, иначе вам нужно выбрать Еще один. Что-то вроде:
def f(n):
for x in xrange(n):
result = slow_function(x):
if result:
return result
[...]
Не лучше ли было бы более идиоматично:
def f(n):
for x in xrange(n):
return slow_function(x) if is not None
Это может быть расширено для проверки любого значения. Это было бы легко читаемое выражение return if.
Дополнительный пример для любителей кода
Представьте, что у вас есть список списков чисел:
lists = [[1,2,3],[4,5],[6,7,8],[9,10],...]
и вы хотите выбрать один элемент для каждого списка, чтобы в выборе было не более одного четного числа. Там может быть много списков, поэтому попытка каждой комбинации была бы расточительной, так как вы уже можете сказать, что если вы начнете выбирать [1,2,4,...], то не может быть возможных решений.
def check(selected):
even_numbers = filter(lambda n: (n % 2) == 0, selected)
return len(even_numbers) < 2
def f(lists, selected=[]):
if not lists:
return selected
for n in lists[0]:
if check(selected + [n]):
result = f(lists[1:], selected + [n])
if result:
return result
Не лучше ли синтаксис:
def f(lists, selected=[]):
return selected if not lists
for n in lists[0]:
if check(selected + [n]):
return f(lists[1:], selected + [n]) if is not None
Самое лучшее, что я сделал до сих пор, это превратить функцию в генератор допустимых решений:
def f(lists, selected=[]):
if not lists:
yield selected
else:
for n in lists[0]:
if check(selected + [n]):
for solution in f(lists[1:], selected + [n]):
yield solution