>백엔드 개발 >파이썬 튜토리얼 >파이썬 함수형 프로그래밍을 함께 분석해 봅시다

파이썬 함수형 프로그래밍을 함께 분석해 봅시다

WBOY
WBOY앞으로
2022-03-03 17:27:551787검색

이 글은 함수형 프로그래밍과 관련된 문제를 주로 소개하는 python에 대한 관련 지식을 제공합니다. 즉, 명령형 패러다임에서는 컴퓨터에 일련의 명령을 제공한 다음 이를 실행하여 작업을 완료하는 것이 모든 사람에게 도움이 되기를 바랍니다. .

파이썬 함수형 프로그래밍을 함께 분석해 봅시다

추천 학습: python 학습 튜토리얼

이 글에서는 함수형 패러다임이 무엇인지, 함수형 프로그래밍에 Python을 사용하는 방법을 알아봅니다. 또한 목록 이해와 다른 형태의 이해에 대해서도 배우게 됩니다.

기능적 패러다임

명령형 패러다임에서는 컴퓨터에 일련의 명령을 제공하고 이를 실행하여 작업을 수행합니다. 이러한 명령을 실행할 때 특정 상태가 변경될 수 있습니다. 예를 들어 처음에 A를 5로 설정한 다음 A의 값을 변경한다고 가정합니다. 이때 변수의 내부값이라는 의미에서 A의 상태를 변경하게 됩니다.

기능적 패러다임에서는 컴퓨터에게 무엇을 해야 할지 알려주는 것이 아니라 그것이 무엇인지 알려줍니다. 예를 들어, 숫자의 최대 공약수는 무엇이며, 1에서 n까지의 곱은 무엇입니까?

따라서 변수는 바뀔 수 없습니다. 변수를 설정하면 영원히 그 상태로 유지됩니다(순수한 함수형 언어에서는 변수가 아닙니다). 따라서 함수형 프로그래밍에는 부작용이 없습니다. 부작용은 함수가 자신이 아닌 다른 것을 변경하는 경우입니다. 일반적인 Python 코드의 몇 가지 예를 살펴보겠습니다.

이 코드의 출력은 5입니다. 기능적 패러다임에서 변수를 변경하는 것은 큰 일이 아니며 해당 범위 밖의 것에 영향을 미치는 기능을 갖는 것도 큰 일이 아닙니다. 함수가 할 수 있는 유일한 일은 무언가를 계산하고 결과로 반환하는 것입니다.

이제 여러분은 "변수도 없고 부작용도 없지? 이것이 왜 좋은가?"라고 생각할 수도 있습니다. 좋은 질문입니다. 대부분의 사람들이 이에 대해 혼란스러워하고 있을 것입니다.

동일한 매개변수로 함수를 두 번 호출하면 동일한 결과가 반환된다는 것이 보장됩니다. 수학 함수를 공부해 본 적이 있다면 그 이점을 알게 될 것입니다. 이를 참조 투명성이라고 합니다. 함수에는 부작용이 없기 때문에 무언가를 계산하는 프로그램을 작성하는 경우 프로그램 속도를 높일 수 있습니다. func(2)가 호출할 때마다 3을 반환하면 이를 테이블에 저장할 수 있으며, 이는 프로그램이 동일한 기능을 반복적으로 실행하는 것을 방지합니다.

일반적으로 함수형 프로그래밍에서는 루프를 사용하지 않습니다. 우리는 재귀를 사용합니다. 재귀는 일반적으로 "자기 호출"을 의미하는 수학적 개념입니다. 자신을 하위 함수로 반복적으로 호출하는 재귀 함수를 사용하세요. 다음은 Python의 재귀 함수에 대한 좋은 예입니다.

일부 프로그래밍 언어도 게으르다. 이는 그들이 마지막 순간까지 계산하거나 아무것도 하지 않는다는 것을 의미합니다. 2 + 2를 수행하는 코드를 작성하면 함수 프로그램은 실제로 결과를 사용해야 할 때만 이를 계산합니다. 우리는 곧 Python의 게으름을 탐구할 것입니다.

Map

이해를 돕기 위해 먼저 반복이 무엇인지 살펴보겠습니다. 일반적으로 반복할 수 있는 객체는 목록이나 배열이지만 Python에는 반복할 수 있는 다양한 유형이 있습니다. 매직 메소드를 구현하여 반복할 수 있는 자신만의 객체를 만들 수도 있습니다. 매직 메소드는 객체를 더욱 Pythonic하게 만드는 데 도움이 되는 API와 같습니다. 객체를 반복 가능하게 만들려면 2가지 매직 메소드를 구현해야 합니다.

첫 번째 매직 메소드 "__iter__"(참고: 여기서 이중 밑줄)는 반복 가능한 객체를 반환하며 일반적으로 루프 시작 부분에 사용됩니다. "__next__"는 다음 객체를 반환합니다.

빨리 터미널에 들어가서 위의 코드를 호출해 봅시다:

실행하면

Python에서 이터레이터는 __iter__ 매직 메소드만 있는 객체입니다. 즉, 개체 내의 위치에 액세스할 수 있지만 개체를 ​​탐색할 수는 없습니다. 일부 개체에는 컬렉션과 같은 __iter__ 매직 메서드 대신 __next__ 매직 메서드가 있습니다(이 문서의 뒷부분에서 설명). 이 글에서는 우리가 터치하는 모든 것이 반복 가능한 객체라고 가정합니다.

이제 반복 가능한 객체가 무엇인지 알았으니 지도 기능으로 돌아가 보겠습니다. map 함수를 사용하면 iterable의 각 항목에 함수를 적용할 수 있습니다. Map에는 적용할 함수와 반복 가능한 객체인 2개의 입력이 필요합니다.

다음과 같은 숫자 목록이 있다고 가정해 보겠습니다.

각 숫자를 제곱하려면 다음 코드를 작성하면 됩니다.

Python의 함수 함수는 게으르다. "list"를 사용하지 않으면 함수는 목록 자체 대신 iterable의 정의를 저장합니다. 우리가 사용할 수 있도록 Python에게 "이것을 목록으로 변환"하라고 명시적으로 지시해야 합니다.

Python에서 갑자기 비게으른 평가에서 게으른 평가로 전환하는 것은 조금 이상합니다. 명령형 사고방식보다는 기능적 사고방식으로 더 많이 생각하다 보면 결국 익숙해지게 될 것입니다.

이제 "square(num)"와 같은 일반 함수를 작성하는 것은 좋지만 올바르지 않습니다. 지도에서 사용하려면 완전한 함수를 정의해야 합니까? 음, 람다(익명) 함수를 사용하여 맵에서 함수를 정의할 수 있습니다.

람다 표현식

람다 표현식은 한 줄만 있는 함수입니다. 예를 들어, 다음 람다 표현식은 주어진 숫자를 제곱합니다:

실행해 보겠습니다:

이것은 함수처럼 보이지 않나요?

글쎄, 조금 혼란스럽기는 하지만 설명은 가능합니다. 변수 "square"에 무언가를 할당합니다. 이것은 어떻습니까:

는 Python에게 이것이 람다 함수이고 입력은 x라고 알려줍니다. 콜론 뒤의 모든 작업은 입력으로 수행하는 작업이며 자동으로 결과를 반환합니다.

제곱 프로그램을 코드 한 줄로 단순화하려면 다음과 같이 할 수 있습니다.

그래서 람다 표현식에서는 모든 매개변수가 왼쪽에 있고 매개변수로 수행하려는 작업은 오른쪽에 있습니다. . 좀 지저분해요. 하지만 사실은 다른 함수형 프로그래머만이 읽을 수 있는 코드를 작성하는 데 어느 정도의 재미가 있습니다. 또한 함수를 하나의 코드 라인으로 변환하는 것도 매우 멋집니다.

Reduce

Reduce는 반복을 하나로 바꾸는 함수입니다. 일반적으로 목록에서 축소 함수를 사용하여 목록을 숫자로 줄이는 계산을 수행합니다. Reduce는 다음과 같습니다:

우리는 종종 람다 표현식을 함수로 사용합니다.

목록의 곱은 각 개별 숫자의 곱입니다. 이렇게 하려면 다음과 같은 코드를 작성해야 합니다.

그러나 Reduce를 사용하면 다음과 같이 작성할 수 있습니다.

동일한 기능을 얻으면 코드가 더 짧아지고 함수형 프로그래밍을 사용하는 경우 더 깔끔해집니다. (참고: 축소 기능은 더 이상 Python3의 내장 기능이 아니며 functools 모듈에서 가져와야 합니다.)

Filter

필터 기능은 반복 가능한 방법을 사용하고 필요하지 않은 모든 것을 필터링합니다. 반복 가능한 것.

보통 필터에는 함수와 목록이 필요합니다. 목록의 각 항목에 함수를 적용하고 함수가 True를 반환하면 아무 작업도 수행하지 않습니다. False가 반환되면 해당 항목이 목록에서 제거됩니다.

구문은 다음과 같습니다.

필터 없이 작성하는 간단한 예를 살펴보겠습니다.

필터를 사용하면 다음과 같이 작성할 수 있습니다.

Python은 언어입니다. 끊임없이 발전하고 대중화되고 있는 , 여전히 업데이트 중입니다. 공부할 때 더 나은 결과를 위해 함께 공부하고 토론할 학습 파트너를 찾는 것이 좋습니다. Python을 배우고 싶다면 Python 학습 교류 그룹(627012464)에 가입하여 함께 감독하고 학습할 수 있습니다. 여기에는 개발 도구, 공유할 수 있는 유용한 정보 및 기술 정보가 많이 포함되어 있습니다!

고차 함수

고차 함수는 함수를 매개변수로 사용하고 함수를 반환할 수 있습니다. 아주 간단한 예는 다음과 같습니다.

함수를 반환하는 두 번째 예:

처음에 순수 함수형 프로그래밍 언어에는 변수가 없다고 말했습니다. 고차 함수를 사용하면 이 작업이 더 쉬워집니다.

Python의 모든 함수는 일급 시민입니다. 일류 시민은 다음 특성 중 하나 이상을 갖는 것으로 정의됩니다.

런타임에 생성됨

데이터 구조의 변수 또는 요소 할당

함수에 인수로 전달

함수의 결과로 반환됨

파이썬의 모든 함수는 고차 함수로 사용될 수 있습니다.

부분 적용

부분 적용(클로저라고도 함)은 조금 이상하지만 매우 멋집니다. 필수 매개변수를 모두 제공하지 않고도 함수를 호출할 수 있습니다. 예를 들어 보겠습니다. 우리는 2개의 인수, 밑수와 지수를 취하고 다음과 같이 밑수를 거듭제곱하여 반환하는 함수를 만들고 싶습니다.

이제 우리는 숫자를 제곱하는 거듭제곱 함수를 사용하여 계산하는 전용 제곱 함수가 필요합니다.

이것은 작동하지만 큐브 기능을 원한다면 어떻게 될까요? 아니면 네 번째 힘의 기능을 찾는 것은 어떻습니까? 그들에 대해 계속해서 글을 쓸 수 있을까요? 글쎄요. 그러나 프로그래머는 게으르다. 같은 일을 계속해서 반복한다면, 그 일을 반복하지 않고 속도를 높일 수 있는 더 빠른 방법이 있다는 신호입니다. 여기서 클로저를 사용할 수 있습니다. 클로저를 사용한 square 함수의 예를 살펴보겠습니다.

멋지지 않나요! 1개의 매개변수만으로 2개의 매개변수가 필요한 함수를 호출할 수 있습니다.

루프를 사용하여 큐브에서 최대 1000까지 거듭제곱을 구현하는 거듭제곱 함수를 생성할 수도 있습니다.

함수형 프로그래밍은 파이썬적이지 않습니다

우리가 함수형 프로그래밍에서 하고 싶은 많은 일이 목록을 중심으로 이루어진다는 사실을 눈치채셨을 것입니다. 축소 함수와 클로저를 제외하고 표시되는 모든 함수는 목록을 생성합니다. Guido(Python의 아버지)는 Python의 함수 표현식을 좋아하지 않았습니다. 왜냐하면 Python에는 이미 목록을 생성하는 고유한 방법이 있었기 때문입니다.

Python의 대화형 환경에서 "import this"라고 쓰면 다음과 같은 결과가 나타납니다.

이것은 Python의 Zen입니다. 이것은 Pythonic하다는 것이 무엇을 의미하는지에 대한 시입니다. 우리가 다루고 싶은 부분은 다음과 같습니다.

이를 수행할 수 있는 확실한 방법은 하나만 있어야 합니다. (하나를 찾으려고 노력해야 하며 가급적이면 하나의 확실한 솔루션만 찾으십시오.)

Python에서는 map과 filter가 다음을 수행할 수 있습니다. 목록 이해와 동일한 작업입니다(아래에서 설명). 이는 Zen of Python의 규칙 중 하나를 위반하므로 함수형 프로그래밍의 이러한 부분은 "파이썬"으로 간주되지 않습니다.

또 다른 주제는 Lambda입니다. Python에서 람다 함수는 일반 함수입니다. 람다는 구문 설탕입니다. 이 두 진술은 동일합니다.

일반 함수는 람다 함수가 수행할 수 있는 모든 작업을 수행할 수 있지만 그 반대로 작동할 수는 없습니다. Lambda 함수는 일반 함수가 수행할 수 있는 모든 작업을 수행할 수 없습니다.

함수형 프로그래밍이 전체 Python 생태계에 잘 맞지 않는 이유에 대한 짧은 주장입니다. 앞서 목록 이해에 대해 언급한 것을 눈치채셨을 것입니다. 이제 이에 대해 논의하겠습니다.

List comprehensions

앞서 map이나 filter로 할 수 있는 모든 것은 list comprehension을 사용할 수 있다고 말씀드렸습니다. 목록 이해는 Python에서 목록을 생성하는 방법입니다. 구문은 다음과 같습니다.

목록의 각 숫자를 제곱해 보겠습니다. 예:

목록의 각 항목에 함수를 적용하는 방법을 볼 수 있습니다. 필터를 어떻게 적용하나요? 이전 코드를 보세요:

다음과 같이 이를 목록 이해로 변환할 수 있습니다.

if와 같은 지원 문을 나열합니다. 원하는 것을 얻기 위해 더 이상 무언가에 백만 개의 기능을 적용할 필요가 없습니다. 실제로 어떤 종류의 목록을 생성하려는 경우 목록 이해를 사용하는 것이 더 깔끔하고 쉬워 보입니다. 목록에서 0 아래의 모든 숫자를 제곱하고 싶다면 어떻게 해야 할까요? 람다, 맵 및 필터를 사용하면 다음과 같이 작성할 수 있습니다.

이 내용은 매우 길고 복잡해 보입니다. 목록 이해의 경우 다음과 같습니다.

목록 이해는 목록에서만 작동합니다. map과 filter는 모든 반복 가능한 객체에 적합합니다. 그렇다면 이것이 어떻게 사용됩니까? 만나는 반복 가능한 객체에 대해 추론을 사용할 수 있습니다.

기타 파생

반복 가능한 모든 개체에 대한 파생을 만들 수 있습니다.

모든 반복 가능한 객체는 파생을 사용하여 생성할 수 있습니다. Python 2.7부터는 사전(해시맵)도 생성할 수 있습니다.

반복 가능한 경우 생성할 수 있습니다. 마지막 예제 세트를 살펴보겠습니다.

set는 요소가 두 번 반복되지 않는 요소 목록입니다.

세트의 요소에는 순서가 없습니다.

set에는 dict와 동일한 중괄호가 있음을 알 수 있습니다. 파이썬은 매우 똑똑합니다. dict에 값을 제공하는지 여부에 따라 dict 공제를 작성하는지 또는 set 공제를 작성하는지 알 수 있습니다.

추천 학습: python 튜토리얼

위 내용은 파이썬 함수형 프로그래밍을 함께 분석해 봅시다의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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