파이썬은 처음이라 – 내장함수는 거의 처음이라

우리는 지난 시간에 파이썬에서 함수를 정의하여 사용하는 방법에 대해서 살펴보았다. 함수라는 건 어떤 작은 일을 하는 단위에서 출발할 수 있고, 작은 일을 하는 함수들을 잘 조합하면 복잡한 IF나 WHILE문이 없더라도 조금 복잡하거나 멋진 일을 간단하게 처리할 수 있다는 것에 대한 일말의 가능성도 조금 엿보았다. 하지만 항상 모든 함수를 다 정의해서 사용해야 할 필요는 없다. 정말 자주 쓰이거나 일반적인 작업에 꼭 필수적이라서 매번 정의해야 하는 것이 좋을 것 같은 함수들에 대해서 대부분의 언어들은 기본함수라는 것들을 제공하고 있다.

사실 파이썬에는 엄청나게, 정말이지 엄청나게 많은 기본함수들이 있다. 하지만 이 많은 기본함수들이 모두 모든 상황에 필요한 것은 아니다. 기본함수들은 용도나 작업 목적등에 따라서 분류되어, 모듈이라는 단위로 묶여서 파이썬의 기본 라이브러리에 들어있다. 그리고 우리는 어떤 기능을하는 함수가 필요할 때, 그 함수가 있는 모듈을 라이브러리에서 찾아서 가져와 사용하면 된다. 물론 방대한 기본 라이브러리의 함수들을 모두 다 알고 있을 필요는 없고, 그 때 그 때 레퍼런스 문서등을 찾아서 사용하면 된다. 대신에 input()이나 print()와 같은 몇몇 중요한 기본적인 함수들은 별도의 모듈을 결합하지 않더라도 파이썬에서 기본적으로 쓸 수 있는데, 이러한 함수들을 빌트인함수, 즉 내장함수라 한다.

내장함수는 본 블로그의 내장함수일람을 참고해서 보면 된다. 대신 여기서는 지금까지 살펴봤던 몇 가지 내장함수를 살펴보고, 또 용도별로 종종 쓰게 될 것 같은 내장함수들을 간단히 소개하겠다. 역시 내장함수도 처음부터 모든 함수들을 다 외울 필요가 없다. 앞으로 파이썬을 공부해 나가다보면 자연스럽게 자주 써서 눈에 익는 함수들이 생길 것이고, 그러한 함수들 위주로 자연스럽게 익숙해지면 된다.

생성자

리스트, 문자열, 튜플은 각각 파이썬 내에서 (소문자로 시작한다.) list, str, tuple 이라는 타입 이름으로 불린다. 그리고 파이썬의 이런 기본타입들은 모두 타입이름과 동일한 생성자 함수를 갖고 있다.

  1. 생성자 함수는 인자 없이 호출되면 빈 연속열을 만든다.
  2. 생성자 함수는 다른 종류의 연속열 혹은 반복가능값을 해당 타입의 연속열로 변환한다.
## 빈 연속열을 만든다.
a = list() ## []
b = tuple() ## ()
c = str() ## ''

## range(5)은 반복가능한 값인데, 리스트나 튜플로 만들 수 있다.
a = list(range(5))
b = tuple(range(5))
#a -> [0,1,2,3,4], b->(0,1,2,3,4)
b = tuple(a)
#b -> (0,1,2,3,4)

## 단 str() 함수는 조금 특별한데, 주어진 값을 그대로 문자열로 바꾼다.
c = str(a)
## '[0, 1, 2, 3, 4]'
c = str(range(5))
## 'range(0, 5)'

참고로 사전(dict())과 세트(set())역시 생성자 함수를 가지고 있다. 이런 연속열이나 집합 외에 다른 생성자들도 있다. 문자열이나 실수를 정수값으로 바꾸는 int() 함수, 실수로 변경하는 float()함수가 이에 속한다.

기본 연산

기본연산에 사용되는 함수를 몇 가지 소개하겠다.

  • abs() : 절대값을 계산한다.
  • round() : 특정 자리에서 반올림한다.[^1]
  • divmod() : 주어진 두 수를 나눌 때 몫과 그 나머지를 계산한다.
## abs는 주어진 값의 절대값(부호가 없는 값)을 구한다.
abs(-7) # 7
abs(2) # 2

## round는 주어진 수를 주어진 자리에서 반올림한다. 
## 두 번째 인자를 써서 소수점 몇째자리까지 유지할 것인지 정할 수 있다.
round(23.2) # 23
round(23.2546, 3) # 23.255

## divmod(x, y)는 x를 y로 나눈 몫과 나머지를 계산한다.
## 이 때 몫을 Q, 나머지를 R 이라 할 때  Q*y +R = x 가 된다.
divmod(17, 5) # (3, 2)
q, r = divmod(-12, 5) 
# q = -3, r = 3

입출력

기본입출력에 사용되는 함수들이다. input()print() 함수에 대해서는 어느 정도 익숙해져 있을 것이다. open() 함수는 파일을 열어서 데이터를 입출력할 때 사용되는데, 파일 입출력에 대한 내용은 별도의 토픽으로 다뤄야 할 듯 하다.

  • input() : 키보드로 입력을 받는다.
  • print() : 화면에 글자를 출력한다.
  • open() : 파일을 연다. 이렇게 파일을 열어서 파일에 데이터를 저장하거나 불러올 수 있다.

연속열/반복 관련

실질적으로 가장 많이 쓰이고, 그래서 잘 알아두어야 한다.

  • sum() : 반복가능한 값에 대해 합계를 계산한다.
  • len() : 연속열의 길이를 구한다.
  • max(), min() : 반복가능한 값 중에서 최대, 최소 값을 구한다.
  • sorted() : 반복가능한 값의 원소들을 정렬하여 리스트로 만든다.
  • reversed() : 반복가능한 값의 원소들을 역순으로 나열하는 반복자를 만든다.
  • next() : 반복자의 다음 원소를 추출한다.
  • iter() : 반복가능한 값으로부터 반복자를 생성한다.
  • enumerate() : 반복가능한 값이 그 인덱스(0, 1, 2…)와 각 원소의 쌍을 반복할 수 있게 한다.
## sum
xs = [3, 1, 4, 2]
sum(xs) # -> 10
len(xs) # -> 4
min(xs) # -> 1
max(xs) # -> 4
## sorted의 경우에 정렬된 사본을 만든다.
sorted(xs) # -> [1, 2, 3, 4]  ## xs는 여전히 원래 순서를 유지한다.
list(reversed(xs)) # -> [2, 4, 1, 3]

for i, e  in enumerate(xs):
  print(i, e)
## 0 3
## 1 1
## 2 4
## 3 2