このコードを Python で記述するより良い方法はありますか?
result = slow_function()
if result:
return result
[...]
関数slow_function
は値を返すことができます orNone
遅いので、これは実行できません:
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 つの項目を選択して、選択範囲に最大 1 つの偶数が含まれるようにします。多くのリストが存在する可能性があるため、[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