
(엔지니어를 위한) 파이썬 시작하기[7]
내용 : 내장함수
0.시작하며
파이썬에서 기본적으로 제공하는 함수들이 있다. 다음 시간에 배울 모듈은 외부에 소스코드가 있어서 불러다 쓰는 것인데 내장함수라는 것은 불러오지 않아도 쓸 수 있는 내장함수다.
사실 파이썬의 강력함은 많은 모듈이 있다는 것이다. 많은 사람들이 기능을 만들어서 모듈로 배포를 한다. 사용하는 사람은 설치해서 쓰기만 하면 된다. 물론 사용법을 약간 공부해야 하기는 하지만 스스로 만드는 것보다 훨씬 편할 수 밖에 없다.
모듈은 다음 시간에 다루기로 하고 이번 시간에는 내장된 기본적으로 내장된 함수들을 다루겠다.
1. 내장함수
내장함수의 갯수는 많다.하지만 쓰는 것만 알고 있으면 된다. 함수들을 이름을 모두 알고 있어야 할 필요도 없다. 앞에서 설명한 것처럼 내가 뭘하고 싶은지 구글에서 검색하면 쉽게 찾을 수있다. 예를 들어서 엑셀에 있는 최대값 구하는 max함수가 있는지 알아보려면 구글 검색창에서 python max funtion이라고 입력해보자.

python max까지만 입력해도 연관검색어들이 뜬다. 검색을 통해서 원하는 함수 또는 코드를 찾아서 코딩하는 습관을 들이는 것이 좋다.
python 인터프리터를 실행하고 max함수를 테스트해보자. max()함수의 사용법은 예상을 크게 벗어나지 않는다. ,로 구분된 여러개의 값이나 변수를 넣어도 되고, 리스트나 dictionary등을 넣어도 된다.
>>> max(1,4,6,7) 7 >>> vals = [23,45,67,54] >>> max(vals) 67 |
key와 value의 쌍으로 이루어진 dictionary에서는 어떻게 작도할까?
>>> dica = {"a1":11, "a2":4, "a3":6} >>> max(dica) 'a3' |
기본적으로 key값을 비교하고 큰 것을 돌려준다는 것을 알 수 있다.
value값 중 큰 값을 찾으려면 아래와 같이 .values()함수를 써서 value값들을 추출한 다음 max함수를 쓴다.
>>> dica.values() dict_values([11, 4, 6]) >>> max(dica.values()) 11 |
그렇다면 가장 큰 값을 가지고 있는 key는 무엇일까? 구글검색을 해보면 쉽게 찾을 수 있다.
답은 아래와 같이 key=dict.get을 이용하는 것이다. 가장 큰 값인 11의 key값인 ‘a1’을 알려주고 있다.
>>> dica = {"a1":11, "a2":4, "a3":6} >>> max(dica,key=dica.get) 'a1' |
key값을 알고 있으므로 최대값은 key값을 이용해서 구할 수 있을 것이다. 이와 같이 검색을 통해서 함수의 사용법을 익히는 훈련을 하는 것이 좋다. 물론 매뉴얼을 찾아보는 방법도 있지만 최종적으로 알고 싶은 기능에 대해서 검색을 하는 것이 가장 바람직하다.
내장 함수들 중 좀 특이하거나 자주 쓰는 함수들을 소개하겠다.
abs() : 절대값을 구해준다.
divmod() : 몫과 나머지를 구해준다.
enumerate() : 리스트나 dictionary의 index와 값을 쌍으로 돌려준다.
eval() : 입력된 문자열을 코드로 보고 그 코드의 실행결과를 돌려준다.
filter() : 말 그대로 걸러낸 결과를 돌려준다.
int() : 정수로 바꿔준다.
len() : 리스트나 dictionary의 길이를 돌려준다.
list() : 반복가능한 (iterable) 자료를 받아 list로 만들어준다.
map() : 반복가능한 자료의 각요소에 대해 특정 함수를 적용해준다.
max() : 최대값을 돌려준다.
min() : 최소값을 돌려준다.
pow() : 제곱한 결과를 돌려준다.
range() : 입력한 범위에 대한 반복가능한 객체를 돌려준다.
round() : 반올림 값을 돌려준다.
sorted() : 반복가능한 객체를 받아 sort된 결과 리스트를 돌려준다.
str() : 문자열 형식으로 변환해준다.
sum() : 입력받는 리스트나 tuple의 합을 돌려준다.
tuple() : 입력받은 반복가능한 자료형을 받아 tuple로 만들어 돌려준다.
type() : 입력받는 객체의 자료형이 무엇인지 알려준다.
zip() : 동일한 개수로 이루어진 자료형을 묶어준다.
내장함수들은 ‘이런 기능이 있구나’ 정도 알아두는 것이 중하다. 모든 것을 외우는 것보다 ‘어떤 기능이 있었던 것 같은데… 찾아봐야겠네’ 이런 느낌으로 공부하면 된다. 그러면 하나하나 간단하게 소개하겠다.
abs()
정수, 실수에 대해서 절대값을 구해준다.
>>> abs(-7) 7 >>> abs(-7.5) 7.5 >>> |
divmod() : 몫과 나머지를 구해준다. 정수, 실수에 모두 적용가능하다. 10/3의 몫과 나머지를 tuple형태로 반환한다.
>>> divmod(10,3) (3, 1) >>> divmod(10.5,6) (1.0, 4.5) |
divmod함수를 이용해서 구한 몫과 나머지를 따로 구하려면 결과를 다른 변수에 저장하고 [0]을 붙이면 첫번째 측 몫을, [1]을 붙이면 두번째 요소인 나머지를 구할 수 있다. divmod의 결과가 tuple형이라는 걸 기억하자.
>>> a=divmod(10.5,6) >>> a[0] 1.0 >>> a[1] 4.5 |
enumerate() : 리스트나 dictionary의 index와 값을 쌍으로 돌려준다. for문에서 많이 쓰는 함수이므로 기억해두는 것이 좋다.
>>> lst = [1,2,3,4] >>> for i,v in enumerate(lst): ... print(f'i: {i}, v:{v}') ... i: 0, v:1 i: 1, v:2 i: 2, v:3 i: 3, v:4 |
for문 설명할 때 for v in list: 이런 식으로 쓰면 list안에 있는 값을 차례대로 v라는 변수 대입시켜서 반복한다고 했다. 그런데 index도 필요한 경우에는 list에 enumerate()함수를 적용시키면 index와 값을 모두 돌려준다.
시험삼아 list에 enumerate를 적용해보면 어떤 결과가 나오는 지 보자.
>>> enumerate([1,2,3,4]) <enumerate object at 0x00000159443D5EC0> |
기대했던 것과 다른 결과다. index와 값이 나올 줄 알았는데 말이다. 이번에는 enumerate의 결과에 list함수를 적용해보자.
>>> list(enumerate([1,2,3,4])) [(0, 1), (1, 2), (2, 3), (3, 4)] |
기대했던 대로 index와 값으로 묶여진 tuple들의 list를 볼 수 있다. enumerate함수를 적용하면 리스트가 만들어지는 것이 아니라 enumerate object가 만들어지는 것을 알 수 있다. object라는 개념은 나중에 설명하겠다. 뭔가 묶여져 있는 것이라고 보면 된다.
eval() : 입력된 문자열을 수식으로 보고 그 코드의 실행결과를 돌려준다. 아래의 예와 같이 변수명도 사용할 수 있다. 이 함수가 유용한 것은 사용자로부터 수식을 입력받아서 계산을 할 수 있다는 것이다.
>>> a=1 >>> b=2 >>> eval('a+abs(b)') 3 |
filter() : 말 그대로 걸러낸 결과를 돌려준다.
filter(함수명,리스트)
무엇을 기준으로 걸러낼까? 함수명를 준다. 두번째 인자인 리스트에 함수를 적용해서 참인 것들만 돌려준다. 당연히 함수의 결과는 참 또는 거짓을 돌려주는(return) 함수여야 한다. 우리는 앞에서 함수를 공부했다. 양수이면 참을 돌려주는 posi라는 함수를 만들어보자. def 키워드로 시작하고 posi라는 이름의 함수를 준다음 매개변수는 v로 정했다. return은 조건식이다. v가 0보다 크면 True, v가 0보다 작거나 같으면 False를 돌려주는 조건식이다. filter함수의 첫 인자는 posi라는 함수 이름 두번째 인자는 [1,-4,5]라는 리스트다.
>>> def posi(v): ... return v > 0 ... >>> filter(posi,[1,-4,5]) <filter object at 0x000001E306028DF0> >>> list(filter(posi,[1,-4,5])) [1, 5] |
filter의 결과는 filter object로 리턴된다. list로 바구기 위해서 list()함수를 적용하면 [1,5]를 얻을 수 있다.
lambda : 무명함수. 익명함수. 이름 없이 함수 정의하기.
이 대목에서 중요한 걸 하나 공부해보자. 앞의 filter의 예에서 posi라는 함수를 정의하고 시작했다. 그런데 이 함수는 filter 함수를 쓰기 위해서 만들어졌다. 이렇게 다른 함수에서 쓰여지는 함수는 따로 def로 정하지않고 익명함수를 정하는 lambda 기능을 이용한다.
사용법은 아래와 같다.
lambda 매개변수 : 표현식
def와 비교하면 lambda는 한 줄에 쓸 수 있고, 매개변수에 ( )를 씌우지 않는다.
위의 필터 예를 lambda로 바꿔보자. 함수를 따로 정의하는 것보다 가독성이 높다.
>>> list(filter(lambda v: v>0,[1,-4,5])) [1, 5] |
lambda함수는 list에 함수를 적용해주는 함수들에서 많이 쓴다. 이전에 공부한 map함수에서도 쓸 수 있다. map함수는 list에 어떤 함수를 적용해주는 함수였다. 예를 들어 리스트 안에 있는 값들에 모두 *2를 한다면 아래와 같이 lambda를 쓰면 편하다.
>>> list(map(lambda v: v*2,[1,-4,5])) [2, -8, 10] |
리스트 안의 각 값들이 v에 대입되고 *2를 해서 돌려준다. map함수를 적용한 결과에 list함수를 적용하는 것을 잊지 말자.
int() : 정수로 바꿔준다. 소수점 이하를 없애서 정수로 만든다. 반올림 이런 개념이 아니라 소수점 이하를 없애는 개념이다.
>>> int(1.5) 1 >>> int(2.5) 2 >>> int(3.5) 3 >>> int(3.6) 3 |
len() : 리스트나 dictionary의 길이를 돌려준다.
>>> len([1,2,3]) 3 >>> len({'a':1, 'b':2}) 2 |
list() : 반복가능한 (iterable) 자료를 받아 list로 만들어준다.
iterable이라는 것은 말 그대로 반복할수 있는 것이라고 생각하면 된다. for문에서 같이사용하는 range함수의 결과는 리스트가 아니다. type을 알려주는 type함수를 적용해보면 <class ‘range’>라는 것을 알 수 있다. class라는 일단 형식이라고 생각하면 된다. 즉 range라는 형식이라고 생각하면 된다. range형식은 iterable이다. 그래서 list함수를 적용하여 list로 만들 수 있다.
>>> range(1,5) range(1, 5) >>> type(range(1,5)) <class 'range'> >>> list(range(1,5)) [1, 2, 3, 4] |
map() : 반복가능한 자료의 각요소에 대해 특정 함수를 적용해준다.
앞에서 설명했듯이 lambda함수와 함께 쓰면 유용하다. lambda설명부분 참조.
max() : 최대값을 돌려준다. iterable의 요소중 가장 큰 값을 돌려준다.
>>> max(range(1,5)) 4 |
min() : 최소값을 돌려준다.
pow() : 제곱한 결과를 돌려준다. **연산자와 같은 효과.
>>> pow(5,3) 125 >>> 5**3 125 |
range() : 입력한 범위에 대한 반복가능한 객체를 돌려준다.
range(시작,끝,스텝) . 주의사항은 끝은 제외된다는 것이다.
>>> list(range(1,10,2)) [1, 3, 5, 7, 9] |
round() : 반올림 값을 돌려준다.
round(수,소수점자리수) 소수점자리수 위치로 되도록 반올림한다. 정확하게 반올림이 아니라는 것을 주의해야 한다. 0.6은 반올림 되지만 0.5인 경우 짝수쪽을 취한다.
>>> round(1.5) 2 >>> round(2.5) 2 >>> round(0.5) 0 |
일반적으로 생각하면 2.5의 반올림은 3이 될 것 같지만 0.5는 가운데 이기 때문에 3쪽으로 반올림하지 않고 짝수인 2.0을 돌려준다.
sorted() : 반복가능한 객체를 받아 sort된 결과 리스트를 돌려준다.
>>> sorted([1,6,3,8]) [1, 3, 6, 8] >>> |
str() : 문자열 형식으로 변환해준다.
>>> str(1.5) '1.5' |
sum() : 입력받는 리스트나 tuple의 합을 돌려준다.
>>> sum([1,2,3]) 6 >>> sum((4,5,6)) 15 |
tuple() : 입력받은 반복가능한 자료형을 받아 tuple로 만들어 돌려준다.
>>> tuple([1,2,3]) (1, 2, 3) |
type() : 입력받는 객체의 자료형이 무엇인지 알려준다.
>>> type([1,2,3]) <class 'list'> >>> type(1) <class 'int'> |
zip() : 동일한 개수로 이루어진 자료형을 묶어준다.
>>> list(zip([1,2,3],[4,5,6])) [(1, 4), (2, 5), (3, 6)] |
오늘은 내장함수에 대해서 공부했다. 모두 외우는 것보다는 이런 기능이 있구나 정도만 기억하면 된다. 나중에 필요할 때 검색하면 된다.
다음 시간에는 파이썬이 강력한 언어가 된 이유인 모듈에 대해서 알아보겠다. 모듈은 기본 파이썬 기능 외에 추가된 기능이라고 생각하면 된다. 우리도 새로운 모듈을 만들어 다른 사람과 공유할 수 있다.