Language/Python

Phython study - 4th day

아르비스 2014. 4. 22. 11:32



1. 조건문(Condition Statements)



이번에는 조건문(Condition Statements)에 대해서 알아보도록 하겠습니다. 조건문이란 말 그대로 조건의 결과에 따라서 실행되는 문장이 결정됩니다. 파이썬에서의 조건문은 바로 if문으로, 이 if문을 사용하면 조건식이 참(True)이냐 거짓(False)이냐에 따라 실행되는 문장을 다르게 만들 수 있습니다. 우선은 if문의 구조부터 보도록 하겠습니다.

if 조건식:
   문장

위의 구조를 보시면, 조건식이 참(True)과 거짓(False)으로 나뉘는데 주로 논리 연산자나 산술 연산자 등이 많이 쓰입니다. 예를 들어서, '만약에 변수 a의 값이 5보다 클 경우~'라는 조건을 만들어주고 싶으시면 'if a > 5:'라고 써주시면 됩니다. 주의하실 점은, 조건식 뒤에 반드시 콜론(:)을 빼먹지 않고 적어주어야만 합니다. 파이썬은 괄호로 묶는 다른 언어와는 다르게, 들여쓰기로 영역을 구분합니다.


이 if문을 더 간단하게 설명하자면, 실생활에서 내일 친구의 집에 놀러가려고 하는데 만약 비가 온다면 놀러가지 못하는 것을 예로 들어보겠습니다. 이를 if문으로 표현하면 아래와 같을 것입니다.

if 내일 비가 온다:
   집에서 잠이나 잔다

더 쉽게 그림으로 이를 표현한다면 아래와 같을 것입니다.

<순서도(Flow Chart)를 통한 예>


위 순서도를 보았을 때, 내일 비가 온다는게 조건으로 주어지면 비가 왔을때 집에서 잠을 자고, 비가 오지 않았을때는 조건에 해당하는 문장이 실행되지 않기 때문에 집에서 잠을 자지 않습니다. 이번에는 조건문에 대한 이해를 위하여, 직접 if문 이용하여 코드를 작성해보도록 하겠습니다.

>>> money = 1000
>>> if money >= 500:
	print("돈이 500원 이상 있습니다.")
돈이 500원 이상 있습니다.

위 코드를 보시면 변수 money가 1000이란 값을 지니며, 아래에 조건문으로 '만약에 변수 money의 값이 500 이상일 경우'에 '돈이 500원 이상 있습니다.'라는 문장을 출력하도록 했습니다. 만약, money의 값이 500 미만이였다면 조건식이 거짓이 되어 돈이 500원 이상 있다는 문장은 출력되지 않습니다. 이번에는, 조건에 해당하지 않을 경우에도 문장을 출력해보도록 해볼까요?


2. else문


방금 예제에서 if문만으로 무언가 부족하다는 느낌이 들죠? 파이썬에서는 어떠한 조건에 해당하지 않는 경우에 대해서 처리를 할 수 있도록 'else'문이라는 것이 존재합니다. 우선은 if~else문의 구조를 보도록 합시다.

if 조건식:
   문장
else:
   문장

위의 구조에서 만약에 조건식이 참일 경우에는 if문 아래의 문장이 실행되고, 그 외의 경우는 else문 아래의 문장이 실행됩니다. 참고로 else문은 if문에 종속적이며, else문 홀로 쓰일 수 없습니다. 이어서 if~else문도 동일하게 순서도로 예를 들어보도록 하겠습니다.

<순서도(Flow Chart)를 통한 예>


위 순서도에서는 이번에는 비가 올 경우에는 '집에서 잠이나 잔다'가 실행되고, 비가 오지 않을 경우에는 '밖으로 놀러 나간다'가 실행됩니다. else문이 어떤 녀석인지 이해하셨나요? 이해가 그래도 잘 되지 않는다면, 아까 보았던 예제에서 else문을 덧붙여 코드를 수정하고 결과를 확인해보도록 합시다.

>>> money = 430
>>> if money >= 500:
	print("돈이 500원 이상 있습니다.")
else:
	print("돈이 500원 미만입니다.")
돈이 500원 미만입니다.

위 코드에서는 변수 money의 값이 430이니 500보다 미만의 값임을 알 수 있습니다. 'money >= 500'이란 조건은 money의 값이 500 이상이여야 성립되는 조건인데 값이 430이므로 거짓이 되어 실행되지 않습니다. 이 때, else문 위에 있는 조건에 해당하지 않으므로 else문 아래의 문장이 실행됩니다. 이렇게 if~else문을 통해서 간단하게 조건 판단을 할 수 있으나 조건이 늘어나면 점점 더 어려워지고 복잡해집니다. 여기서 if문과 else문 사이에 elif문이라는 녀석을 넣어 다양한 조건 판단을 할 수 있게끔 만들 수 있습니다.


3. elif문


파이썬에서 elif문은 한번만 사용할 수 있는 if문과 else문과는 다르게, if문과 else문 사이에 여러번 사용할 수 있습니다. 먼저 elif문의 구조를 살펴보고, 어떠한 녀석인지 같이 살펴보도록 합시다.

if 조건식:
   문장
elif 조건식:
   문장
else:
   문장

위의 구조를 살펴보시면, if문의 조건식의 결과가 거짓일 때 elif문의 조건식을 검사하며 이 조건식마저도 거짓일 때 아무런 조건에도 해당하지 않으므로 else문의 문장이 실행됩니다. if~elif~else문을 순서도로 표현하자면 아래와 같습니다.



<순서도(Flow Chart)를 통한 예>


위 순서도에서는 비가 온다면 집에서 잠을 자고, 비가 오지 않으면 친구가 집에 있는지 확인합니다. 만약에 친구가 집에 있다면 친구 집으로 놀러가고, 없다면 집에서 놉니다. 여기서는 '비가 온다'가 if문에 해당하는 부분이며, '친구가 집에 있다'가 elif문에 해당합니다. elif문에 대해서 이해가 안되시면, 코드를 우선 보고 어떨때 사용하는 녀석인지 감을 잡도록 합시다.

>>> money = 500
>>> if money > 500:
	print("가지고 있는 돈이 500원보다 많습니다.")
elif money == 500:
	print("가지고 있는 돈이 500원입니다.")
else:
	print("가지고 있는 돈이 500원보다 적습니다.")
가지고 있는 돈이 500원입니다.

위 코드에서는, 먼저 money의 값이 500보다 큰지 검사합니다. 변수 money의 값은 500이므로, 500보다 크지않아 elif문으로 넘어갑니다. elif문에서는 money의 값이 500과 같은지 검사하는데, money의 값과 500이 서로 같으므로 '가지고 있는 돈이 500원입니다.' 라는 문장을 출력합니다. 그리고 마지막의 else문은 하나라도 조건이 해당하는게 있으므로 실행되지 않습니다. 간단하죠? 참고로 파이썬은 블록을 들여쓰기로 구분하므로, 들여쓰기가 잘못된 경우에는 에러가 발생할 수 있으니 주의하세요.



4. 반복문(Loop)



오늘은 반복문(Loop)이라는 것에 대해 알아보도록 하겠습니다. 반복문, 쉽게 생각하면 이름 그대로 반복에 사용되는 녀석입니다. 파이썬에서 지원하는 반복문에는 조건문이 참인가 거짓인가에 따라 반복을 진행하는 while문이라는 것이 존재하고, 리스트나 튜플같은 순서형 자료의 아이템을 하나씩 가져오면서 반복을 수행하는 for문이 존재합니다. 이 두가지에 대해서 간단히 알아볼 계획인데, 이런 반복문을 통해서 비슷한 작업을 수없이도 반복하는걸 이 반복문을 통해서 간단히 해결할 수 있습니다. 먼저 while문에 대해서 먼저 알아보도록 하겠습니다.


5. while문


앞에서 소개한대로 while문은 조건식을 가지는 녀석입니다. 조건식이 참이라면 while문 내부에 있는 블록의 문장을 실행하고, 거짓이면 반복을 멈추고 빠져나옵니다. 우선은 while문의 형태를 먼저 보도록 합시다.

while 조건식:
	문장

위를 보시면 while 다음에 조건식이 오며, 조건식 뒤에는 콜론(:)이 따라붙는다는 것을 알 수 있습니다. 우선은 while문의 간단한 예제를 보도록 합시다.

>>> while i <= 10:
	print(i, "번 출력되었습니다.")
	i += 1

1 번 출력되었습니다.
2 번 출력되었습니다.
3 번 출력되었습니다.
4 번 출력되었습니다.
5 번 출력되었습니다.
6 번 출력되었습니다.
7 번 출력되었습니다.
8 번 출력되었습니다.
9 번 출력되었습니다.
10 번 출력되었습니다.

위의 예제를 보시면 조건식에 'i <= 10'이 왔음을 보실 수가 있습니다. 이는 변수 i의 값이 10보다 작거나 같은 경우에 참이 성립되며, 10보다 큰 경우는 거짓에 해당합니다. 그리고 'i += 1'과 같은 코드는 i의 값을 1만큼 증가시키는 'i = i + 1'를 축약한 코드로, 반복문을 빠져나오도록 하기 위해 작성된 코드입니다. 만약에 while문의 조건식이 처음부터 거짓이면 내부 블록에 있는 문장이 단 한번이라도 실행되지 않습니다. 왜냐하면, while문의 실행 순서는 '조건식을 검사 -> 내부 블록에 있는 문장을 실행 -> 조건식을 검사 -> ...'이러한 순서를 따르기 때문입니다.

위의 while문을 순서도로 나타내면 위와 같을 것입니다. i가 10보다 커지는 순간 거짓으로 넘어가서 반복문을 빠져나와 버립니다. 이해가 되셨나요? 만약에 'i = i + 1'과 같은 구문이 없다면, 조건식은 항상 참으로 성립하게 되어 반복문을 빠져나올수 없을 것입니다. 이렇게 되면 무한 루프에 빠지게 되는데, 무한 루프란 말 그대로 무한히 반복한다는 것입니다. 이런 상황을 피하기 위해서 i의 값을 증가시켜 주는 것입니다.


6. break문


이번에는 break문의 설명을 위해 위의 예제를 약간 수정해보도록 하겠습니다.

>>> while i <= 10:
	if i == 7:
		break
	print(i, "번 출력되었습니다.")
	i += 1

1 번 출력되었습니다.
2 번 출력되었습니다.
3 번 출력되었습니다.
4 번 출력되었습니다.
5 번 출력되었습니다.
6 번 출력되었습니다.

저기 사용된 break문이 어떤 녀석이냐면, 이 문법을 통해 반복문은 조건식이 거짓이여야 반복을 멈추고 빠져나오는데 우리가 직접 반복문을 강제로 탈출하게 할 수 있습니다. 위 예제의 경우는 i가 10보다 커져야 반복을 빠져나오지만, 저기서는 i가 7일 경우에 break문을 만나 바로 반복문을 빠져나오게 됩니다. 간단하죠?


7. continue문


이번에는 continue문의 설명을 위해 위의 예제를 다시 한번 수정해보도록 하겠습니다.

>>> i = 0
>>> while i <= 10:
	i += 1
	if i % 2 == 1: continue
	print(i, "번 출력되었습니다.")

2 번 출력되었습니다.
4 번 출력되었습니다.
6 번 출력되었습니다.
8 번 출력되었습니다.
10 번 출력되었습니다.

예제에 사용된 continue문을 만나면, continue문 아래의 문장은 실행하지 않고 반복문의 시작 지점으로 되돌아갑니다. 즉, 반복문의 조건을 검사하는 부분으로 다시 되돌아간다는 말입니다. 직접 코드를 따라가보면, i의 값이 처음에 0이고 반복문 내에서 i가 1이 증가하고 i를 2로 나누어 나머지가 1인지 검사를 하는 코드가 존재합니다. 만약 i를 2로 나눈 뒤의 나머지가 1이면 이것은 홀수라는 의미가 되며, 홀수는 continue문을 만나게 됩니다.


출력된 결과를 보시면 알겠지만, 홀수가 제외되어서 출력되었음을 확인하실 수 있습니다. 홀수는 continue문을 만나 시작 지점으로 되돌아가고 i의 값이 증가하기 때문에 그렇습니다. 반대로 짝수라면 continue문을 만나지 않고, 그 아래의 문장을 계속 수행해나가는 모습을 보실 수 있습니다.


8. for문


마지막으로 for문에 대해서 알아보도록 하겠습니다. 이 for문은 처음에 소개했던대로 튜플, 리스트, 사전, 문자열 등과 같은 순서형 자료가 올 수 있습니다. 우선은 for문의 형태를 보고나서 다시 for문에 대해 알아보도록 하겠습니다.

for 변수 in 순서형 자료:
	문장

이 for문은 순서형 자료(리스트, 튜플 등)의 요소를 하나하나씩 가져와서 변수에 넣습니다. 우선 리스트를 가지고 for문을 이용한 예제를 보도록 하겠습니다.

>>> lst = [1, 3, 5, 7, 9]
>>> for i in lst:
	print(i)
	
1
3
5
7
9

위 예제를 보시면, 리스트 lst의 요소를 하나하나씩 가져와 변수 i에 넣어서 i의 값을 출력하고 있음을 보실 수 있습니다. 그리고 또한 for문에도 역시 break문과 continue문을 사용하실 수 있습니다.

>>> lst = [1, 2, 3, 4, 5, 6, 7, 8]
>>> for i in lst:
	if i % 2 == 1: continue
	if i == 6: break
	print(i, "번 출력되었습니다.")

2 번 출력되었습니다.
4 번 출력되었습니다.

위 예제의 for문 내부 블록을 보시면, i를 2로 나눈 뒤의 나머지가 1인 경우에 시작 지점으로 돌아가고 i가 6과 같으면 반복문을 탈출하게끔 작성해 두었습니다. 1, 3, 5는 첫번째 조건문에 의해 시작 지점으로 돌아가 출력이 되지 않은것이며, 6부터는 두번째 조건문을 만나 반복문을 탈출하여 이후의 문장이 수행되지 않는 것입니다.


9. range 함수


여기서 range 함수를 for문에 이용할 수 있는데, range 함수는 숫자의 범위를 가지는 range 객체를 돌려보내며 이를 통하여 for문 내에서 위치를 가지고 요소를 가져오거나 변경할 수 있습니다. 한번 보도록 합시다.

>>> for i in range(10):
	print(i, end=" ")

0 1 2 3 4 5 6 7 8 9 

위 예제에서는 range(10)이 0에서부터 9까지의 범위를 지니는 range 객체를 만들어내며, 이 객체를 가지고 순차적으로 접근하여 값이 i에 담긴 뒤, 저장된 i의 값을 print문으로 출력하는 것입니다. 이를 리스트에서 응용하게 되면 아래의 예제와 같이 사용할 수 있을 것입니다.

>>> lst = [1, 2, 3, 4, 5]
>>> for i in range(len(lst)):
	if i % 2 == 0:
		lst[i] *= 2
	else:
		lst[i] *= -2
	print(lst[i], end=" ")

2 -4 6 -8 10 

위의 예제를 보시면, len 함수를 통해 리스트 lst의 요소 수를 구하고 이 요소 수를 통해 range 함수를 호출하여 요소 수 만큼 반복하게 됩니다. for문의 내부 블록을 보시면 i를 2로 나눈 나머지가 0인 경우, 즉 짝수인 경우에는 i번째 요소의 값에 2를 곱한 값을 저장하고, 홀수인 경우에는 i번째 요소의 값에 -2를 곱한 값을 저장합니다. 결과를 보시면 "2 -4 6 -8 10"과 같은 결과를 보실 수 있습니다. 위의 예제에서는 0~4의 범위를 지닌 range 객체를 만들어 낸것이라고 보면 됩니다. 이해가 잘 되지 않는다면 위 예제를 응용하여 한가지 예를 더 만들어보시면 range 함수가 어떤 녀석인지 이해를 하실 수 있을것 같습니다.


10. 반복문의 중첩


반복문의 중첩이란, 반복문 내에 반복문이 들어가는 것으로써 for문 내에 while문이 들어갈수도 있으며, while문 내에 while문이 들어갈 수 있는 등 여러 개의 반복문이 중첩되어 사용될 수 있습니다. 예를 들면, 반복문 중첩을 통해 구구단을 모두 출력할 수 있습니다.

>>> while i <= 9:
	j = 1
	while j <= 9:
		print(i, " * ", j, " = ", i * j)
		j += 1
	i += 1

2  *  1  =  2
2  *  2  =  4
...
9  *  8  =  72
9  *  9  =  81

위처럼 while문을 사용할 수 있으나, 아래처럼 for문을 사용할 수도 있습니다.

>>> for i in range(2, 10):
	for j in range(1, 10):
		print(i, " * ", j, " = ", i * j)

2  *  1  =  2
2  *  2  =  4
...
9  *  8  =  72
9  *  9  =  81

참고로 이렇게 두번만 중첩되는게 아니라 여러번 중첩될 수 있다는 사실을 기억해두시기 바랍니다.



11. 함수(Function)

 

 파이썬의 함수에 대해 알아보기 전에, 이미 어디선가 함수란 말을 들은 기억이 있지 않나요? 중학교 수학시간에 나온 '함수'는, 우리가 배울 파이썬의 '함수'와 비슷합니다. x의 값을 넣으면, y의 값이 정해지듯이 파이썬의 함수 역시도 값을 함수에 집어넣으면, 함수는 결과값을 되돌려줍니다. 예를 들어서, 어느 특정한 수를 넣으면 그 수의 절댓값을 돌려주는 신비의 상자가 있다고 합시다. 우리가 만약 -2라는 값을 이 상자에 넣으면, 꺼낼때는 2가 되어 나오는 것입니다. 그리고 4라는 값은 역시, 4 그대로 꺼내집니다. 이를 그림으로 나타내보도록 하겠습니다.

위의 박스는 어느 수를 넣으면 그 수의 절댓값을 돌려주는 기능을 합니다. 파이썬의 함수도 위에 나와있는 박스와 비슷합니다. 말하자면 특정한 기능을 수행하는 코드의 집합이며, 쉽게 말하면 여러 문장을 하나로 묶는 기능을 하는 녀석입니다. 우리는 이미, 7편을 읽기 전에 수많은 함수를 보아왔으며 간단하게나마 파이썬의 내장 함수를 사용하면서 함수가 어떤 녀석인지 알고 계시는 분들도 있으실 겁니다. 우선은 파이썬 내에서 함수를 정의하는 방법을 알려드리도록 하겠습니다.

def 함수명(인자1, 인자2, ...):
	문장
	...

위에서는 인자가 보조변수 같은 개념이며, 우선은 함수에 필요한 값을 저장해두는 임시 변수라고 기억하시면 되겠습니다. 이 말이 이해가 되지 않아도, 계속 함수를 정의하다보면 인자가 어떠한 역할을 하는지 감이 오실겁니다. (인자가 아에 존재하지 않을 수도 있고, 여러개가 존재할 수도 있습니다) 우선은 절댓값을 되돌려 주는 상자의 기능을 파이썬의 함수로 정의해보도록 하겠습니다.

>>> def absolute(n):
	if n < 0:
		n = -n
	return n

위의 코드를 잠시 살펴보면, 1행에서 함수명은 absolute이며 인자는 인자 n으로 1개를 가진다는 것을 알 수 있습니다. 2~3행에서는 n이 음수일 경우 양수로 만들어버리고 n을 반환합니다. 여기서 return문은 반환 즉, 돌려준다는 의미를 지니고 있습니다. return문을 만나면 함수가 끝나고, 함수를 호출한 곳으로 전달합니다. 이제 함수를 정의해봤으니, 정상 동작을 하는지 테스트를 한번 해봐야겠죠?

>>> absolute(3)
3
>>> absolute(0)
0
>>> absolute(-1)
1

정상적으로 값을 넘겨주면 절댓값이 돌아온다는 사실을 알 수 있습니다. 갑자기 문득 궁금해진건데, 만약에 값을 돌려주는 return문이 존재하지 않는다면 어떻게 될까요? absolute 함수에서 return문이 들어간 행만 지우고 다시 함수를 불러보세요. 그렇게 한다면, 아래와 같은 결과를 보실 수 있을겁니다.

>>> absolute(3)
>>> absolute(-1)

위 결과를 보시면, 아무런 값이 돌아오지 않는 것을 보실 수 있습니다. 함수 내에서 반드시 return문을 사용하지 않아도 되며, return문이 없을 경우에는 함수 내의 마지막 문장을 실행하고 함수를 호출한 곳으로 되돌아갑니다. 이 때, 함수는 None을 반환합니다. 한가지 예제만 더 보고, return문을 다시 보도록 합시다. 아래에 보여지는 예제에서는, 정의한 함수를 통해 두 수를 더한 결과를 돌려줍니다.

>>> def total(a, b):
	return a + b
>>> total(1, 5)
6
>>> total(100, 20000)
20100

위 예제에서는 total이란 이름을 지니고 인자 2개를 가지는 함수를 정의하고, 이 함수는 넘겨받은 두 인자의 값을 서로 더해 돌려주는 기능을 합니다. 3~6행을 보시면 정상적으로 두 값이 서로 더해져서 돌아온다는 것을 보실 수 있습니다. 함수에 대해 약간이라도 이해가 가셨나요? 한번 자기가 생각하는 간단한 기능의 함수를 직접 정의해보세요. 앞서 말한대로, 이어서 return문에 대해 추가적인 설명을 하도록 하겠습니다.

 

12. 2개 이상의 값 반환

 

return문은 위에서 이미 말했듯이, 값을 반환하며 함수를 종료하는 기능을 합니다. 우리는 함수를 통해 한개의 값을 반환해왔지만, 두 개 이상의 값을 반환할 수 있습니다. 사실을 말하자면, 반환값은 하나지만 튜플 형식으로 값을 돌려주는 것입니다. 한번 아래의 예제를 보도록 합시다. 

>>> def mul_div(a, b):
	return a * b, a / b
>>> mul_div(4, 5)
(20, 0.8)

위 예제에서는, a와 b를 곱한 값과 나눈 값을 튜플 형태의 값으로 반환하는 것을 보실 수 있습니다. 반환되는 튜플 값을 따로따로 저장하려면 아래와 같이 호출하시면 됩니다.

>>> def mul_div(a, b):
	return a * b, a / b
>>> mul, div = mul_div(4, 5)
>>> print(mul, div)
20 0.8

 

13. 스코핑 룰(Scoping rule)


여기서 스코핑 룰(Scoping rule)을 잠깐 설명을 드릴까 합니다. 이 스코핑 룰이 뭐냐면, 변수의 생존 범위에 관련된 규칙이라고 말할 수 있습니다. 말이 조금 이상하죠? 갑자기 스코핑 룰을 설명드리는 이유는 혹여나 나중에 변수를 사용하실 때 혼동을 겪으실 수 있기 때문입니다. 변수를 사용하기 위해서는 반드시 알아야 하는 규칙이라고도 할 수 있습니다.

 

파이썬에서의 함수는 별도의 이름공간(namespace)을 가지며, 이 이름공간이라는 것은 말 그대로 이름이 모여있는 공간을 말하는 것입니다. 예를 들어서, 변수를 선언하면 그 변수의 이름이 이름공간에 생성됩니다. 파이썬에서 변수명을 가지고 값을 얻어낼수 있던 것이, 이름공간에 있는 이름을 가지고 특정 객체에 접근하여 얻어오는 것이였습니다. 이름 공간은 총 3가지의 공간으로 나뉩니다. 함수 내부의 공간은 지역(Local) 영역이라 하고, 함수 외부의 공간은 전역(Global) 영역이라고 하고, 파이썬 자체에서 정의된 공간은 내장(Built-in) 영역이라고 할 수 있습니다. 여기서 이름을 검색하는 규칙은 지역, 전역, 내장 순서로 검색한다고 합니다. 이것을 첫 글자를 하나씩 따서 LGB 규칙이라고도 한답니다. 우선은 아래 예제를 하나 보도록 합시다. 

>>> n = 10
>>> def func(n):
	n = n * 10
>>> func(n)
>>> print(n)
10

위 예제에서 n을 10으로 초기화하고, 그 후에 func라는 함수를 정의하였는데 인자 목록에도 n이란 이름을 지닌 인자가 존재함을 알 수 있습니다. 4행에서 함수 func에 n의 값을 넘겨주고, 함수 print로 n의 값을 확인하였더니 여전히 10인걸 보실 수 있습니다. 이는 함수 내부에서 n이란 변수와 함수 외부에 있는 변수 n은 서로 다르기 때문입니다. 함수 내부의 인자 n의 값을 아무리 수정해도 외부에 있는 변수 n의 값은 변하지 않는거죠. 어찌보면, 당연한 상황일지도 모릅니다. 파이썬에서는 global이라는 키워드를 통해서 전역 영역에 있는 변수의 값을 수정할 수 있는데, 아래의 예제를 하나 더 보도록 합시다.

>>> n = 10
>>> def func():
	global n
	n = n * 10
>>> func()
>>> print(n)
100

위 예제에서 global로 변수 n을 선언하여, 전역 영역에 있는 변수 n의 값에다 10을 곱해버리는 함수 func를 정의한 것을 보실 수 있습니다. 함수 func를 호출하고 나서 내장 함수인 print로 n의 값을 출력하여 보았더니 10이 곱해진 결과를 얻어낼 수 있었습니다. 말씀드리는데, 스코핑 룰에 대한 부분은 반드시 이해를 하시고 넘어가시길 바랍니다.

 

14. 가변 인자 목록

 

우리는 지금까지 고정되어 있는 갯수의 인자만 받아올 수 있었습니다. 하지만, 인자의 갯수가 정해지지 않은 가변 인자를 전달하는 방법이 존재합니다. 그것은 바로 함수 인자 앞에다가 *를 붙이면 된다는 것입니다. 우선 형식을 보도록 합시다.

def 함수명(*인자):
	문장
	...

위 예제에서의 가변 인자 목록은 튜플의 형태로 저장이 됩니다. 우선 예제를 보도록 합시다.

>>> def func(*varl):
	for i in varl:
		print(i, end=' ')	
>>> func(1, 2)
1 2 
>>> func(4, 5, 6)
4 5 6 
>>> func(4)
4

위에서 varl가 튜플 형태로 처리되는 가변 인자 목록이며, 이를 for문으로 순회하여 요소에 접근하여 출력하도록 하는 함수 func를 정의했습니다. 주목하셔야 할 부분은 4행부터인데, 함수 func에 전달되는 인자의 수가 고정되어 있는게 아니라 유동적이라는 것을 보실 수 있습니다. 상당히 유용하죠?

 

15. 기본 인자값

 

함수의 인자에 기본 값을 지정해 줄 수 있습니다. 이는 우리가 직접 인자를 넘겨주지 않으면, 기본으로 설정된 값을 사용하는 것입니다. 아래의 예제를 우선 보도록 합시다.

>>> def mul(a, b = 10):
	return a * b
>>> mul(3)
30
>>> mul(4, 5)
20

위에서 보시면 함수 mul에서 인자 b의 기본값이 10으로 지정되어 있습니다. 만약 인자 b를 넘겨주지 않으면, 이 인자 b의 값은 기본값을 따른다는 것입니다. 3행처럼 3만 넘겨주면, a에 3이 들어가고 b는 기본값인 10이 들어가서 30이란 값이 돌아오는 것입니다. 5~6행은 두 인자 모두 넘겨주었기 때문에 기본값을 따를 필요 없이 두 인자의 값이 곱해져서 20이란 결과가 나온 것입니다. 간단하죠? 한가지 주의하실 점이 있다면, 기본값을 사용하려는 인자 뒤에 기본값을 사용하지 않는 인자가 올 수 없다는 것입니다. 이게 어떤 경우인지 예제를 통해 알아보도록 합시다.

>>> def mul(a = 10, b):
	return a * b
SyntaxError: non-default argument follows default argument

위의 예제에서 에러가 발생한 이유는, 기본값을 지정한 인자 a 뒤에 기본값을 지정하지 않은 인자 b가 존재하기 때문입니다. 이는 인자 a에 기본값을 지정하려면, 인자 b에도 기본값을 지정하여야 한다는 것입니다. 이점만 잘 알아두시면 될 것 같습니다.


저작자: http://blog.eairship.kr/