본문 바로가기

파이썬 (python)

[python 7] 파이썬 내장함수 built-in function

 

 

 

이번 글에서는 함수에 대한 기초개념을 잡고, 2가지 중요한 함수인 input( ) 함수와 print( ) 함수를 살펴보는 시간을 갖도록 한다. 변수(variable)가 어떤 데이터의 이름이듯이, 함수는 어떤 연산/기능/동작/행위의 이름이다. 사람의 언어에 비유해 보면 변수는 명사에 해당되고, 함수는 동사에 해당된다. 단, 함수의 이름은 바로 뒤에 괄호가 따라온다. 

 

어떤 이름 a 가 있다. 바로 뒤에 괄호가 없다. 그럼 이 a는 변수로 쓰인 것이다. 즉, 데이터를 가리키는 이름이다. 반면에, 어떤 이름 a가 있는데 뒤에 괄호가 붙어 있다. 예를 들어, a( ). 그럼 이 a는 함수로 쓰인 것이다. 즉, 어떤 연산을 가리키는 이름이다. # 나중에는 이런 구분이 무의미해지겠지만 (함수 이름 뒤에 꼭 괄호가 쓰여야 하는 것은 아니다), 당분간은 이렇게 구별해 두는 것이 좋겠다.

 

우리가 사용하게 될 함수에는, 내가 필요해서 직접 만들어 사용하는 함수도 있고, 다른 사람이 만든 함수를 얻어쓰는(?) 경우도 있다 (모듈 또는 패키지 형태). 많은 사람들이 필요로 하는 함수의 경우에는 파이썬 패키지에 포함되어 배포된다. 파이썬 패키지에 기본으로 포함되어 배포되는 함수를 내장함수(built-in function) 라고 부른다. 

 

앞으로 많은 파이썬 내장함수를 살펴볼텐데 가장 기본적인 몇개 함수를 살펴보도록 하자.

 

1) print( ) 함수 

파이썬의 print( ) 함수는 어떤 정보들을 모니터에 출력(output)해 주는 기능이다.

 

주피터 노트북에서 print? 라는 명령어를 입력해 보자. 주피터 노트북에서 어떤 용어에 물음표(?)를 붙이면 그 용어에 대한 설명이 팝업되어 나타난다. print? 라는 명령어는 우리나라 말로 "print 라는 이름이 뭐지?" 라는 뜻 정도로 해석하면 되겠다.

 

팝업된 설명을 보면, Docstring: 이라는 타이틀 밑으로 이 함수의 기능과 파라미터(paremeter)에 대한 소개가 나타나 있다. 그 다음으로 Type: 이라는 타이틀 아래에 이 함수는 파이썬의 내장함수 (builtin_function_or_method) 라는 것이 나타나 있다. # 실제 함수를 만들고 다루어 봐야 이해가 되는 내용이므로, 자세한 설명은 다음의 함수 블로그를 참고하기 바랍니다.

 

print( ) 함수는 print(value,...)의 형태로 사용된다. 여기서 괄호 안에 포함되어 있는 1개 이상의 value 들을 인자(argument) 라고 부른다.  결과적으로, print( ) 명령어는 괄호 안에 포함된 argument 를 화면에 출력하라는 의미가 된다.

 

몇 가지 예제를 살펴보면서 print( )함수의 기능을 이해해 보자.

 

 

In[5]에서 print(100)이라는 명령어는 100이라는 숫자를 화면에 출력하라는 뜻이다. In[5] 셀 아래에 100이란 숫자에 화면에 프린트된 것을 확인할 수 있다. 

 

In[6]에서 print('Hello') 는 "Hello 라는 문자데이터를 출력하시오" 라는 명령어가 된다. 문자 데이터는 홑따옴표로 묶인다고 설명했었는데, print( ) 문을 통해 출력된 모양에서 홑따옴표가 없는 것에 유의하자. 왜 그런가? 파이썬 담당교수 이름이 '강철수'인데 첫시간에 본인 소개를 하면서 칠판에다 이름을 적는다. 어떻게 적을까? '강철수'라고 적을까? 그냥 강철수 라고 적을까?

 

In[7]의 print(a)는 "a 값을 출력하시오"라는 명령어이다. 근데 a값은 얼마인가? 직전에 a 변수에 55라는 값이 assignment되어 있다. 결과로 55라는 값이 출력됨을 확인할 수 있다. 

 

print( ) 명령문에서 여러 개의 값을 동시에 출력할 때에는 각 값을 콤마(,)로 구분한다. print(a, b) 문장은 "a 값과 b 값을 화면에 출력하시오" 라는 명령어로 해석하면 된다. 실제 a 값 55와 b 값 100이 화면에 출력되었다. 여기서 콤마(,) 기호는 print( ) 명령문의 괄호 안에 2개 이상의 argument 가 포함될 때 그것들을 구분하기 위해 사용되었다. 이렇게 여러개를 구분하기 위해 사용되는 기호를 구분자 (delimiter)라고 부른다.  명령어들을 세미콜론(;)으로 구분하면 한줄에 여러개의 명령어를 입력할 수 있다. In[10]에서 a=55 와 b=100 이라는 2개 명령어가 세미콜론으로 구분되어 한줄에 입력될 수 있었음을 확인하자.

 

In[12]에서는 조금 복잡한 형태의 문자열을 출력하는 예제이다. 구구단 중 3*8=24 를 출력하는 print( ) 문장을 만들어 봤는데 그 형태는 print(a, '*', b, '=', a*b) 이다. 이 문장을 우리나라 말로 한번 옮겨 보자. 

 

print(a, '*', b, '=', a*b)     # in python

a 값 찍고,  그 다음에 * 라는 글자 찍고, 그 다음에 b 값 찍고, 그 다음에 = 글자 찍고, 그 다음에 a*b 값 찍고   # in Korean

print( ) 문장의 인자에는 value 외에도 sep, end, file, flush  가 있다. 이 4가지 파라미터들을 이용하여 다양한 형태로 출력을 컨트롤할 수 있다.  파이썬에 조금 더 익숙해지면 한번더 살펴보도록 하자. 

 

2) input( ) 함수 

파이썬의 input( ) 함수는 어떤 정보들을 파이썬으로 전달하는 기능을 수행한다.

 

다음 문제를 한번 고민해 보자.

 

[문제1] 어떤 사람에게 hello 인사를 한다. 그 사람의 이름은 Jang 이다.

 

아래의 코드가 모범답안이 되겠다. 

우선 name 변수에 'Jang' 문자열을 저장하고, 그 다음 print( ) 문장에서 'Hello, '와 name 값을 출력하도록 하고 있다. 여기서는 출력되는 name 값은 코드가 실행되기 전에 이미 결정되어 있다. 따라서, 실행 중에 name 값을 바꿀 수는 없다.  변수에 값을 assign 하는 것을 바인딩(biding) 이라고 하는데, 문제의 코드처럼 편집할 때 바인딩하는 것을 정적 바인딩( static binding)이라고 한다. 

 

이와 반대로 코드를 편집하는 동안에는 아직 name 값이 결정되지 않은 경우가 있다. 실행하는 중에 "사용자가 알려주면" 그 때서야 그 사람에게 Hello  인사를 할 수 있는 경우이다. 이 경우를 동적 바인딩(dynamic binding)이라고 부른다. 

 

쉽게 얘기하면 [문제]가 다음과 같이 바뀌었다는 뜻이다.

 

[문제2] 사용자가 어떤 사람의 이름을 알려주면, 그 사람에게 hello 인사를 한다.

 

이와 같이 사용자가 컴퓨터(파이썬)에게 어떤 정보를 전달하는 것이 필요한 경우가 있다. 이러한 경우를 위해 만들어진 내장함수가 input ( ) 이다.  print( ) 함수 살펴볼 때 했던 것 처럼, 물음표(?)를 이용해서 input( ) 함수가 무엇인지 한번 살펴보자. 

 

 

몇 가지 예제를 통해 input( )함수의 기능을 이해해 보자.

 

input( ) 함수의 가장 기본적인 형태는 아래와 같다. 다음과 같이, name=input( )이라고 입력하고 실행해 보자.

실행되면, 아래 그림과 같이 박스가 나타나고, 데이터를 입력할 수 있도록 박스 내에 커서( | )가 깜빡이는 것을 볼 수 있다.

 

 

실제로 Jang 이라고 타이핑한 다음에 Enter 키를 입력한 후에 Enter 키를 누르자.

그럼 다음과 같이 화면이 바뀐다. 

 

여기서, name 값을 print( ) 해 보면, 직전에 입력했던 데이터가 name 변수에 저장되어 있음을 확인할 수 있다. 

 

결국, 우리가 살펴봤던 name=input( ) 이라는 명령어는 "사용자로 부터 입력된 데이터를 name 변수에 저장하는" 연산  또는 기능임을 알 수 있다. 참고로, 여기서 name에 저장되는 값은 input( ) 함수의 수행결과로서 input( )함수가 사용자에게 되돌려 주는 (반환하는, return 하는) 값이다. 

 

결론적으로, [문제2]에 대한 코드와 실행화면, 결과화면을 보이면 아래와 같다.

 

[그림] 코드와 실행중 화면
[그림] 코드 실행 결과 화면

 

사용자에게 조금 친절하게 (friendly) 코드를 바꿔보자.

 

input( )함수의 인수로 문자열을 넣어주면 데이터 입력을 기다리는 커서 앞에 그 문자열이 사용자에게 보내는 메시지로서 나타나게 된다. 커서가 그냥 깜빡깜빡하는 것 보다는, "이름을 넣어주세요 :" 라는 메시지 뒤에서 깜빡이는게 사용자와의 커뮤니케이션을 좀 더 용이하게 하는 측면이 있다. 아래의 코드를 보자.

 

 

사용자로 부터의 입력을 기다리는 메시지로 사용되는 ' Enter your name :' 과 같은 문자열을 프롬프트(prompt)라고 부른다.

 

○ input( ) 함수와 형 변환 (type casting) : int( ), str( )

 

input( ) 함수를 사용함에 있어서, 한가지 유의해야 할 사항이 있다. 그것은, 다음 실행화면에서 보다시피, 입력된 데이터의 값이 항상 문자데이터(string)이 된다는 것이다. 

 

 

In[1]에서 어떤 하나의 숫자값을 입력받고자 했고, 사용자로 부터 11이라는 값을 입력받았으나, In[2]에서 보듯이 그 데이터는 str (string, 문자열) 데이터 타입이다. 여기서, type( )도 파이썬의 내장함수이다. 함수의 인자로 변수명을 넣어주면 그 데이터의 타입을 알려준다. 

 

여기서, 잠시 type( )함수와 파이썬에서 다루어지는 데이터들의 타입을 한번 살펴보고 지나가자.

 

 

우리가 현재까지 다루어본 데이터의 유형에 대해서 정수 데이터는 파이썬에서 int  (integer 의 준말), 실수는 float (floating point 의 준말, 부동소수점), 1개 문자이든 여러개 문자이든 문자는 모두 str (string의 준말, 문자열), True와 false 같은 불리언 상수는 bool (boolean의 준말)로 표시된다는 것을 확인할 수 있다. 

 

다시 원래의 얘기로 돌아가서, input( )함수에서 반환되는 값의 타입이 항상 문자열이다 보니, 필요에 따라 우리가 원하는 데이터 타입으로 변환시켜 줄 필요가 있다. 이러한 변환을 형변환 (type casting)이라고 부른다. 

 

우리의 예제에서 사용자가 11이라는 데이터를 키보드로 부터 입력했는데, 사용자는 과연 11이라는 숫자데이터를 입력했을까? 아니면 11이라는 글자 데이터를 입력했을까? 이런 혼란을 없애기 위해 파이썬은 input( ) 함수를 통해 입력되는 모든 데이터를 문자 데이터로 본다. 원래의 사용자 의도에 맞는 데이터로의 변환은 사용자 책임인 셈이다. 

 

데이터 변환과 관련된 몇 개의 형변환 함수가 있다. 이를 예제를 통해 살펴보면 다음과 같다. 

 

먼저 int( ) 함수는 문자열이나 불리언 데이터를 숫자로 바꿔주는 함수이다. 물론, 여기서의 문자열은 숫자를 나타내는 글자 (0, 1, 2.... 9) 들의 조합으로 만들어진 문자열을 말한다. 예를 들어, '11', '345', 902' 등과 같은 문자열을 말한다. 참고로, '123a'와 같이 숫자심볼 이외의 문자가 포함된 문자열은 숫자로 변환될 수 있는 문자데이터가 아니다. 

 

int( ) 함수를 이용하여 불리언 데이터를 숫자 데이터로 변환시켜 주는 예는 다음과 같다.  아래의 예를 보면, True는 1로, False는 0으로 변환되는 것을 확인할 수 있다. 이진수에서 1은 신호가 있다는 뜻으로, 0은 신호가 없다는 뜻으로 사용되고 있음을 연상하면 좋겠다. 

 

부동소수점 상수를 int( ) 함수를 이용해서 정수로 변환시킬 수 있다. 실수의 소숫점 이하를 버림 (round down) 한다.  아래의 예를 참고하면 좋겠다.

 

반대로, 여타의 데이터를 문자열 데이터로 변환하는 작업이 필요한 경우가 많다. 이런 경우를 위해 str( )함수가 내장함수로서 제공되고 있다. 위의 int( ) 함수와 동일하게 작동한다. 몇개의 예를 보이면 다음과 같다