>  기사  >  백엔드 개발  >  파이썬의 왕, 람다 함수

파이썬의 왕, 람다 함수

PHPz
PHPz앞으로
2023-04-14 23:22:011349검색

파이썬의 왕, 람다 함수

Lambda 함수 소개

Lambda 함수는 익명(이름 없음) 함수라고도 알려져 있으며, 매개변수의 개수와 매개변수를 사용하여 수행할 조건이나 연산을 콜론으로 구분하여 직접 받아들이고, 최종 결과. 큰 코드 베이스에 코드를 작성하면서 작은 작업을 수행하거나, 함수 내에서 작은 작업을 수행하기 위해 일반적인 프로세스에서는 람다 함수를 사용합니다.

lambda argument_list:expersion

argument_list는 매개변수 목록이며, 그 구조는 Python의 함수 매개변수 목록과 동일합니다.

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

expression은 매개변수에 대한 표현식이며, 표현식에 표시되는 매개변수는 다음과 같습니다. 한 줄에만 있어야합니다.

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)
  • 함수는 한 줄로만 작성하고 생성합니다. 일반 함수에서는 들여쓰기를 사용합니다.
  • 코드 재사용에는 사용할 수 없습니다. 또는 다른 파일에서는 가져오지 마세요. 반면 일반 함수는 코드 재사용을 위해 사용되며 외부 파일에서 사용할 수 있습니다.

람다 함수를 사용하는 이유

일반적으로 람다 함수는 사용하지 않고, 고차함수와 함께 사용합니다. 고차 함수는 작업을 완료하기 위해 둘 이상의 함수가 필요한 함수입니다. 또는 함수가 다른 함수를 반환하는 경우 Lambda 함수가 사용될 수 있습니다.

고차함수란 무엇인가요?

예를 통해 고차함수를 이해해보세요. 정수 목록이 있고 세 개의 출력이 반환되어야 한다고 가정합니다.

  • 목록에 있는 모든 짝수의 합
  • 목록에 있는 모든 홀수의 합
  • 3으로 나누어지는 모든 수의 합

먼저 이 문제를 처리하기 위해 일반 함수를 사용한다고 가정합니다. 이 경우 개별 작업을 저장하기 위해 세 가지 다른 변수가 선언되고, 결과 세 변수를 처리하고 반환하는 데 for 루프가 사용됩니다. 이 방법은 정상적으로 작동합니다.

이제 Lambda 함수를 사용하여 이 문제를 해결할 수 있습니다. 그런 다음 세 가지 다른 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에 내장된 고차 함수

Map 함수

map()은 제공된 함수에 따라 지정된 시퀀스를 매핑합니다.

Map 함수는 두 개의 매개변수를 받는 함수입니다. 첫 번째 매개변수 함수는 매개변수 시퀀스의 각 요소를 사용하여 함수 함수를 호출하고, 두 번째 매개변수는 반복 가능한 시퀀스 데이터 유형입니다. 각 함수에서 반환된 값을 포함하는 새 목록을 반환합니다.

map(function, iterable, ...)

Map 함수는 반복자 개체에서 일부 작업 유형을 정의합니다. 즉, 한 배열의 각 요소의 제곱을 원하는 결과를 생성하는 다른 배열에 매핑하는 등 정사각형 배열 요소를 원한다고 가정합니다.

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

지도 기능을 다양한 방법으로 사용할 수 있습니다. 이름, 주소 등과 같은 세부 정보가 포함된 사전 목록이 있고 목표는 모든 이름을 포함하는 새 목록을 생성하는 것이라고 가정합니다.

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 또는 None, iterable) --> 필터 객체

함수나 항목이 참인 반복 가능한 항목에 대한 반복자를 반환합니다. 함수가 None이면 true를 반환합니다.

Reduce 함수

이 함수는 Python의 내장 함수가 아니며 functools import Reduce를 통해 가져와야 합니다. Reduce는 요소를 줄이기 위해 주어진 함수를 적용하여 시퀀스 데이터 구조에서 단일 출력 값을 반환합니다.

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

왼쪽에서 오른쪽으로 시퀀스 항목에 두 개의 인수 함수를 누적 적용하여 시퀀스를 단일 값으로 줄입니다.

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函数。

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

위 내용은 파이썬의 왕, 람다 함수의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제