Pythonプログラミング入門(014) - PythonのLambda関数(無名関数)
目次
1. 無名関数の定義
Lambda 関数は、関数型プログラミングの中核となる概念の 1 つです。Python では、ラムダ関数を簡単に定義できます。匿名関数は、関数を定義せずに、1 行のコードで効率的な関数を実装できます。匿名関数は式の中で直接使用できるため、非常に便利です。匿名関数の構文形式は次のとおりです。
lambda [arguments] : expression
例証します:
(1) 引数: 仮パラメータのリスト、コンマで区切られた複数の仮パラメータ、またはパラメータなし。
仮パラメータ リストの形式は次のとおりです。
a, b
a=1, b=2
*args
**kwargs
a, b=1, *args
(2) 式: 関数の戻り値の式。式は 1 つだけです。
式は次の形式になります。
6
a + b
sum(b)
6 if a >10 else 7
(3) lambda の戻り値は関数オブジェクトである関数のアドレスです。
例えば:
fadd = lambda x,y:x+y
print(fadd)
print(fadd(3,2))
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
<function <lambda> at 0x00000266BFC99EE0>
5
2. 無名関数の特徴
(1) Lambda関数は匿名です
いわゆる匿名関数は、平たく言えば、名前のない関数です。
(2) Lambda関数には入力と出力があります
入力はパラメータ リスト [arguments] に渡される値で、出力は式expressionに基づいて計算された値です。
(3) Lambda 関数は独自の名前空間を持っています
独自のパラメータ リスト外またはグローバル名前空間内のパラメータにアクセスすることはできず、非常に単純な関数のみを実行できます。
一般的な Lambda 関数の例:
lambda x, y: x+y # 函数的输入为x和y,输出是它们的和:x+y
lambda *args: sum(args) # 输入是任意个数参数,输出是它们的和
lambda **kwargs: 6 # 输入是任意键值对参数,输出是6
3. 匿名関数の一般的な使用法
1.名前を付けて電話する
単純な関数が必要なだけの場合は、ラムダが適切な選択であり、関数を定義する簡単な方法と考えることができます。名前を付けて、通常の関数のように使用できます。呼び出しの形式は次のとおりです。
fun_name = lambda arguments : expression
fun_name(arguments)
例えば:
fun_perimeter = lambda r:3.14 * r * 2
fun_area = lambda r:3.14 * r ** 2
print("圆的周长:",fun_perimeter(5))
print("圆的面积:",fun_area(5))
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
圆的周长: 31.400000000000002
圆的面积: 78.5
2. 直接電話する
lambda 関数を直接呼び出すための構文形式は次のとおりです。
(lambda arguments : expression)(arguments)
例えば:
print("圆的周长:",(lambda r:3.14 * r * 2)(5))
print("圆的面积:",(lambda r:3.14 * r ** 2)(5))
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
圆的周长: 31.400000000000002
圆的面积: 78.5
3. Lambda 関数をパラメータとして他の関数に渡します (通常はキーパラメータが与えられます)
(1) max()関数
max() 関数は、指定されたパラメータの最大値を返します。これはシーケンスでも構いません。max() 関数の構文形式は次のとおりです。
max( x, y, z, .... )
说明:返回给定参数的最大值
例: Lambda 関数は、タプルのどの値がソートされるかを決定します。
num = [(100, 2.5), (150, 0.2), (80, 3.4), (120, 1.8)]
y = max(num, key=lambda x: x[0]) # 按元组的第1个值排序取最大值
print(y)
y = max(num, key=lambda x: x[1]) # 按元组的第2个值排序取最大值
print(y)
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
(150, 0.2)
(80, 3.4)
(2)sorted()関数
sorted() 関数は、すべての反復可能なオブジェクトを並べ替えます。sorted() 関数の構文形式は次のとおりです。
sorted(iterable, key=None, reverse=False)
参数说明:
(1)iterable:可迭代对象。
(2)key:指定用来进行比较的元素,指定可迭代对象中的一个元素进行排序。
(3)reverse:排序规则,reverse = True 降序, reverse = False 升序(默认)。
(4)返回值:返回重新排序的列表。
ソートとソートの違い:
(1) sort はリストに適用されるメソッドであり、sorted はすべての反復可能なオブジェクトに対して並べ替え操作を実行できます。
(2) list の sort メソッドは既存のリストに対して動作します。ソートされた関数は、元のリストに基づく操作ではなく、新しいリストを返します。
例 1: リストの操作
num = [2,3,22,102,-87,11,-23]
print(sorted(num)) # 升序排列
print(sorted(num,key=lambda x :abs(x))) # 按绝对值升序排列,参数x接收的是列表的元素
stu = ["Jerry","Mark","tom","Black","zhangping","Liugang","WANGLIN"]
print(sorted(stu)) # 对名字排序(区分大小写)
print(sorted(stu,key=str.lower)) # 对名字排序(转换为小写后排序,即:不区分大小写)
print(sorted(stu,key=lambda x:x.lower())) # 作用同上
print(sorted(stu,key=lambda x:len(x))) # 按字符串的长度排序
# 参数x接收的是列表的元素,参数x接收的是列表的元素,参数x接收的是列表的元素
lang = [(11,"java"),(101,"go"),(201,"c"),(17,"vb"),(21,"c++")]
print(sorted(lang,key=lambda x:x[0])) # 按列表中的元组的第一列排序
print(sorted(lang,key=lambda x:x[1])) # 按列表中的元组的第二列排序
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
[-87, -23, 2, 3, 11, 22, 102]
[2, 3, 11, 22, -23, -87, 102]
['Black', 'Jerry', 'Liugang', 'Mark', 'WANGLIN', 'tom', 'zhangping']
['Black', 'Jerry', 'Liugang', 'Mark', 'tom', 'WANGLIN', 'zhangping']
['Black', 'Jerry', 'Liugang', 'Mark', 'tom', 'WANGLIN', 'zhangping']
['tom', 'Mark', 'Jerry', 'Black', 'Liugang', 'WANGLIN', 'zhangping']
[(11, 'java'), (17, 'vb'), (21, 'c++'), (101, 'go'), (201, 'c')]
[(201, 'c'), (21, 'c++'), (101, 'go'), (11, 'java'), (17, 'vb')]
例 2: 辞書に対する操作
lang = {
11:"java",101:"go",201:"c",17:"vb",21:"c++"}
print(lang)
print(sorted(lang.items(),key=lambda x:x[0])) # 按字典的 key 排序
print(sorted(lang.items(),key=lambda x:x[1])) # 按字典的 value 排序
运行结果如下:
===================== RESTART: C:\Python\Python38\First.py =====================
{
11: 'java', 101: 'go', 201: 'c', 17: 'vb', 21: 'c++'}
[(11, 'java'), (17, 'vb'), (21, 'c++'), (101, 'go'), (201, 'c')]
[(201, 'c'), (21, 'c++'), (101, 'go'), (11, 'java'), (17, 'vb')]