あなたはすでにこれを表現するためのよりよいまたはより近代的な方法を説明する答えを持っていますが、私はしたいと思いますより基本的な機能の点でラムダとマップが果たす役割を正確に示します。まず、ここにあなたの例があります:
inverted_list = map(lambda i: (int(numbers[2 + 3*i]),
float(numbers[3 + 3*i]),
float(numbers[4 + 3*i]))
,range(0, (len(numbers) - 2)/3))
少し明確にするために、私はマップする引数を分けます。これは同等です。
func = lambda i:(int(numbers[2 + 3*i]),
float(numbers[3 + 3*i]),
float(numbers[4 + 3*i]))
sequence = range(0, (len(numbers) - 2)/3)
inverted_list = map(func, sequence)
lambda
は、単に式の中の単純な機能を表現する方法である:私が変更されたすべてのは、別の文でマッピングするために、引数のそれぞれを計算することです。私たちは、効果を変更することなく、通常の関数でそれを置き換えることができます。
def func(i):
return (int(numbers[2 + 3*i]),
float(numbers[3 + 3*i]),
float(numbers[4 + 3*i]))
sequence = range(0, (len(numbers) - 2)/3)
inverted_list = map(func, sequence)
map
は「高階関数」、引数として別の関数を取る関数と呼ばれるものです。 sequence
の各項目によるmap
意志ループ、引数としてその項目にfunc
を呼び出して、どんな機能のリターンを取り、新しいリストに追加します。*
あなたは高階関数や発電機なしで同じことをやってみたかった場合ラムダの利点は、あなたが一つの式で特に一時変数を導入し、おそらくいくつかの方法であなたがしたいポイントの前に関数を宣言する必要が何かを表現することができるということです
def func(i):
return (int(numbers[2 + 3*i]),
float(numbers[3 + 3*i]),
float(numbers[4 + 3*i]))
sequence = range(0, (len(numbers) - 2)/3)
inverted_list = []
for item in sequence:
inverted_list.append(func(item))
:表現、あなたは長い道のりをこれを書くことができますそれを使用する。 mapのメリットは、同様に、一時変数とループを必要とするものを1つの式で記述できることです。
(*)mapはPython 3から実際にはリストではなくイテレータを返します。
これは、最初の2つの数字がシーケンスの一部ではないためです。私はそれがシリーズの第3要素から始まってループを効果的に実行していると思います。私はマップ/ラムダがここで他の操作を実行しているかどうか、それをちょうど混乱させました。 –