Python의 기능 프로그래밍 : Lambda 기능 및 고차 기능 활용


편집자에 의한 이미지 (Kanual Mehreen) | 캔버
틀 소개
루프와 조건부로 가득 찬 파이썬 스크립트를 쳐다 보면서 일을 끝내는 더 간단한 방법이 있는지 궁금하십니까? 나도 거기에 있었다. 몇 년 전, 나는 동료가 자연스럽게 언급 할 때까지 어리석은 데이터 처리 스크립트를 다시 작성하는 데 몇 시간을 보냈습니다.Lambda 기능을 시도해 보지 않겠습니까?”그 제안은 내 코드뿐만 아니라 파이썬에서 문제에 접근하는 방법을 변화 시켰습니다.
방법에 대해 이야기합시다 파이썬의 기능적 프로그래밍 클리너,보다 표현적인 코드를 작성하는 데 도움이 될 수 있습니다. 작업 자동화, 데이터 분석 또는 앱 구축, Lambda 기능 및 고차 기능을 마스터하면 기술의 레벨이 높아집니다.
틀 기능적 프로그래밍이란 정확히 무엇입니까?
기능적 프로그래밍 (FP)은 냉동 조각을 전자 레인지 대신 베이킹 빵과 같습니다. 데이터를 단계별로 변경하는 대신 (전자 레인지 지침) 원하는 대신 (성분)를 정의하고 기능이 “방법”(베이킹)을 처리하도록합니다. 핵심 아이디어는 다음과 같습니다.
- 순수한 기능: 부작용이 없습니다. 동일한 입력은 항상 동일한 출력을 생성합니다
- 불변의 데이터: 변수 변경을 피하십시오. 대신 새 것을 만들어냅니다
- 일류 기능: 변수와 같은 기능을 처리하십시오 – 주위를 전달하고, 반환하고, 저장하십시오.
Python은 순수한 기능 언어 (Haskell과 같은)는 아니지만 FP 개념이 빛나는 곳을 빌리기에 충분히 유연합니다.
틀 람다 기능 : 파이썬의 빠른 수정
// Lambda 기능은 무엇입니까?
Lambda 기능은 즉시 정의하는 작고 익명의 기능입니다. 전체 식사 대신 “기능 간식”으로 생각하십시오.
구문은 간단합니다.
lambda arguments: expression
예를 들어, 전통적인 기능은 다음과 같습니다.
def add(a, b):
return a + b
그리고 다음은 Lambda 버전입니다.
// Lambda 기능은 언제 사용해야합니까?
Lambda 기능은 짧은 일회성 작업에 이상적입니다. 예를 들어, 두 번째 요소로 튜플 목록을 정렬 할 때 :
students = [("Alice", 89), ("Bob", 72), ("Charlie", 95)]
# Sorts by grade (the second element of the tuple)
students.sort(key=lambda x: x[1])
일반적인 사용 사례는 다음과 같습니다.
- 내부 고차 함수: 그들은 완벽하게 작동합니다
map()
,,,filter()
또는reduce()
- 사소한 도우미 기능을 피합니다: 간단한 일회성 계산이 필요한 경우 Lambda 함수는 전체 기능을 정의하지 못하게합니다.
하지만 봐 : 람다 기능이 지나치게 복잡해 보인다면 lambda x: (x**2 + (x/3)) % 4
적절하고 이름이 지정된 기능을 작성할 시간입니다. Lambdas는 암호 코드를 만드는 것이 아니라 단순성을위한 것입니다.
틀 고차 함수
고차 함수 (HOF)는 다음과 같은 함수입니다.
- 다른 기능을 논쟁으로 사용하십시오
- 결과로 반환 기능
Python의 내장 HOF는 새로운 가장 친한 친구입니다. 그들을 분해합시다.
// 지도 : 루프없이 데이터를 변환합니다
그만큼 map()
함수는 컬렉션의 모든 항목에 다른 기능을 적용합니다. 예를 들어, 온도 목록을 섭씨에서 화씨로 변환합시다.
celsius = [23, 30, 12, 8]
fahrenheit = list(map(lambda c: (c * 9/5) + 32, celsius))
# fahrenheit is now [73.4, 86.0, 53.6, 46.4]
왜 사용하십시오 map()
?
- 수동 루프 인덱싱을 피합니다
- 간단한 변환에 대한 목록 이해보다 종종 깨끗합니다.
// 필터 : 필요한 것을 유지하십시오
그만큼 filter()
함수는 특정 조건을 충족하는 반복 가능한 반복에서 항목을 선택합니다. 예를 들어, 목록에서 짝수를 찾아 봅시다.
numbers = [4, 7, 12, 3, 20]
evens = list(filter(lambda x: x % 2 == 0, numbers))
# evens is now [4, 12, 20]
// 감소 : 모든 것을 결합하십시오
그만큼 reduce()
기능에서 functools 모듈은 반복 가능한에서 단일 결과로 값을 집계합니다. 예를 들어,이를 사용하여 목록의 모든 숫자의 제품을 계산할 수 있습니다.
from functools import reduce
numbers = [3, 4, 2]
product = reduce(lambda a, b: a * b, numbers)
# product is now 24
// 자신의 고차 기능을 구축합니다
나만의 HOF를 만들 수도 있습니다. 실패하면 함수를 다시 실행하는 ‘retry’hof를 만들어 봅시다.
import time
def retry(func, max_attempts=3):
def wrapper(*args, **kwargs):
attempts = 0
while attempts
이 HOF를 데코레이터로 사용할 수 있습니다. 네트워크 오류로 인해 실패 할 수있는 함수가 있다고 상상해보십시오.
@retry
def fetch_data(url):
# Imagine a risky network call here
print(f"Fetching data from {url}...")
raise ConnectionError("Oops, timeout!")
try:
fetch_data("
except ValueError as e:
print(e)
// 람다와 호프 혼합 : 다이내믹 듀오
이러한 도구를 결합하여 사용자 가입을 다음과 같은 요구 사항으로 처리하겠습니다.
- “@gmail.com”으로 끝나도록 이메일을 확인하십시오.
- 사용자 이름을 활용하십시오
signups = [
{"name": "alice", "email": "[email protected]"},
{"name": "bob", "email": "[email protected]"}
]
# First, capitalize the names
capitalized_signups = map(lambda user: {**user, "name": user["name"].capitalize()}, signups)
# Next, filter for valid emails
valid_users = list(
filter(lambda user: user["email"].endswith("@gmail.com"), capitalized_signups)
)
# valid_users is now [{'name': 'Alice', 'email': '[email protected]'}]
틀 일반적인 관심사와 모범 사례
// 가독성
일부 개발자는 복잡한 람다 또는 중첩 된 HOF가 읽기가 어려울 수 있음을 발견했습니다. 명확성을 유지하려면 다음과 같은 규칙을 따르십시오.
- Lambda 기능 본문을 단일의 간단한 표현으로 유지하십시오
- 설명 변수 이름을 사용합니다 (예 :
lambda student: student.grade
)) - 복잡한 논리의 경우 항상 표준을 선호하십시오
def
기능
// 성능
기능적 프로그래밍이 느리십니까? 때때로. 호출 함수의 오버 헤드는 직접 루프보다 약간 높을 수 있습니다. 작은 데이터 세트의 경우이 차이는 무시할 수 있습니다. 대규모 데이터 세트에서의 성능 조작의 경우 생성기 또는 기능을 고려할 수 있습니다. itertools
모듈, 좋아요 itertools.imap
.
// 기능 프로그래밍을 피할 때
FP는은 총알이 아닌 도구입니다. 이 경우 명령 적 또는 객체 지향적 인 스타일을 고수하고 싶을 수도 있습니다.
- 팀이 기능적 프로그래밍 개념에 익숙하지 않은 경우 코드를 유지하기가 어려울 수 있습니다.
- 복잡한 상태 관리의 경우 클래스 및 객체는 종종보다 직관적 인 솔루션입니다.
틀 실제 예 : 데이터 분석이 간단하게 만들어졌습니다
Uber 승차 거리를 분석하고 3 마일 이상의 타기의 평균 거리를 계산하려고한다고 상상해보십시오. 기능 프로그래밍이 작업을 간소화하는 방법은 다음과 같습니다.
from functools import reduce
rides = [2.3, 5.7, 3.8, 10.2, 4.5]
# Filter for rides longer than 3 miles
long_rides = list(filter(lambda distance: distance > 3, rides))
# Calculate the sum of these rides
total_distance = reduce(lambda a, b: a + b, long_rides, 0)
# Calculate the average
average_distance = total_distance / len(long_rides)
# average_distance is 6.05
기능 프로그래밍을 시도 할 준비가 되셨습니까? 작은 시작 :
- 루프의 간단한 것을 교체하십시오
map()
- 리팩터 사용 루프 내부의 조건부 점검
filter()
- 의견에 귀하의 코드를 공유하십시오 – 나는 그것을보고 싶습니다.
틀 결론
기능적 프로그래밍 파이썬에서는 교리에 관한 것이 아닙니다. 명확하고 효율적인 코드를 작성할 수있는 더 많은 도구가 있습니다. 람다 기능 그리고 고차 함수 코딩 툴킷의 스위스 군용 나이프와 같습니다. 모든 작업에 대한 것이 아니라 적합 할 때 매우 중요합니다.
질문이나 멋진 예가 있습니까? 아래에 의견을 남겨주세요!
Shittu Chemive 소프트웨어 엔지니어이자 기술 작가로, 최첨단 기술을 활용하여 매력적인 이야기를 만들어 내고 복잡한 개념을 단순화하기위한 예리한 눈으로 강력한 이야기를 만들어내는 데 열정적입니다. Shittu를 찾을 수도 있습니다 지저귀다.
Post Comment