함수
파이썬에서 사용자 정의 함수는 def라는 키워드로 시작한다. 값을 반환하려면 return 키워드를 사용하면 된다는 점은 다른 프로그래밍 언어들과 마찬가지이다.
def myFunc0():
return '안녕'
파이썬의 함수는 사용하기 전에 정의되어 있어야 한다. 따라서, 다음의 코드는 잘못된 코딩이다.
myFunc1()
def myFunc1():
print( '나는야 함수라네~' )
일단 함수의 이름만 선언 해두고 함수의 바디 부분은 아직 구현하지 않았다면 어떻겠는가. 다른 프로그래밍 언어에서는 void myFunc(){ } 처럼 블록 안에 아무것도 안쓰면 그만이다. 그러나, 브레이스{} 통한 블록 구조를 배제해버린 파이썬의 경우에는 구문 해석 과정에서 오류가 발생한다. 그래서, 파이썬에는 pass라는 키워드가 등장하게 되었다. 즉, pass는 '아무 것도 안함'이라는 의미이다. pass 키워드는 if-else 구문에서도 처리할 것이 없을 때에 종종 사용된다.
def myFunc2():
pass
기본적으로, 파이썬에서 함수의 매개변수는 다른 프로그래밍언어들에서와 유사하다. 즉, 함수 이름 뒤에 괄호 사이에 매개변수를 나열해 주면 된다.
def myFunc3(param1):
print( '나는야 함수라네~' , param1)
def myFunc4(param1, param2):
print( '나는야 함수라네~' , param1, param2)
함수의 매개변수가 생략된 경우에 사용될 기본값을 지정해줄 수도 있다. 다음과 같은 함수의 경우 myFunc5(1) 또는 myFunc5(1,5)라고 호출할 수 있고, 두번째 매개변수가 생략된 경우 param2는 3이 된다.
주의해야 할 것은, 기본값을 가진 매개변수는 항상 뒤쪽에 써야 한다는 것이다. 논리적으로 생각해 보면 당연하다, 안그러면 파이썬 인터프리터가 헷갈릴테니까.
def myFunc5(param1, param2= 3):
print( '나는야 함수라네~' , param1, param2)
임의의 갯수를 갖는 매개변수도 있다. *는 C언어의 포인터가 아니다, 두려워하지 말자. 매개변수명 앞에 *를 붙이면 되는데, 이 매개변수는 튜플로 전달된다. 임의 갯수의 매개변수가 항상 뒤쪽에 와야 한다는 점에 주의하기 바란다.
def myFunc6(param1, param2, *args):
for i in args:
print(i)
print(param1) # 0
print(param2) # 1
print(type(args), args) # <class 'tuple'> (2, 3, 4)
myFunc6(0, 1, 2, 3, 4)
딕셔너리 타입의 임의 매개변수도 가능한데, 이때는 매개변수명 앞에 **를 붙여준다. 위의 경우와 마찬가지로, 임의 갯수의 매개변수가 항상 뒤쪽에 와야 한다
def myFunc7(**kwargs):
for i in kwargs:
print(i, '=', kwargs[i])
print(type(kwargs), kwargs) # <class 'dict'> {'three': 3, 'two': 2, 'one': 1}
myFunc7(one= 1, two=2 , three=3)
def myFunc8(param1, param2, *args, **kwargs):
pass
아래의 소스코드는 range() 함수와 비슷한 역할을 수행한다. 다만, range() 함수는 끝 값을 포함하지 않는 반면, 이 함수는 끝 값도 포함하도록 작성되었다.
#!/usr/bin/python3
# 레인지 함수와 유사하지만, 끝 값도 포함한다.
# by Elex (http://python.elex.pe.kr/)
def main():
for i in iRange(0 , 10, 2):
print(i, end=' ')
def iRange(*args):
# 매개변수의 갯수 따라 start, stop, step 변수에 값을 할당한다.
lengthOfArgs = len(args) # 매개변수의 길이
if lengthOfArgs < 1 :
raise TypeError('매개변수가 하나도 없네')
elif lengthOfArgs == 1: # 매개변수가 하나인 경우엔,
start = 0
stop = args[ 0]
step = 1
elif lengthOfArgs == 2: # 매개변수가 둘인 때에는,
(start, stop) = args
step = 1
elif lengthOfArgs == 3: # 매개변수가 셋인 경우에는,
(start, stop, step) = args
else:
raise TypeError('매개변수가 {}개라니. 너무 많네'.format(lengthOfArgs))
# 값을 증감시키면서 하나씩 반환한다.
i = start
while i <= stop:
yield i
i += step
if __name__ == "__main__": main()
yield 키워드는 return과 유사하다. 즉, 값을 반환한다. 하지만, 함수가 종결되지는 않고 계속 진행된다는 차이점이 있다.
raise 키워드는 예외를 발생시키는 역할을 한다. 개인적으로는 예외를 발생(raise)시키는 것보다는 던지는(throw) 것이 더 어감이 좋아 보이긴하다만...
댓글
댓글 쓰기