> 백엔드 개발 > 파이썬 튜토리얼 > Python 함수형 프로그래밍 입문 튜토리얼

Python 함수형 프로그래밍 입문 튜토리얼

黄舟
풀어 주다: 2017-02-04 16:42:27
원래의
1579명이 탐색했습니다.

소개

기능 프로그래밍(함수형 프로그래밍)의 개념은 자동 가비지 수집 개념을 처음 제안한 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 = [&#39;AJ&#39;, &#39; &#39;, &#39;Stussy&#39;, &#39;&#39;, &#39;CLOT&#39;, &#39;FCB&#39;, None]
>>> filter(function, iterable)
<filter at 0x7fcb562319b0>
>>> list(filter(function, iterable))
[&#39;AJ&#39;, &#39;Stussy&#39;, &#39;CLOT&#39;, &#39;FCB&#39;]
로그인 후 복사

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)를 참고해주세요!


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿