0

私はラムダについて読んでいて(Pythonに飛び込みました)、サンプルコードを実行しましたが、テキストの状態とは異なる結果が得られました。それはexample 4.21

processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)

これは私のpy 2.7コンソール出力です:

>>> collapse = True
>>> processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
>>> processFunc("this   is\na\ttest")
'this is a test'
>>> collapse = False
>>> processFunc("this   is\na\ttest")
'this is a test'

ご覧のとおり、collapse値に関係なく最初のラムダ式が返されます。私の考えや Python のバージョンが変更されたのは何か問題があるのでしょうか、それともこの伝説的な本が述べているものとは異なる結果が得られたのはなぜでしょうか?

4

1 に答える 1

6

processFunc 再度設定する必要があります。

設定するたびに式が再評価されるわけではありませんcollapse一度だけ計算されます。実行は、他のラムダを指すcollapse = Falseように魔法のように変更されませんでした。processFunc

processFunc =式をもう一度実行するだけです。

>>> collapse = True
>>> processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
>>> processFunc("this   is\na\ttest")
'this is a test'
>>> collapse = False
>>> processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
>>> processFunc("this   is\na\ttest")
'this   is\na\ttest'

再評価されることが予想processFuncされる場合は、それ自体を関数またはラムダにする必要があります。

>>> collapse = True
>>> processFunc = lambda: collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
>>> processFunc()("this is\na\ttest")
'this is a test'
>>> collapse = False
>>> processFunc()("this is\na\ttest")
'this is\na\ttest'

ただし、ラムダオブジェクトを返すために呼び出す 必要があることに注意してください。これを引数で呼び出します。式processFunc()を呼び出すと再評価され、名前が周囲のスコープで (この場合はグローバルとして) 検索され、ラムダの 1 つが返されます。processFunccollapse

于 2013-07-01T21:05:01.370 に答える