입력값을 가지고, 특정 작업을 수행한 다음에 결과물을 내어 놓는 것이 함수입니다. 프로그래밍을 하다 보면 동일한 내용을 반복해서 작성하는 경우가 있습니다. 이렇게 '특정한 목적의 작업을 수행하며 재사용성이 큰 부분'을 묶어 함수로서 작성할 수 있습니다. 예로 두 수의 합이나, 두 수의 몫과 나머지를 구하는 것 등을 함수로 정의할 수 있습니다.

함수 정의하기

간단하게, 두 수를 입력받아 합을 리턴하는 함수를 작성하겠습니다.

Python에서는 함수를 정의하기 위해 def라는 키워드를 사용하며, 각 함수에는 이름0개 이상의 인자를 명시해야 합니다. def [func_name](params) 형태이며, 이를 함수의 signature라고 합니다. 위 함수의 이름은 sum이며, 입력 인수는 a와 b로 2개이고, 리턴 값은 a + b입니다. 따라서 sum(1, 5)의 결과값은 6이 됩니다.

위의 sum(1, 5)와 같은 구문을 함수 호출이라고 부릅니다. 함수의 이름 뒤에 소괄호를 붙이고, 인자를 필요로 하는 경우에는 콤마(,)로 구분하여 전달합니다. 함수를 호출하게 되면 도로에서 차선을 이동하듯 제어가 넘어가고, 함수가 종료되면 다시 제어가 되돌아옵니다.

Python의 함수는 0개 이상의 인자를 받고, 0개 이상의 값을 리턴할 수 있습니다. 그러므로 함수의 리턴은 있을 수도 있고 없을 수도 있으며, 여러 개의 값을 리턴할 수도 있습니다.

리턴이 없는 함수

위의 say_hello 함수는 아무 인자도 받지 않고, 'hello'를 출력하며 리턴이 없습니다. 그러나 함수의 리턴 값은 None으로 처리됩니다. 함수에 리턴이 없다면, 자동으로 return None 처리가 되는 것입니다.

여러 개의 값을 리턴하는 함수

위의 divmod 함수는 두 개의 인자를 받고, floor div의 결과값(몫)나머지를 리턴합니다. Python은 함수에서 2개 이상의 값을 리턴할 경우 Tuple 타입으로 처리되며, 따라서 위의 예처럼 함수의 리턴 값을 unpacking할 수 있습니다.

함수 인자의 기본값

함수의 인자에 기본값을 설정할 수 있습니다.

함수 호출 시, 위처럼 기본값이 설정된 인자(a, b)에 별도로 값을 전달하지 않으면 기본값으로 처리됩니다. 인자를 전달하든 전달하지 않든 상관 없으므로, 기본값이 설정된 인자를 선택 인자라고 부릅니다. 위 함수의 경우 a와 b 모두 기본값이 0으로 설정되어 있고, 따라서 sum()처럼 별도의 인자 전달 없이 호출하면 a와 b 모두 기본값인 0을 갖습니다.

함수 인자의 종류

위에선 함수 호출 시 모든 인자를 순차적으로 전달했고, 이를 위치 인자로 부릅니다. 인자를 키워드와 함께 명시적으로 전달할 수도 있으며, 이를 키워드 인자라고 부릅니다.

만약 전달된 모든 문자열을 이어붙여 리턴하는 함수를 작성하려면, 인자의 갯수가 동적이어야 합니다. 이를 위해 가변 인자(variable argument)를 사용합니다.

변수 앞에 asterisk(*) 기호를 붙이면, 해당 변수는 가변 인자로 관리되며 전달된 인자들은 Tuple로 처리됩니다. 따라서 위 함수는 인자의 갯수가 자유롭습니다. 위치 인자를 가변적으로 받으며 이를 튜플로 처리하므로, 이를 가변 위치 인자 튜플이라고 부릅니다. 키워드 인자도 가변으로 정의할 수 있는데, 아래처럼 변수 앞에 asterisk(*)를 두 개 이어붙이면 됩니다.

해당 변수는 가변 인자로서 관리되며 전달된 인자들은 Dictionary로 처리됩니다. 따라서, 함수의 인자는 아래 4종류가 있습니다.

  • 필수 인자
  • 선택 인자
  • 가변 위치 인자 Tuple
  • 가변 키워드 인자 Dictionary

함수에 이 4종류의 인자를 모두 사용하는 경우, 위치 인자 - 키워드 인자 - 가변 위치 인자 튜플 - 가변 키워드 인자 딕셔너리 순으로 정의해야 합니다. 이 순서를 지키지 않을 경우, 인자 할당에 애매함이 생기므로 가변 인자는 맨 뒤쪽에 정의해야 문제가 생기지 않습니다.

'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] 값으로서의 함수와 lambda  (0) 2018.06.27
[Python] docstring  (0) 2018.06.26
[Python] pass statement  (0) 2018.06.24
[Python] 반복문 - while  (0) 2018.06.23
[Python] 반복문 - for  (0) 2018.06.22

pass'아무 것도 하지 않게'하는 키워드입니다. continue는 현재 루프를 건너뛰고 다음 순번으로 넘어가도록 하지만, pass는 수행할 코드가 없다는 것을 명시적으로 나타내주기 위한 역할을 합니다. null statement라고도 표현합니다.

위와 같이 if, for, while에 모두 적용 가능하며, 이후 배울 함수클래스에도 pass statement를 적용할 수 있습니다. 콜론(:)과 들여쓰기로 표현되는 코드 블럭이라면 모두 적용할 수 있다는 것입니다.

'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] docstring  (0) 2018.06.26
[Python] 함수  (0) 2018.06.25
[Python] 반복문 - while  (0) 2018.06.23
[Python] 반복문 - for  (0) 2018.06.22
[Python] 조건문 - if  (0) 2018.06.21

while조건식이 속해 있는 반복문입니다. 조건 반복문이라고도 부릅니다. 아래 코드는 무한루프를 발생시킵니다.

위처럼 while [condition] 형태로 반복문을 표현하며, condition이 True인 동안 블럭 내부의 코드를 반복하며 실행합니다. while문을 이용해 1부터 100까지의 수를 누적하여 출력하는 코드를 작성하겠습니다.

사실 이 코드는 for문으로도 표현 가능합니다.

대부분의 while문은 이처럼 for문으로 대체 가능하며, for문은 비교적 더 간결하고, iterable 자료형을 쉽게 다룰 수 있기 때문에 더 유연하기도 합니다. 대부분의 스타일 가이드에서도 while보단 for를 장려하고 있으니, while을 통해 코드를 매우 직관적으로 작성할 수 있는 상황이 아니라면 for를 사용하는 편이 더 좋습니다.

break, continue statement

while문도 반복문으로 분류되므로, for처럼 breakcontinue를 사용할 수 있습니다.

while - else

for-else가 있는 것처럼, while문에서도 else를 사용할 수 있습니다. for에 붙은 else는 for가 break되지 않고 정상 종료되었을 때 해당 블럭의 코드가 실행되는 것처럼, while의 else도 조건식이 거짓인 경우(while이 break되지 않고 정상 종료될 때) 해당 블럭의 코드가 실행됩니다.

'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] 함수  (0) 2018.06.25
[Python] pass statement  (0) 2018.06.24
[Python] 반복문 - for  (0) 2018.06.22
[Python] 조건문 - if  (0) 2018.06.21
[Python] Iterable 자료형 - Dictionary, Set  (0) 2018.06.20

+ Recent posts