소개
기능 프로그래밍(함수형 프로그래밍)의 개념은 자동 가비지 수집 개념을 처음 제안한 John McCarthy가 1958년에 설립한 LISP에서 처음 시작되었습니다. 이 개념은 현재 Python/Java/Ruby 등 많은 언어에서도 사용됩니다. . 오늘날 LISP는 많은 방언을 만들어냈습니다. 객체지향 프로그래밍과 비교하여 함수형 프로그래밍의 장점 중 하나는 불변성(Immutable)입니다. 데이터(data is immutable)는 외부 데이터에 의존하지 않고 외부 데이터의 값을 변경하지 않는다는 의미입니다. 이 아이디어는 코드의 버그를 크게 줄일 수 있으며 함수형 프로그래밍도 변수와 같은 함수를 사용할 수 있도록 지원합니다. 객체 지향 언어인 Python은 함수형 프로그래밍도 지원하지만 순수하지는 않고 꼬리 재귀 최적화를 지원하지 않습니다.
람다 사용
람다는 익명 함수입니다. 람다를 적절하게 사용하면 코드 양을 줄일 수 있을 뿐만 아니라 코드 논리를 더 잘 설명할 수도 있습니다. 지금 우리는 다음과 같은 기능을 가지고 있습니다.
>>> def f(x): ... return x + x # 调用这个函数 >>> f(2) 4
람다를 사용하여 이 함수를 다시 작성하면 코드 한 줄이면 충분합니다.
# lambda后面的x表示lambda函数要接收的参数,x + x表示lambda函数所要返回的值 >>> f = lambda x: x + x # 可以看到f现在也是一个函数对象 >>> f <function __main__.<lambda>> # 调用lambda函数 >>> f(2) 4
지도 사용
map(function, iterable)은 두 개의 매개변수를 받습니다. 첫 번째 매개변수는 함수 수신을 나타내고, 두 번째 매개변수는 목록과 같은 iteralbe 유형 객체의 수신을 나타냅니다.
지도 기능의 원리는 다음과 같습니다. 1. 매번 iterable에서 매개변수를 제거합니다. 2. 이 매개변수를 함수에 전달합니다. 3. 그런 다음 함수에서 반환된 값을 목록에 추가합니다(이 설명은 정확하지 않습니다. 모든 사람의 이해를 돕기 위해 설명하겠습니다. 나중에) . 모든 반복 가능한 객체를 순회한 후 map은 호출자에게 목록을 반환합니다. 예제를 통해 직접적으로 map을 활용하는 방법을 배워봅시다.
example1
# 还是用我们上面那个lambda的例子 >>> function = lambda x: x + x # 定义一个iterable对象list(列表) >>> iterable = [1, 2, 3, 4, 5, 6, 7, 8, 9] # 函数fucntion每次从iterable中取出一个参数x,然后function返回x + x的值, # 并将返回值加入一个新建的list,等将iterable遍历完,map就将这个新建的list返回。 >>> v = map(function, iterable) # 注意上面的说法并不准确,只是为了帮助大家理解,其实map返回的是一个map对象,并不是list >>> v <map at 0x7fcb56231588> # 但是我们可以调用内建的list函数将map转换成一个list来得到我们想要的结果 >>> list(v) [2, 4, 6, 8, 10, 12, 14, 16, 18]
example2
map의 두 번째 매개변수의 경우 함수 목록 집합을 전달할 수도 있습니다. 이는 목록에 여러 함수 개체가 포함되어 있음을 의미합니다.
>>> multiply = lambda x: x * x >>> add = lambda x: x + x >>> funcs = [multiply, add] >>> list(map(lambda f: f(1), funcs)) [1, 2]
reduce 사용법
map과 동일, Reduce(function, iterable)도 두 개의 매개변수를 받습니다. 첫 번째 매개변수는 함수 수신을 나타내고, 두 번째 매개변수는 목록과 같은 iteralbe 유형 객체 수신을 나타냅니다. 하지만 차이점은 Reduce의 함수는 두 개의 매개변수를 받아야 한다는 점이다. 리스트의 누적합을 구하는 예를 통해 Reduce의 사용법을 배워보자.
from functools import reduce # 使用lambda定义一个函数,函数的作用是接收两个参数,然后返回两个参数之和 >>> function = lambda x, y: x+y >>> iterable = [1, 2, 3, 4, 5, 6, 7, 8, 9] # 函数function每次接收两个参数,除第一次外每次从iterable中取一个元素作为一个参数 # 另外一个参数取自上一次function返回的值 >>> reduce(function, iterable) 45
filter
의 사용법은 map/reduce, filter(function, iterable)도 한 번에 두 개의 매개변수를 받습니다. 한 매개변수는 함수이고 다른 매개변수는 반복 가능한 객체입니다. 이름에서 알 수 있듯이 필터는 목록(list)과 같은 반복 가능한 객체를 필터링하는 데 사용됩니다.
그 원리는 반복 가능한 객체에서 요소를 꺼내서 함수에 적용하는 것입니다. 함수가 True를 반환하면 해당 요소는 유지됩니다. 예제를 통해 필터의 사용법을 살펴보겠습니다.
# 定义一个函数,如果接收的字符s为空,那么返回False,如果为非空,那么返回True >>> function = lambda s : s and s.strip() >>> iterable = ['AJ', ' ', 'Stussy', '', 'CLOT', 'FCB', None] >>> filter(function, iterable) <filter at 0x7fcb562319b0> >>> list(filter(function, iterable)) ['AJ', 'Stussy', 'CLOT', 'FCB']
Decorator
Decorator는 고급 Python 구문입니다. 데코레이터는 함수, 메서드 또는 클래스를 처리할 수 있습니다. 데코레이터를 합리적으로 사용하면 코드 양을 줄이고 프로그램의 가독성을 높일 수 있습니다. Django와 같은 많은 Python 프레임워크에서는 수많은 데코레이터를 볼 수 있습니다.
>>> def add(x, y): ... return x + y ... >>> def multiply(x, y): ... return x * y ...
이제 각각 덧셈과 곱셈에 사용되는 위의 두 함수가 있지만 이제 함수가 충분하지 않다고 생각하여 결과를 반환하기 전에 몇 가지 출력 문을 추가하고 싶습니다. 이와 같이 두 함수를 재구성해야 합니다.
>>> def add(x, y): ... print("input:", x, y) ... return x + y ... >>> def multiply(x, y): ... print("input:", x, y) ... return x * y ...
데코레이터를 사용한다면, 현재 상황에서는 데코레이터를 사용해도 별 장점이 없을 것 같지만, 추가적으로 인쇄 기능을 2개 이상 추가하고 싶다면 다음과 같이 하면 됩니다. 더하기/곱하기 빼기/나누기와 같은 기능도 있습니다. 이때 데코레이터의 힘이 반영됩니다. 코드의 한 부분만 수정하면 프로그램의 가독성이 향상될 뿐만 아니라 비용도 절약됩니다. 앞으로 코드를 재구성하는 데 많은 노력이 필요합니다.
def decorator(F): def new_function(x, y): print("input:", x, y) return F(x, y) return new_function @decorator def add(x, y): return x + y @decorator def multiply(x, y): return x * y
위 내용은 Python 함수형 프로그래밍 입문 튜토리얼 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!