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行で書き留めることができるからです。

4

2 に答える 2

6

forforループは、インデントがステートメントと同じレベルまたはそれより低いレベルに戻る行で終了します。

あなたの例では、それは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

そうしないでください。

于 2013-03-16T15:57:11.473 に答える
3

:ifが存在し、関数が。を返す場合、ループはgrid_values(grid).items()ORの終わりで終了します。d in digits and not assign(values, s, d)ddigitsassign(values, s, d)False

これは、returnステートメントが関数を停止するために発生します。そのため、関数が終了したため、ループ(関数内にある必要がありますreturns)は強制的に中断されます。

于 2013-03-16T15:57:14.603 に答える