1 서문
제가 처음 함수형 프로그래밍을 접한 것은 분산컴퓨팅을 배울 때였습니다. 당시 저는 Map/Reduce에 대해 잘 몰랐고, 잘 이해하지 못했습니다. 원칙. Python의 함수형 프로그래밍은 맵/리듀스에 대한 사전 이해로 간주될 수도 있습니다. 소위 함수형 프로그래밍은 본질적으로 프로세스 지향 프로그래밍에 속할 수 있지만 그 아이디어는 수학적 계산에 매우 가깝습니다. 일반적인 프로그래밍 패러다임보다 더 추상적이며, 순수 함수형 프로그래밍 언어로 작성된 함수에는 입력이 결정되면 출력이 결정됩니다. 또 다른 특징은 함수 자체가 다른 함수에 매개변수로 전달되어 함수가 반환될 수 있다는 것입니다.
2 고차 함수
Python에서 함수 이름은 기본적으로 변수입니다. 변수에 함수 이름을 지정한 다음 이 변수를 통해 함수를 호출할 수 있습니다. Python을 사용하는 프로세스 지향 프로그래밍에서는 변수가 있는 함수가 매우 일반적인 설계이지만, 변수가 함수인 경우 변수가 있는 이 함수를 고차 함수라고 합니다.
고차 함수의 간단한 예:
def fun(n):
return n+1
def highorder(x, y, f) :
return f(x)+f(y)
위에서 정의한 lowerorder는 고차 함수로, 다른 함수를 매개변수로 받을 수 있는 함수이다.
3가지 Map/Reduce
위의 고차 함수 기반을 이용하면 이제 Map/Reduce를 이해하기 쉽습니다. Map 함수는 두 개의 매개변수를 받습니다. 하나는 함수이고 다른 하나는 Iterable입니다. Map은 Iterable의 각 요소에 함수를 차례로 적용하고 결과를 새 Iterator로 반환합니다.
다음 예를 살펴보세요.
def fun(n):
return n*2
m=map(fun, [1,2,3, 4 ,5])PRint(m)
E:Studypython>python hello_python.py
[2, 4, 6, 8, 10]
맵에 함수를 넣습니다. 재미있는 순서대로 목록의 각 요소에 대해 작업을 수행하면 [2,4,6,8,10]을 얻게 됩니다.
재미있는 함수를 정의하는 것이 번거롭다면 다음과 같이 람다를 사용하여 단순화할 수 있습니다.
m=map(lambda n:n*2, [1,2, 3,4, 5])
Reduce의 사용법을 살펴보자. Map과 마찬가지로 Reduce도 시퀀스에 함수를 순차적으로 적용하지만 이 함수는 두 가지 함수를 받아야 합니다. 그런 다음 Reduce는 처음 두 매개변수의 결과와 시퀀스의 다음 요소에 함수를 적용합니다.
Reduce를 사용하여 시퀀스 합계 연산을 구현해 보겠습니다. 다음 예를 참조하세요.
def add(x,y):
return x+y
r = 감소(추가, [1,2,3,4,5])
인쇄(r)
E:Studypython>python hello_python.py
15
람다 버전은 다음과 같습니다.
r=reduce(lambda x,y:x+y, [1,2,3,4,5])
4가지 반환 함수
앞서 함수에 변수를 대입할 수 있다고 밝혔으니, 함수는 변수를 반환할 수 있으므로 당연히 함수를 반환할 수도 있습니다. 변수를 반환하는 것과 함수를 반환하는 것 사이에는 큰 차이가 없지만 이러한 함수 반환 메커니즘은 응용 프로그램에서 큰 역할을 합니다.
다음 예를 살펴보겠습니다.
def Wrapper(*param):
def calc():
sum=0
for x in param:
sum=sum+x
무한한 수의 매개변수를 받는 래퍼 함수 래퍼를 정의합니다. 이 함수를 호출한 후 실제로 호출될 때 실행될 내부적으로 정의된 함수를 반환합니다. 또한 calc 함수에서 액세스되는 데이터는 래퍼에 의해 가져오고 이러한 매개변수는 "클로저"라고 부르는 calc와 함께 저장됩니다.
5 클로저(Closure)
처음 클로저를 접했을 때는 잘 이해가 되지 않았습니다. 여전히 Part 4의 코드를 예로 사용합니다.
래퍼는 무한한 수의 매개변수 param을 포함하는 함수입니다. 특별한 점은 이 함수 본문에 새 함수 calc도 정의되어 있다는 것입니다. 즉, 외부 함수 래퍼에 의해 전달된 매개변수가 바인딩되었습니다. calc 함수가 합쳐져 새로운 함수가 형성됩니다. param을 이 새로운 함수의 구성 정보라고 생각할 수 있습니다. 구성 정보가 다르면 함수의 출력도 당연히 달라집니다.
클로저를 더 잘 이해하려면 다음 코드 예제를 살펴보세요.
def Wrapper(conf):
def calc(n):return conf+n
return calcf1=wrapper(1)f2=wrapper(2)
print(f1(100))
print(f2(100))
E:Studypython>python hello_python.py
101
102
위 코드를 분석해 보면, 래퍼(1)을 호출하면 함수가 반환되는데, 이 함수의 구성 정보는 conf의 값이 1이라는 것입니다. Wrapper(2)가 다시 호출되면 또 다른 함수가 반환되는데, 이 함수의 구성 정보는 conf의 값이 2라는 것입니다. 따라서 나중에 f1과 f2를 호출하기 위해 100개의 매개변수를 전달하면 결과는 101과 102입니다. 근본적인 이유는 두 함수의 구성 정보가 다르기 때문입니다.
외부 기능의 모든 정보가 내부 기능에 의해 구성 정보로 사용되는 것은 아니라는 점에 유의할 필요가 있습니다. 외부 함수의 로컬 변수는 구성 정보로 사용되지 않습니다.
Six Decorator
Decorator를 만든 원래 의도는 원래 함수 코드를 수정하지 않고 함수 호출 전후에 다른 함수를 추가하는 것이었습니다. 예를 들어 로그 인쇄 등이 있습니다. . 데코레이터는 본질적으로 함수를 반환하는 고차 함수입니다. 아래에서 로그를 인쇄하는 데코레이터를 살펴보세요.
def decorator(func):
def Wrapper():
print("호출 전:")
>
f=데코레이터(func)
f()
E:Studypython> ;python hello_python.py
호출 전 :
Func 호출:
호출 후 :
위 코드는 func에 대한 데코레이터를 정의합니다. 이 데코레이터가 호출되면 함수가 반환됩니다. 그런 다음 func를 호출하십시오. 하지만 여기에는 문제가 있습니다. 즉, func를 직접 호출할 수도 있었지만 이제는 f가 호출된다는 것입니다. 이 문제를 해결하는 것은 쉽습니다. Python에서는 함수를 변수에 할당할 수 있으므로 f를 func로 변경하면 됩니다. 아래와 같이:
func= decorator(func)
func()
Python은 이 메커니즘을 구현하는 구문을 제공합니다: @. func 앞에 @designator를 추가하면 됩니다. 이는 func= decorator(func)를 실행하는 것과 같습니다. 이렇게 하면 함수를 추가한 후 동일한 이름을 사용하여 코드를 호출하는 문제가 해결됩니다. 아래와 같이:
def decorator(func):
def Wrapper():
print("호출 전:")
print("호출 후: ")
반환 래퍼
@ decorator
def func():
print("Func 호출:")
func()
이외에도 데코레이터에 매개변수를 추가하는 방법과 래퍼의 __name__ 속성을 func로 수정하는 방법도 있는데 여기서는 설명하지 않겠습니다.
7 부분함수
부분함수란? 부분 함수는 함수에 기본 매개변수를 추가하는 함수입니다. Python에서는 functools.partial을 사용하여 함수의 부분 함수를 생성할 수 있습니다. Python에서 int()를 예로 들어 보겠습니다. int() 함수는 기본적으로 10진수 변환을 사용합니다. 8진수로 변환하는 부분 함수를 생성하려면 다음과 같이 구현할 수 있습니다.
print(int( '12345' ))
int8=functools.partial(int, base=8)
print(int8('12345'))
여덟 가지 요약
이 글에서는 주로 함수형 프로그래밍의 몇 가지 기본 개념을 소개합니다. 개인적으로 가장 이해하기 어려운 것은 Decorator, 특히 소위 구성 정보라고 생각합니다. 오류가 있으면 메시지를 남겨주세요! ! !
위 내용은 Python 입문 학습을 위한 함수형 프로그래밍 내용입니다. 더 많은 관련 글은 PHP 중국어 홈페이지(www.php.cn)를 주목해주세요!