filter 내장 함수는 주어진 시퀀스 자료 중에서 아이템들을 필터링하여 참인 요소만 모아 출력한다.

두 개의 인수를 가지며 첫 인수는 (map 함수와 같이) 함수이고, 두 번째 인수는 시퀀스 자료형이다.


ex) 2보다 큰 값 리턴, 홀수만 리턴, 짝수만 리턴


조건식이 복잡하다면 별도의 함수를 만들어야 할 것이다. 하지만 이러한 전통적인 방식의 코딩보다는 filter 함수를 사용함으로써 얻어지는 간결함과 이해도의 증가는 코딩을 하는 데 많은 이익을 준다.


filter 함수의 또 다른 이득은 여러 자료형에 대해서 같은 자료형의 결과를 넘겨준다는 것이다.



또 다른 유용한 활용 예는 다음과 같이 리스트에서 별 의미 없는 값을 삭제하는 것이다.


filter의 첫 인수로 None을 사용하면 입력 값을 진리 값을 판별하는 데 그대로 사용한다.


Posted by scii
:


map 내장 함수

사상 함수 map은 입력 집합(X)과 사상 함수(f)가 주어져 있을 때, Y = f(X) 를 구한다.

map은 두 개 이상의 인수를 받는다 첫 인수는 함수(f)이며 두 번째부터는 입력 집합(X)인 시퀀스 자료형(문자열, 리스트, 튜플 등) 이어야 한다.를

첫 인수인 함수는 입력 집합 수만큼의 인수를 받는다.


ex)


map 함수의 첫 번째 인수는 함수(f)이고, 두 번째 인수는 리스트이다. 

두 번째 인수의 모든 아이템들은 첫 인수의 함수 f에 적용되고 결과로 리스트를 리턴한다.


map 함수는 간결하면서도 이해하기 쉬운 코드를 생성하게 한다. 개개의 요소를 다루지 않지만...

Y = map(f, X) 는 집합 X에 함수 f를 적용한 결과 Y를 구한다는 의미가 명확하다.

실행 효율면에서도 일반 for를 쓰는 것보다 앞선다. 따라서 가능하면 이러한 방식의 코딩을 많이 하는 것이 좋은 방법이다.


람다 함수를 이용한 map 함수:

X = [1,2,3,4,5]

Y = map(lambda a: a*a, X)

함수를 재사용하지 않을 경우에는 이렇게 간단하게 람다 함수를 이용하는 것이 간편하다.


map 함수는 입력을 두 개 이상도 받는다.


이 때는 함수도 입력 집합 수에 맞추어서 인수를 받아야 한다.

만일, map에 넘겨주는 함수가 이미 파이썬에서 정의한 연산일 경우에는 operator 모듈을 이용할 수 있다.


순서 쌍 만들기

map 함수는 순서쌍을 만드는 데도 사용딘다. 이를 위해서는 첫 인수로 None을 넘겨주어야 한다.


여기서 함수 객체 None의 의미는 입력받는 값을 그대로 전달하는 함수로 생각할 수 있다.


※ 순서 쌍을 만들 때, map과 zip의 차이점:

map은 길이가 다를 때 None을 추가하지만, zip은 짧은 인수를 기준으로 나머지는 버린다.


Posted by scii
:


람다 함수는 이름이 없는 한 줄짜리 함수이다. 


lambda 콤마로 구분된 인수들 : 식


받는 인수가 없고 언제나 1을 리턴하는 람다 함수는 다음과 같다.

lambda : 1


람다 함수는 값을 리턴하기 위하여 return 문을 사용하지 않는다. 

람다 함수의 몸체는 문이 아닌 하나의 식이어야 한다.

람다 함수는 함수 레퍼런스를 리턴한다.

람다 함수도 디폴트 값과 가변 인수를 지정할 수 있다. ex) lambda x, *args : args


람다 함수는 주로 함수를 인수로 넘겨주어야 하는 경우에 편리하게 사용된다.



함수 def로 구현한다면, 함수를 정의하고 나서 함수를 인수로 전달할 수 있지만 람다 함수는 정의하는 즉시 인수로 전달이 된다.

이와 같은 차이는 문(statement)과 식(expression)에서 온다. 문은 if, for while, class, def 등과 같이 파이썬적 문장을 구선한다. 문은 리턴값이 없으며, 식의 일부분으로 사용될 수 없다. def는 문으로 함수를 정의한다.

식은 결과 값이 존재하며 다른 식의 일부로 사용될 수 있다. 람다 함수는 식이다. 따라서, 정의와 함께 함수 인수로 전달하는 것이 가능하다.


'Programming > Python' 카테고리의 다른 글

함수적 프로그래밍 - filter 내장 함수  (0) 2013.04.28
함수적 프로그래밍 - map 내장 함수  (0) 2013.04.28
튜플 인수와 사전 인수로 함수 호출  (0) 2013.04.28
가변 인수  (0) 2013.04.28
키워드 인수  (0) 2013.04.27
Posted by scii
:

만일 함수 호출에 사용될 인수들이 튜플에 있다면, "*" 를 이용하여 함수 호출이 가능하다.

만일 함수 호출에 사용될 인수들이 사전에 있다면, "**" 를 이용하여 함수 호출이 가능하다.

튜플 인수와 사전 인수를 함께 사용할 수도 있다.




'Programming > Python' 카테고리의 다른 글

함수적 프로그래밍 - map 내장 함수  (0) 2013.04.28
람다 함수 (lambda function)  (0) 2013.04.28
가변 인수  (0) 2013.04.28
키워드 인수  (0) 2013.04.27
함수의 중첩 영역  (0) 2013.04.27
Posted by scii
:

가변 인수

Programming/Python 2013. 4. 28. 01:04 |


고정되지 않은 수의 인수를 함수에 전달하는 방법이 있다. 함수를 정의할 때, 인수 리스트에 반드시 넘겨야 하는 고정 인수들을 우선 나열하고, 나머지를 튜플 형식으로 한꺼번에 받는다.



이것을 이용하면, 파이썬으로 C언어의 printf 문을 그대로 흉내 낼 수 있다.



'Programming > Python' 카테고리의 다른 글

람다 함수 (lambda function)  (0) 2013.04.28
튜플 인수와 사전 인수로 함수 호출  (0) 2013.04.28
키워드 인수  (0) 2013.04.27
함수의 중첩 영역  (0) 2013.04.27
[File I/O] 지속 모듈  (0) 2013.04.14
Posted by scii
:

키워드 인수

Programming/Python 2013. 4. 27. 21:28 |


함수 호출에서 키워드 인수란, 

인수 이름으로 값을 전달하는 방식이다.



일반적으로 함수 호출을 할 때 키워드 인수의 위치는 위치 인수(보통의 인수) 이후에 위치한다.


예를 들면, 다음은 가능하다.

area(20, width=5)


키워드 인수 전까지는 순서에 의한 인수 매칭을 한다. 그러나 다음은 가능하지 않다.

area(width=5, 20)

키워드 인수 이후에 순서에 의한 인수매칭을 할 수는 없다.


'Programming > Python' 카테고리의 다른 글

튜플 인수와 사전 인수로 함수 호출  (0) 2013.04.28
가변 인수  (0) 2013.04.28
함수의 중첩 영역  (0) 2013.04.27
[File I/O] 지속 모듈  (0) 2013.04.14
표준 입/출력 방향 전환  (0) 2013.04.13
Posted by scii
:


함수 안에 함수가 정의되어 있는 경우 "중첩 영역(Nested Scopes)이 발생한다.

이 경우, 가장 안쪽의 영역부터 바깥쪽의 영역 쪽으로 변수명을 탐색하며, 먼저 발견되는 변수의 값을 취한다.


init[0]은 변수를 새로 생성하는 것이 아니고 참조하는 것이므로...



'Programming > Python' 카테고리의 다른 글

가변 인수  (0) 2013.04.28
키워드 인수  (0) 2013.04.27
[File I/O] 지속 모듈  (0) 2013.04.14
표준 입/출력 방향 전환  (0) 2013.04.13
파일 입/출력 예제  (0) 2013.03.12
Posted by scii
:


지속성(Persistence) 이란 어떤 프로그램이 만든 데이터가 프로그램이 종료되고 나서도 존재하게 하고, 또 그 후에 다시 그 데이터를 프로그램에서 사용하는것이다.


리스트, 튜플, 사전 등 읨의의 객체를 파일에 쓰고, 읽으려면 어떻게 해야 할까? 또 내가 만든 클래스나 인스턴스를 그대로 파일에 쓰려면 어떻게 해야 할까?

이러한 작업은 단순한 파일 입/출력 기법으로는 구현하기 어렵다. 파이썬은 파이썬 객체를 파일에 저장하는 몇 가지의 기법을 제공하고 있다.


DBM 관련 모듈

데이터를 DBM 형식으로 파일에 기록한다.

시스템에 따라서 관련된 다양한 모듈들이 제공된다. (anydbm, dbm, gdbm, dbhash, dumbdbm)

anydbm 모듈을 사용하면 시스템에서 사용가능한 모듈 중 DBM 호환 가능한 최적의 모듈을 찾아준다. 기능이 가장 떨어지긴하지만 dumbdbm이 기본적으로 제공된다. 

사전 자료형을 쓰는 법과 동일한 인터페이스를 제공한다. 

키와 값은 모두 문자열이어야 한다.


pickle 모듈

파이썬 객체를 피클링하여 파일에 저장하는 일반화된 지속성 모듈이다. 

파이썬 기본 객체뿐 아니라 복잡하게 얽혀 있는 객체들의 관계까지도 저장 가능하다.

재귀적인 관계도 모두 처리한다.

사용자 정의 클래스와 인스턴스도 처리한다.

기본적으로 텍스트 모드로 저장되나 이진 모드로도 저장 가능하다.


marchal 모듈

파이썬의 기본 객체(None, 수치 형, 문자열, 튜플, 리스트, 사전 및 코드 객체)를 이진 포멧으로 저장한다. 

재귀적인 사전이나 리스트는 처리할 수 없다. 

이 모듈은 주로 .PYC 파일의 컴파일된 코드를 쓰고 읽는데 사용된다.

일반 객체 입/출력은 pickle 모듈을 사용해야한다. 사용법은 pickle과 동일하다.


shelve 모듈

사전 자료형으로 자료를 접근할 수 있도록 한 것은 anydbm과 동일하나, 차이점은 임의의 파이썬 객체가 값(value)로 사용될 수 있다.

내부에서 사전형 인터페이스를 위해서 anydbm 모듈을 사용하고 객체 저장을 위해서 cPickle 모듈 (pickle의 C 버전) 을 이용한다.

값으로 임의의 객체가 저장될 수 있다.


DBM 파일 관련 모듈

anydbm 모듈은 시스템에서 사용 가능한 dbm 호환 가능한 최적의 모듈을 찾아준다. 사용법은 사전 자료형과 거의 유사하다.

키에 의한 참조로 파일에서 자료를 읽어 오고, 인덱싱으로 치환하는 것으로 파일에 자료를 저장한다. 

키와 값은 반드시 문자열이어야 한다.


사용 예


생성된 DBM 파일을 읽어서 처리하는 예 



피클링 (Pickling)

pickle 모듈은 임의의 파이썬 객체를 저장하는 가장 일반화된 모듈이다.

pickle 모듈은 파이썬 기본 객체뿐 아니라 사용자 클래스, 인스턴스 및 복잡하게 얽혀 있는 객체들의 관계까지도 저장한다. 

재귀적인 관계도 모두 처리한다.


※ 피클링은 '절임' 이란 뜻이다. 오이나 배추 등을 소금에 절여서 저장해 두는 것을 말한다. 여기서는 객체를 파일에 저장하는 의미이다. 

소금이 원래의 상태를 보존하듯이 파이썬 피클링은 객체의 상태를 그대로 저장한다. 피클링을 이용하면 기본 자료형 이외의 복잡한 자료형을 텍스트 형태로 혹은 이진 파일 형태로 변환하여 저장하거나, 네트워크를 통해 다른 시스템으로 전달 가능하며, 다시 원래의 객체 형태로 복원 가능하게 된다.


객체를 파일로 출력하려면 pickle.dump를 이용한다.

pickle.dump(출력할 객체, 파일 객체)


객체를 파일에서 읽어 들이려면 pickle.load를 이용한다.

pickle.load(파일 객체)


문자열로 객체를 출력하거나 문자열에서 객체를 읽어 들이려면 dumps, loads 를 사용한다.

s = pickle.dumps(출력할 객체)

object = pickle.loads(s)





pickle의 좋은 점:

사용자가 정의한 임의의 클래스 및 인스턴스 객체도 저장할 수 있다는 것이다.

저장될 시점의 모든 멤버 변수들의 값이 그대로 유지되므로 언제든지 다시 불러서 계속적인 수행이 가능하다. 예를 들어, 일정한 분량의 작업을 수행하다가 멈추고 현재 상태를 pickle을 이용하여 저장한 후 나중에 다시 읽어 들여 계속적으로 수행하게 할 수 있다.


다음은 사용자 클래스 인스턴스 객체를 저장하고 읽는 예이다.





이것은 디버깅을 쉽게 하고 문제가 생겼을 때 일반 텍스트 에디터로 복구를 쉽게 하기 위한 것이다.

하지만, 이 방식은 파일 크기도 크고 또한 처리 속도도 느리다. 만일 이진 모드로 저장하여 효과적인 처리를 원한다면 dump할 때 이진 모드로 설정하면 된다.


위의 예에서 pickle.dump를 호출할 때 생략된 세 번째 인수 bin에 참 값을 넣어 주면 효과적인 이진 파일로 저장된다.

pickle.dump(s, f, bin=1)     # bin 인수에 True가 주어지면 이진 파일로 인스턴스가 저장된다.


cPickle 모듈

만일 pickle 모듈의 속도가 느리다고 생각한다면, C로 만들어진 cPickle 모듈을 사용하면 된다. 

cPickle 모듈은 pickle 모듈과 같은 인터페이스를 가지고 있지만 약 1000배 빨리 수행되도록 설계되었다.


'Programming > Python' 카테고리의 다른 글

키워드 인수  (0) 2013.04.27
함수의 중첩 영역  (0) 2013.04.27
표준 입/출력 방향 전환  (0) 2013.04.13
파일 입/출력 예제  (0) 2013.03.12
파일 객체 속성들  (0) 2013.03.11
Posted by scii
: