ホームページ  >  記事  >  バックエンド開発  >  Lambda 関数、Python の王様

Lambda 関数、Python の王様

PHPz
PHPz転載
2023-04-14 23:22:011406ブラウズ

Lambda 関数、Python の王様

Lambda 関数の概要

Lambda 関数は、匿名 (名前なし) 関数としても知られており、パラメーターの数と、次を使用して実行される条件または操作を直接受け取ります。パラメータ。パラメータはコロンで区切られ、最終結果が返されます。大規模なコード ベースでコードを記述しながら小さなタスクを実行する場合、または関数内で小さなタスクを実行する場合、通常のプロセスではラムダ関数が使用されます。

lambda argument_list:expersion

argument_list はパラメータ リストであり、その構造は Python の関数のパラメータ リストと同じです

a,b
a=1,b=2
*args
**kwargs
a,b=1,*args
空
....

expression はパラメータに関する式であり、式に表示されるパラメータが必要です式は 1 行のみです。

1
None
a+b
sum(a)
1 if a >10 else 0
[i for i in range(10)]
...

通常の関数と Lambda 関数の違い

  • 名前なし Lambda 関数には名前がありませんが、通常のオペレーションには適切な名前が付いています。
  • Lambda 関数には戻り値がありません。def キーワードを使用して構築された通常の関数は値またはシーケンス データ型を返しますが、Lambda 関数では完全なプロセスが返されます。以下のコード スニペットのようなラムダ関数構文を使用して、数値が偶数か奇数かを確認したいとします。
b = lambda x: "Even" if x%2==0 else "Odd"
b(9)
  • 関数は 1 行で記述および作成されます。通常の関数ではインデントが使用されますが、Lambda 関数は 1 行で記述および作成されます。
  • 未使用コードの再利用のため Lambda 関数はコードを再利用できない、またはこの関数を他のファイルにインポートすることはできません。対照的に、通常の関数はコードの再利用に使用され、外部ファイルで使用できます。

なぜ Lambda 関数を使用するのか?

通常、Lambda 関数は使用しませんが、高階関数で使用します。高階関数は、タスクを完了するために複数の関数を必要とする関数です。または、関数が他の関数を返す場合、オプションで Lambda 関数を使用できます。

高階関数とは何ですか?

例を通して高階関数を理解しましょう。整数のリストがあり、3 つの出力を返す必要があるとします。

  • リスト内のすべての偶数の合計
  • リスト内のすべての奇数の合計
  • 3で割り切れるすべての数値の合計

まず、この問題を処理するために通常の関数が使用されると仮定します。この場合、個々のタスクを格納するために 3 つの異なる変数が宣言され、for ループを使用して結果の 3 つの変数が処理されて返されます。この方法は正常に動作します。

次に、Lambda 関数を使用してこの問題を解決します。次に、3 つの異なる Lambda 関数を使用して、テスト対象の数値が偶数か奇数か、または 3 で割り切れるかどうかを確認し、結果に数値を加算します。 . .

def return_sum(func, lst):
 result = 0
 for i in lst:
 #if val satisfies func
 if func(i):
 result = result + i
 return result
lst = [11,14,21,56,78,45,29,28]
x = lambda a: a%2 == 0
y = lambda a: a%2 != 0
z = lambda a: a%3 == 0
print(return_sum(x, lst))
print(return_sum(y, lst))
print(return_sum(z, lst))

ここでは、Lambda 関数が通常の関数の一部として渡される高階関数が作成されます。実際、このタイプのコードはインターネット上のあらゆる場所で見つかります。ただし、多くの人は Python を使用するときにこの関数を無視したり、たまにしか使用しませんが、実際にはこれらの関数は非常に便利で、より多くのコード行を節約できます。次に、これらの高階関数を見てみましょう。

Python 組み込み高階関数

マップ関数

map() は、指定された関数に従って、指定されたシーケンスをマップします。

Map 関数は 2 つのパラメータを受け取る関数です。最初のパラメーター関数は、パラメーター シーケンス内の各要素を使用して function 関数を呼び出します。2 番目のパラメーターは、任意の反復可能なシーケンス データ型です。各関数によって返された値を含む新しいリストを返します。

map(function, iterable, ...)

Map 関数は、反復子オブジェクトで特定の種類の操作を定義します。配列要素を二乗したいとします。つまり、ある配列の各要素の二乗を、目的の結果を生成する別の配列にマッピングするとします。

arr = [2,4,6,8]
arr = list(map(lambda x: x*x, arr))
print(arr)

Map 関数はさまざまな方法で使用できます。名前、住所などの詳細を含む辞書のリストがあり、目的はすべての名前を含む新しいリストを生成することであるとします。

students = [
 {"name": "John Doe",
"father name": "Robert Doe",
"Address": "123 Hall street"
},
 {
 "name": "Rahul Garg",
 "father name": "Kamal Garg",
 "Address": "3-Upper-Street corner"
 },
 {
 "name": "Angela Steven",
"father name": "Jabob steven",
"Address": "Unknown"
 }
]
print(list(map(lambda student: student['name'], students)))
>>> ['John Doe', 'Rahul Garg', 'Angela Steven']

上記の操作は通常、データベースからのデータの取得やネットワーク クローリングなどのシナリオで発生します。

フィルター関数

フィルター関数は、指定された特定の条件に基づいてデータをフィルターで除外します。つまり、関数にフィルター条件を設定し、要素を反復処理し、戻り値が True の要素を保持します。マップ関数は各要素に対して動作しますが、フィルター関数は特定の要件を満たす要素のみを出力します。

果物の名前のリストがあり、タスクは文字「g」を含む名前のみを出力することであるとします。

fruits = ['mango', 'apple', 'orange', 'cherry', 'grapes']
print(list(filter(lambda fruit: 'g' in fruit, fruits)))

filter(function or None, iterable) --> filter object

関数または項目が true である反復可能な項目のイテレータを返します。関数が None の場合、true を返します。

Reduce 関数

この関数は非常に特殊で、Python の組み込み関数ではないため、functools import reduce を通じてインポートする必要があります。 Reduce は、指定された関数を適用して要素を削減することにより、シーケンス データ構造から単一の出力値を返します。

reduce(function, sequence[, initial]) -> value

2 引数関数をシーケンスの項目に左から右に累積的に適用し、シーケンスを 1 つの値に減らします。

initial が存在する場合、シーケンス内の項目の前に配置され、シーケンスが空の場合のデフォルト値として機能します。

假设有一个整数列表,并求得所有元素的总和。且使用reduce函数而不是使用for循环来处理此问题。

from functools import reduce
lst = [2,4,6,8,10]
print(reduce(lambda x, y: x+y, lst))
>>> 30

还可以使用 reduce 函数而不是for循环从列表中找到最大或最小的元素。

lst = [2,4,6,8]
# 找到最大元素
print(reduce(lambda x, y: x if x>y else y, lst))
# 找到最小元素
print(reduce(lambda x, y: x if x<y else y, lst))

高阶函数的替代方法

列表推导式

其实列表推导式只是一个for循环,用于添加新列表中的每一项,以从现有索引或一组元素创建一个新列表。之前使用map、filter和reduce完成的工作也可以使用列表推导式完成。然而,相比于使用Map和filter函数,很多人更喜欢使用列表推导式,也许是因为它更容易应用和记忆。

同样使用列表推导式将数组中每个元素进行平方运算,水果的例子也可以使用列表推导式来解决。

arr = [2,4,6,8]
arr = [i**2 for i in arr]
print(arr)
fruit_result = [fruit for fruit in fruits if 'g' in fruit]
print(fruit_result)

字典推导式

与列表推导式一样,使用字典推导式从现有的字典创建一个新字典。还可以从列表创建字典。

假设有一个整数列表,需要创建一个字典,其中键是列表中的每个元素,值是列表中的每个元素的平方。

lst = [2,4,6,8]
D1 = {item:item**2 for item in lst}
print(D1)
>>> {2: 4, 4: 16, 6: 36, 8: 64}
# 创建一个只包含奇数元素的字典
arr = [1,2,3,4,5,6,7,8]
D2 = {item: item**2 for item in arr if item %2 != 0}
print(D2)
>>> {1: 1, 3: 9, 5: 25, 7: 49}

一个简单应用

如何快速找到多个字典的公共键

方法一

dl = [d1, d2, d3] # d1, d2, d3为字典,目标找到所有字典的公共键
[k for k in dl[0] if all(map(lambda d: k in d, dl[1:]))]

dl = [{1:'life', 2: 'is'},
{1:'short', 3: 'i'},
 {1: 'use', 4: 'python'}]
[k for k in dl[0] if all(map(lambda d: k in d, dl[1:]))]
# 1

解析

# 列表表达式遍历dl中第一个字典中的键
[k for k in dl[0]]
# [1, 2]
# lambda 匿名函数判断字典中的键,即k值是否在其余字典中
list(map(lambda d: 1 in d, dl[1:]))
# [True, True]
list(map(lambda d: 2 in d, dl[1:]))
#[False, False]
# 列表表达式条件为上述结果([True, True])全为True,则输出对应的k值
#1

方法二

# 利用集合(set)的交集操作
from functools import reduce
# reduce(lambda a, b: a*b, range(1,11)) # 10!
reduce(lambda a, b: a & b, map(dict.keys, dl))

写在最后

目前已经学习了Lambda函数是什么,以及Lambda函数的一些使用方法。随后又一起学习了Python中的高阶函数,以及如何在高阶函数中使用lambda函数。

除此之外,还学习了高阶函数的替代方法:在列表推导式和字典推导式中执行之前操作。虽然这些方法看似简单,或者说你之前已经见到过这类方法,但你很可能很少使用它们。你可以尝试在其他更加复杂的函数中使用它们,以便使代码更加简洁。

以上がLambda 関数、Python の王様の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。