본문 바로가기

배우기/복습노트[Python과 분석]

[복습] Python 원소별 반복과 사용자 정의 함수(1)

728x90
반응형

반복이 필요한 순간

  - 리스트의 모든 벡터 연산

  - if문

 

가장 기본이 되는 자료 구조 자체가 막혀버리니 R보다 파이썬에서 반복문의 필요성이 더 중요할 수 밖에 없다.

 

 

원소별 반복의 방법

1) 반복문 사용(for, while)

대용량의 자료구조에는 적합하지 않다.

 

2) 적용함수(map사용: 원소별 반복을 도와줌)

 

 

 

잠시 적용함수 전에 사용자 정의 함수를 살펴보자.

 

사용자 정의 함수 생성에는 

1. lambda 

2. def

두 가지가 있다.

lambda는 축약형으로 input value와 output value와의 관계가 단순한 경우 사용된다.

def는 보다 복잡한 프로그래밍 기능을 지원한다(객체를 생성하거나, 반복문이나 조건문을 사용하거나 하는 기타 등등의 로직을 가져야지만 output value가 나오는 경우).

 

오늘은 lambda만 먼저 살펴보도록 하겠다.

 

lambda의 문법은 아래와 같다.

 

함수명 = lambda input : output

 

예1) 숫자 하나를 입력하면 100을 더하는 결과를 리턴하는 함수 만들기

 

 

예2) 두 개의 숫자를 동시에 전달하면 두 수의 곱을 리턴하는 함수 만들기

 

 

예) 세 개의 숫자를 동시에 전달하여 앞의 두 수의 합에서 세 번째 값을 곱하여 리턴하기

단, 두 번째 값의 기본값은 0으로 설정하여라.

 

y만 =0으로 지정하는 경우에는 에러가 나므로 z 까지 디폴트 설정을 하여야 한다(x는 첫 번째 인수여서 디폴트 설정을 하지 않아도 무방하지만 나는 해주었음).

변수는 차례대로 들어가게 된다.

세 개의 숫자가 들어가지 않으면 x, y, z 순서대로 숫자가 들어가게 되고 모자란 값은 디폴트 값으로 계산이 된다.

만일 y만 중간에 디폴트로 넣고 싶다면 아래와 같이 하면 되겠다.

 

 

 

 

이제 다시 적용함수 map으로 돌아가서,  map에 대하여 알아보겠다.

map이란 적용함수(반복문을 대신해주는 함수)의 일종으로 1차원 객체의 반복 적용만 가능하다.

분리(fetch) - 적용(함수 적용) - 결합의 매커니즘을 갖는다.

map함수(기본)와 map 메서드(pandas)가 존재한다.

map 메서드의 경우에는 시리즈에만 .map이 존재하므로 시리즈에서만 가능하다.

데이터 프레임에서 특정 행이나 컬럼 하나를 선택하면 시리즈이므로, 여기에 map을 적용할 수도 있겠다.

 

 

1. map 함수

  - 리스트, 시리즈, 1차원 배열 모두 전달이 가능하다(1차원이면 다 됨).

  - 즉, 여러 1차원 객체에 대한 동시 fetch 가능

 

문법

map(func,                 # 적용함수

        *iterables)         # 반복 가능하다는 의미(동시에 여러 객체에 대한 fetch를 지원함, mapply처럼).

                                    즉, 적용 가능한 대상에 대한 복수 전달이 가능하다는 의미

 

 

2. map 메서드

  - pandas에서 제공

  - 1차원에만 적용이 가능하므로 시리즈에만 적용이 가능함(시리즈 특화 기능)

  - 여러 객체와 함께 하지 못함. 객체 하나에만 사요됨. 즉, 하나의 시리즈만 fetch 가능

 

문법

s1.map(arg,             # 적용 함수 자리

             na_action)  # NA 처리 옵션

 

 

 

 

lambda + map

위에서 lambda를 미리 살펴 본 이유이다.

map에는 정의된 함수를 전달하여야 한다.

대체적으로 기본 기능에 대한 함수 정의는 lambda로 선언한다.

그래서 lambda + map 정의가 중요한 것이다.

 

 

예) 리스트 연산

앞 게시글에서 공부했듯이 l1 = [1, 2, 3, 4, 5]의 경우 l1+100 연산이 불가하다.

하지만 lambda + map을 통하여 이걸 되게 하려고 한다.

 

이런 식으로 계산하면 되는데, map은 결합하여 연산까지는 하지만 객체 선택은 하지 못한다.

메모리 주소 값으로 자료구조 정보만 전달해준다.

따라서 메모리에서 호출까지 마무리를 우리가 해주어야 한다.

 

이렇게 하여야 한다.

 

map 특성상 callable function이 들어가야 하며, map이 원소 하나하나를 꺼내어 함수에 전달해준다.

 

 

예) 리스트의 숫자를 2로 나눈 나머지를 리턴하여라.

 

 

예) 크기가 같은 두 리스트를 연산하여라.

l2 = [10, 20, 30, 40, 50] 으로 정의했을 때 l1 + l2 하면 리스트의 결합이 되기 때문에 lambda + map을 통하여 리스트의 합을 구하여 보아라.

 

 

lambda + map을 활용하여 포맷 변경도 가능하다.

R에서의 sprintf 는 문자열의 포맷을 출력해주는 함수이다.

SQL에서는 tochar 정도가 되겠다.

 

파이썬에서의 문법은 다음과 같다

포맷 % 대상

 '%.2f' % 100  이라고 하면 100.00 으로 출력된다.

 

 

예) l1을 정수 → 실수 타입으로 변환하여라.

 

 

파일을 불러와서 변환하여 보자.

이렇게 불러올 수 있겠다.

위에서는 네 번째 열을 불러와서 실수 타입으로 변환한 것인데 2차원 구조에서의 원소별 적용은 applymap이다.

 

이렇게 알아두자.

728x90
반응형