2013-09-23 16 views

答えて

28

んPythonはそれのために素晴らしく、短い閉鎖/ラムダ構文を持っていますか?

はい、この場合は必要ありません。

そのRubyコードに最も近いと同等です:

すでに機能が printのように、周りに横たわっていたときにはかなり良さそうに見えます
new_values = map(print, [1, 2, 3]) 

。あなただけのいくつかの任意の式を持っていて、mapでそれを使用したいときは、このように、defまたはlambdaとそれから関数を作成する必要があります:あなたは明らかに避けたい醜さだ

new_values = map(lambda x: print(x), [1, 2, 3]) 

。そして、Pythonはそれを避けるために良い方法があります:内包表記を:

new_values = [print(x) for x in values] 

ただし、この場合には、あなただけの、各値のためにいくつかのステートメントを実行し、各値の新しい値を蓄積しないようにしようとしています。したがって、これが機能します(Noneの値のリストが返されます)が、間違いなく慣用ではありません。

for x in values: 
    print x 
+0

私の答えではない質問に記載されているラムダの問題に実際に対処して以来、これはおそらく最も優れた、最も完全な答えです。 +1 – Shashank

+1

ありがとうございます。あなたは私が不思議に思っていたすべての点に当たった。 – BuddyJoe

+0

私の具体的な例は、Python 3.x(または2.6-2.7、 'from __future__ import print_function'を実行した場合)でのみ機能します。おそらく、 'sys.stdout.write'や何かを、' print'の代わりに 'puts'の大まかな同等物として使って、これを避けるべきだったのでしょう...しかし、あなたがすべてを理解していれば十分です。 – abarnert

12

最も慣用:

for x in [1,2,3]: 
    print x 
2

あなたは、配列の上にベクトル化演算にnumpyの使用することができます。この場合

は、行うには正しいことは、それを明示的-noが閉鎖、無機能、ノー内包、単にループを記述しないことです。

>>> import numpy as np 
>>> a = np.array([1, 2, 3]) 
>>> a * 3 
array([3, 6, 9]) 

簡単アレイの各要素の上に使用することができるラムダを定義することができる:

>>> array_lambda=np.vectorize(lambda x: x * x) 
>>> array_lambda([1, 2, 3]) 
array([1, 4, 9]) 

しかし、他の人が言っているように、それぞれを印刷したい場合は、ループを使用します。

0

オブジェクトをラップして、通常の関数プログラミングのすべてを公開するライブラリもあります。

例えばpydashあなたはこのようなことを行うことができます:

>>> from pydash import py_ 
>>> from __future__ import print_function 
>>> x = py_([1,2,3,4]).map(lambda x: x*2).each(print).value() 
2 
4 
6 
8 
>>> x 
[2, 4, 6, 8] 

(ただ、常に「トリガー」の実行および/または終わりに.value()でラップ値をラップ解除することを忘れないでください!)

+0

私が個人的にこのようなコードを書くのは、左から右に読むことです。データ/値の流れを追跡する方が簡単です。 –