2016-07-22 4 views
3

私は最近、Python 3.5.1の学習を開始しました。現在、lambdaという表現を試しています。私は以下の簡単な方法を設定しようとしました。なぜこのラムダ式を返すと文字列になりますか?

def sum_double(a, b): 
    return lambda a, b: a+b if a != b else (a+b)*2, a, b 

行うことになっているすべてはabに等しい場合abの合計を返し、2倍の和であるが、代わりに私は、このような出力が得られます。

コード:

print(sum_double(1, 2)) 
print(sum_double(2, 3)) 
print(sum_double(2, 2)) 

出力:

(<function sum_double.<locals>.<lambda> at 0x000001532DC0FA60>, 1, 2) 
(<function sum_double.<locals>.<lambda> at 0x000001532DC0FA60>, 2, 3) 
(<function sum_double.<locals>.<lambda> at 0x000001532DC0FA60>, 2, 2) 

私はこの間違っているのでしょうか?なぜこれが起こっているのですが、それが可能であれば、ラムダ式を使って私の望む機能を達成するにはどうしたらいいですか?

+0

あなたがここにラムダを使用しているのはなぜ?ラムダは関数なので、関数から関数を返すことになります。 –

+1

@MorganThrappそれは[すべての機能を停止しました](https://en.wikipedia.org/wiki/Turtles_all_the_way_down)です! –

+0

@MorganThrappラムダでできることを見て、ラムダとその行動を完全に理解することができます。 – pianoisland

答えて

2

さて、あなたはlambda関数を呼び出していないと、このような戻り値として定義されlambda機能のタプルとabの値があります。

それに引数を供給しながら返す前にラムダを呼び出すように変更:

return (lambda a, b: a+b if a != b else (a+b)*2)(a, b) 

そして、それだけで正常に動作します:

print(sum_double(1, 2)) 
3 

print(sum_double(2, 2)) 
8 
+1

ありがとう、これは働いた!時間制限が切れると、私はあなたの答えを受け入れます。 – pianoisland

+1

今後の参考として、ラムダ式の使用方法は** **ではありません。この特定のケースでは、2つの冗長な関数呼び出しで機能をラップしています。ラムダを完全に省略するか、ラムダ関数を直接変数 'sum_double 'に代入してください。 – mhoff

+1

@MichaelHoffは全く同意します。 OPはラムダを実験していた状態だったので、私はその使用に反対したことは一度もありませんでした。実験している間は、あなたは一般に自由自在なものを試すことができます。 –

2
sum_double = lambda a, b: a+b if a != b else (a+b)*2 

lambda自体が機能を定義する。 defは必須ではありません。

戻り値関数abからなるタプルが印刷されます。

関連する問題