精巧なラムダ関数のPythonの使用法、お勧めのコレクション
つまり、私たちは多くの場合、無名関数と言う、そこのPythonの関数の2種類、1つのDEF定義されている機能があり、もう一方はラムダ関数です。今日、私はそれを表現と呼ばれて、Pythonプログラミングの全員とラムダ関数に話をします。
1.なぜラムダ関数を使うのか?
最初の例を与える:各要素のリストが乗。
次のように最初のDEF定義された関数コードであります
def sq(x):
return x*x
map(sq,[y for y in range(10)])
ラムダ関数と、コードを書くための
map(lambda x: x*x,[y for y in range(10)])
この単純な例から、我々はラムダ関数に続いて、第一の冗長コードを削減ラムダ関数を、関数の名前に名前を付けるために気にしない、ということを確認でき、すばやく機能、最終的には、ラムダ関数を実装することができますコードを読みやすく、プログラムはより簡潔になります。
上記のこの単純な例からは、ラムダの構文を見ることができる唯一の機能であり、次の形式:
lambda argument_list:expersion
Argument_list構文パラメータリスト、Pythonでその構造及び機能(関数)は、例えば、パラメータの同じリストであります
a,b
a=1,b=2
*args
**kwargs
a,b=1,*args
空
....
シンタックス式は、ニーズを新興のパラメータ式はargument_listで定義されているパラメータに関する式であり、式は、単一の行することができます。たとえば、次の有効な式の一部
1
None
a+b
sum(a)
1 if a >10 else 0
......
上記のラムダ関数の利点に加えて、私はいくつかの記事は、効率を改善しますラムダ関数と言う参照してください、それは何ではないでしょうか?私たちは、検証するためにコードを書きます
import time
# 测试的Def函数
def square1(n):
return n ** 2
# 测试的Lambda函数
square2 = lambda n: n ** 2
print(time.time())
# 使用Def函数
i = 0
while i < 1000000000:
square1(100)
i += 1
print(time.time())
# 使用lambda函数
i = 0
while i < 1000000000:
square2(100)
i += 1
print(time.time())
1413272496.27
1413272703.05 (Def 函数:207s)
1413272904.49 (Lambda函数:201s)
上記から分かるように、時間が影響を受けていない2つの同様の効率のために必要。
2.lambad機能上の使用法はまた、匿名関数の利点について話しました、そして、それは最終的にそれが何に使用されていますか?
(1)直接変数に割り当てられ、その後、通常のように、その関数を呼び出します
c=lambda x,y,z:x*y*z
c(2,3,4)
24
もちろん、引数は関数の後に直接渡すことが可能
(lambda x:x**2)(3)
9
(2)以下に例示するいくつかの例Pythonのマップ、フィルタ、ソート、組み込み関数などの使用を減らす、に関連して他の関数に渡されるラムダパラメータの関数として。
fliter(lambda x:x%3==0,[1,2,3,4,5,6])
[3,6]
squares = map(lambda x:x**2,range(5)
print(lsit(squares))
[0,1,4,9,16]
タプルからなるリストを作成します。そのように機能し、の組み合わせを使用してソート:
a=[('b',3),('a',2),('d',4),('c',1)]
最初の要素はソート
sorted(a,key=lambda x:x[0])
[('a',2),('b',3),('c',1),('d',4)]
第二の選別素子によれば
sorted(a,key=lambda x:x[1])
[('c',1),('a',2),('b',3),('d',4)]
減らす機能と組み合わせて使用します
from functools import reduce
print(reduce(lambda a,b:'{},{}'.format(a,b),[1,2,3,4,5,6,7,8,9]))
1,2,3,4,5,6,7,8,9
(3)通常の関数ラムダにネストされた関数を入れ子になった、機能自体の戻り値として、ラムダ、
def increment(n):
return lambda x:x+n
f=increment(4)
f(2)
6
(4)米国列は、デフォルト値を有し、またX =(ラムダ...)形式を使用することができます
x=(lambda x='Boo',y='Too',z='Z00':x+y+z)
print(x('Foo'))
'FooTooZoo'
(5)Tkinterではインラインコールバック関数を定義
import sys
from tkinter import Button,mainloop
x=Button(text='Press me',command=(lambda :sys.stdout.write('Hello,World\n')))
x.pack()
x.mainloop()
このコードは非常に興味深いものだった、少し友人がカザフスタンについての実行をコピー&ペーストすることができます願っています。(6)決定文字列は、文字で始まるかどうか
Names = ['Anne', 'Amy', 'Bob', 'David', 'Carrie', 'Barbara', 'Zach']
B_Name= filter(lambda x: x.startswith('B'),Names)
print(B_Name)
['Bob', 'Barbara']
(7)リストの二つの要素の和
a = [1,2,3,4]
b = [5,6,7,8]
print(list(map(lambda x,y:x+y, a,b)))
[6,8,10,12]
各単語列リクエストの長さ(8)
sentence = "Welcome To Beijing!"
words = sentence.split()
lengths = map(lambda x:len(x),words)
print(list(lengths))
[7,2,8]
概要
ラムダ関数についてlambad機能の使用は、Pythonのコードを作ることにPythonより、よりコンパクトでパーティーをサポートするために、Pythonコミュニティで議論されている。反対は考えているPythonのラムダ関数の制限の多くは、ときにのみによってそれの最悪の部分式を構成しますが、プログラムは後でよりであまり明確に見えるのです。