티스토리 뷰

파이썬 함수의 특징 중 하나로 다양한 빌트인 함수(built-in function 또는 standard function이라고도 함)를 가지고 있다는 것을 들 수 있다. 자바에서는 바로 사용할 수 있는 함수가 없는데, 그래서 System.out.print(...) 같은 복잡한 코드를 써야 하는 번거로움이 있다. 파이썬은 그런 거추장스러운 것을 걷어내고 편리하고 강력한 함수들을 빌트인으로 아주 많이 제공하고 있다. (전체 빌트인 함수의 리스트 여기 를 참조하세요.)

파이썬으로 프로그래밍할 때는 이 빌트인 함수를 잘 사용하는 것이 중요하다. 언어마다 문제를 해결하는 방법이 다른데, 언어가 원래 제공하는 기능들이 저마다 다르기 때문이다. 파이썬은 강력한 빌트인 함수를 이용해 자주 등장하는 문제 유형에 대해 한 방에(한 줄로 간단하게) 많은 데이터를 처리할 수 있다. 

다음 함수들은 이터러블을 매개변수로 받아 유용한 계산을 해준다. 이터러블이란 여러 개의 데이터를 차례로 생성할 수 있는 객체를 얘기하는데, 시퀀스는 대표적인 이터러블이다.

all(iter), any(iter), max(iter), min(iter), sum(iter[, start])

이 함수들은 대량의 데이터에 대해 특정 성질을 검사하거나 최대, 최소, 합을 구하는 기능을 제공하여 데이터 분석에서 유용하게 쓰인다. 

  • all(mylist) : 리스트에 있는 요소들이 모두 True로 계산될 때만 True를 돌려준다.  (요소를 참 거짓으로 변환하여 계산)
  • any(mylist) : 리스트에 있는 요소 중 하나라도 True로 계산되는 것이 있으면 True를 돌려준다.
  • max(mylist) : 리스트에 있는 요소 중에 비교 연산에 의해 가장 큰 것을 반환한다. (모든 요소가 비교 가능해야 함)
  • sum(mylist) : 리스트에 있는 요소를 더한 값을 돌려준다. (모두 숫자형이어야 가능)

예를 들면 연속된 값들 중에 하나라도 0이 있는가를 검사하려면 all이 거짓인가를 보면 된다. 0은 거짓이고 0이 아닌 모든 값은 참이기 때문에 0이 하나라도 들어있으면 all()은 거짓이 된다. 또는 여러 개의 문자열 중에 하나라도 빈 문자열이 있는가를 검사한다면 역시 all이 거짓인가를 보면 된다. 빈 문자열은 거짓이고 빈문자열이 아닌 것은 참이기 때문이다.

이러한 함수들과 결합될 때 특히 유용한 것이 ( ) 모양의 컴프리헨션인데, 이것을 제너레이터 수식(generator expression)이라고 한다. 이것은 지연 계산을 하는 제너레이터가 되어서 아무리 많은 데이터나 심지어 무한한 데이터라도 효율적으로 계산이 가능하다. 제너레이터에 대한 포스트에서 따로 설명하려고 한다. 이러한 제너레이터 수식과 위의 빌트인 함수들이 결합되면 아주 강력한 프로그래밍 방법을 제공한다.

예를 들어 회원 정보를 가진 mem_list가 있을 때 그것으로부터 나이 20세 미만인 회원이 있는지 알고 싶다면? 여기서 각 회원을 나타내는 member 객체 안에 필드 age가 있다고 가정한다.

any(member.age < 20 for member in mem_list)
all(member.age >= 20 for member in mem_list)

또는 회원들의 포인트 총점을 알고 싶다면?

sum(member.point for member in mem_list)

나이 60세 이상의 회원들의 포인트 총점을 계산하려면?

sum(member.point for member in mem_list if member.age >= 60)

회원들의 포인트 중 최대값은?

max(member.point for member in mem_list)

이와 같이 이터러블에 대해서 적용되는 빌트인 함수들이 어떤 것이 있는지 공부하고 하나씩 익혀 나가는 것이 좋다. 빌트인 함수와 빌트인 클래스의 메소드들을 잘 사용할 수 있으면 파이썬의 파워를 최대한 활용할 수 있게 된다.

한가지 파이썬 함수의 원칙은 duck typing에 의해 매개변수가 정해진 연산을 수행하기에 적합한 타입이라고 가정하고 함수의 코드가 작성된다는 점이다. 잘못된 타입이 들어오면 해당 코드가 실행될 때 TypeError 또는 ValueError가 발생하게 된다. 다음 코드는 함수를 호출할 때는 오류가 발생하지 않고 실제 if 문에서 비교를 할 때 오류가 발생한다. 파이썬은 타입을 미리 정하지 않으므로 함수 호출에서 타입 검사도 하지 않는다.

그러므로 사용하기 전에 해당 함수가 어떤 일을 하고 매개변수는 어떤 것을 원하는지 확인해야 한다. 파이썬은 이런 것들을 직관적이고 쉽게 사용할 수 있게 잘 디자인한 언어로 유명하다. 예를 들면 위의 sum 함수는 매개변수가 숫자를 가진 이터러블이기를 기대하고 abs(x)는 숫자 타입, randint(a, b)에서는 int 타입이기를 기대할 것이다. all이나 any는 진위형으로 변환할 수 있으면 그냥 계산한다. 파이썬에서는 대부분의 값이나 객체에 대해 참 거짓을 판별할 수 있다. 또한 max 함수라면 모든 요소들을 서로 비교해야 하므로 동일한 타입의 값을 가져야 한다. 

이외에도 유용한 함수들이 많이 제공된다. 다음 함수들은 비교적 쉽게 사용할 수 있는 것들이다. 

(1) 정보 제공하거나 객체(생략하면 self)의 상태를 검사하는 함수들

help([objet]), id(objet), dir([object]), vars([object]), locals(), globals(), type()

help([object or "subject"])의 의미를 좀 들여다 보자. 함수의 문법, 즉 어떤 매개변수를 넣어야 하는지를 알려주는 부분인데, 여기서 [ ... ]는 생략가능함을 나타낸다. 즉 매개변수가 없어도 된다는 것이다. 없을 때는 디폴트 값을 가지고 실행될 것이다. 또 object는 어떤 객체를 나타낸다. 그러므로 id() 함수는 매개변수가 한 개 반드시 있어야 하고 dir() 함수는 한개 또는 0개의 매개변수를 받고 뒤의 세 개 함수는 매개변수가 없다.

(2) 산술 연산에 관련된 함수들

* 여기서 x, y, z는 변수를 나타내고 a, b, c, n, m은 int 타입의 값이나 변수를 나타낸다. [, x]는 생략 가능함을 나타낸다.
|x| : abs(x),                     x ^ y % z : pow(x, y[, z])                           round(x[, n])

x의 y제곱 % z를 나타낸다. z는 생략가능하고 생략되면 나머지 연산을 하지 않는다. round 함수는 n이 생략되면 소수점 첫째자리에서 반올림하여 정수를 돌려준다.

다음은 math 모듈에 정의된 산술 연산의 빌트인 상수와 함수들이다. 빌트인 상수는 해당 이름의 상수를 이미 만들어둔 것으로 math 모듈을 import하면 언제든 그 이름을 사용할 수 있다. 

빌트인 상수 : e, pi 
ceil(x), floor(x), trunc(x), log(x), √:sqrt(x), cos(x), sin(x), tan(x), 
acos(x), asin(x), atan(x), atan2(x, y), hypot(x, y), cosh(x), sinh(x), … 

다음은 random 모듈에 정의된 산술 연산의 빌트인 함수들이다. import random을 하고 random.randint(2, 100) 이런 식으로 쓸 수 있다. 

seed([x]), random(), randint(a, b), randrange([start], end[, step]), 
uniform(a, b), choice(seq), shuffle(seq), sample(seq, k)

여기서 seq는 시퀀스 타입의 매개변수가 올 수 있음을 뜻한다.

[용어 정리]

  • 시퀀스는 값이나 객체가 여러 개 순서를 가지고 모여있는 것을 의미한다. 리스트, 튜플, 스트링이 시퀀스에 속한다.
  • 콜렉션은는 요소들을 포함할 수 있는 객체를 의미하며, in 연산으로 포함여부를 검사할 수 있는 대상을 총칭한다. 리스트나 튜플 등 대부분의 자료구조는 콜렉션이면서 시퀀스다. 그러나 set이나 딕셔너리처럼 순서가 없이 요소들이 모여있는 자료구조는 콜렉션이지만 시퀀스가 아니다. 
  • 이터러블이란 여러 개의 값을 하나씩 차례로 돌려주는 객체(인터페이스)를 의미한다. 계산에 의해 차례로 값을 돌려주는 것도 이터레이터고 컨테이너나 시퀀스의 값을 차례로 돌려주는 것도 이터레이터다.

일반적으로 콜렉션이 가장 넓은 개념으로 그냥 데이터가 모여 있다는 의미고 시퀀스는 그 데이터들이 일정한 순서를 가지고 있다는 뜻이 된다. 이터러블은 콜렉션에 대해 하나씩 값을 돌려줄 수 있는 기능을 가진 자료구조를 의미한다.

(3) 스트링(문자)에 관련된 빌트인 함수들

ord(c), chr(i)

스트링에서 한 글자에 관련된 함수로는 글자의 유니코드 값을 돌려주는 ord()와 int 값으로부터 그 유니코드 값에 해당하는 문자를 돌려주는 char() 함수가 있다. 우리가 문자를 순서대로 사용하고 싶을 때 또는 어떤 유니코드 구간의 문자를 확인하고자 할 때 사용할 수 있는 함수들이다.

(4) 타입 변환에 관한 빌트인 함수들

스트링과 진위형(boolean)으로의 타입 변환은 정의된 곳에서는 묵시적으로 이루어진다. 변수 x에 대해 해당하는 타입 변환이 정의되어 있으면 변환된 값을 반환하고 아니면 오류(ValueError)를 일으킨다. 예를 들어 int('three')는 오류고 int('333')은 333을 돌려준다.

str(x), bool(x), int(x), float(x) 

(5) 입출력에 관한 빌트인 함수들

print(), input()

(6) 제너릭 연산들

range([start,] end[, step]), len(container), enumerate(iter[, n]), 
reversed(seq), sorted(iter[, k][, rev])

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함