このコード例を入手した場合:
for s,d in grid_values(grid).items():
if d in digits and not assign(values, s, d):
return False ## (Fail if we can't assign d to square s.)
return values
forがどこで終わるかをどうやって知ることができますか?私の知る限り、これをすべて1行で書き留めることができるからです。
このコード例を入手した場合:
for s,d in grid_values(grid).items():
if d in digits and not assign(values, s, d):
return False ## (Fail if we can't assign d to square s.)
return values
forがどこで終わるかをどうやって知ることができますか?私の知る限り、これをすべて1行で書き留めることができるからです。
for
forループは、インデントがステートメントと同じレベルまたはそれより低いレベルに戻る行で終了します。
あなたの例では、それはreturn values
ステートメントにあります。
if
ステートメントがTrueになり、return False
ステートメントが実行されると、ループも終了します。関数はその時点で「early」を返し、ループの残りの部分は無視されます。
記述されているように、1行に複数の複合ステートメント(インデントされたコードブロックをとるステートメント)を組み合わせることができないため、コードを1行に減らすことはできません。any()
ステートメントを置き換えるジェネレータ式を使用した関数呼び出しを使用して、これを2行に減らすことができますが、for
読みやすさが向上するとは思いません。
if any(not assign(values, s, d) for s, d in grid_values(grid).items() if d in digits):
return False
return values
次に、条件式を使用してこれらすべてを1行に詰め込み、読みやすさをさらに損なう可能性があります。
return False if any(not assign(values, s, d) for s, d in grid_values(grid).items() if d in digits) else values
そうしないでください。
:ifが存在し、関数が。を返す場合、ループはgrid_values(grid).items()
ORの終わりで終了します。d in digits and not assign(values, s, d)
d
digits
assign(values, s, d)
False
これは、return
ステートメントが関数を停止するために発生します。そのため、関数が終了したため、ループ(関数内にある必要がありますreturns
)は強制的に中断されます。