티스토리 뷰

 

 본 포스팅은 코딩을 처음 배우시는 입문자 분들께는 적절하지 않은 포스팅일 수 있습니다.

 

 개발에 필요한 최소한의 내용만 정리해서 포스팅합니다.

 

 

 


Summary 📜


  • 파이썬 함수에 대한 이해 
  • 파라미터 종류 및 순서에 대한 이해 

 

 

 

함수 (Function) 📈


 내 생각이지만, 재사용의 시작은 함수로 시작되었다고 본다. 반복되는 행동을 정의하고, 속성을 정리하여 확장한 것이 클래스라고 생각하면, 함수와 클래스는 개발과 설계의 꽃이라고 해도 과언이 아니지 않을까?  중요성은 이 포스팅을 보는 모든 독자분들이 아실 것이기에 간단히 정의만 두고 가보자. 함수는 특정 목적을 수행하기 위한 코드의 집합이다.

 

 

함수의 종류 📈📉


 무언가를 행동하기 위해서, 사전에 필요한 것이 있을 수도 있고, 끝난 뒤에 결과가 보이는 것도 보이지 않는 것도 있다. 함수의 관점으로 다시 해석을 하자면, 사전에 인자(파라미터)가 필요할 수도 있고, 결과 값이 있을 수도 있다.

즉, 시작전의 파라미터의 유무와 종료 전의 리턴 값의 유무에 따라 4가지 형태의 함수가 존재할 수 있다.

  •   인자가 없고, 리턴값도 없다.
  •   인자가 없고, 리턴값이 있다.
  •   인자가 있고, 리턴값이 없다.
  •   인자도 있고, 리턴값도 있다.

 

함수의 선언 🔊


 파이썬에서 함수는 다음과 같은 형태로 선언된다. def 키워드로 함수임을 알리고, 콜론(:)을 통해 함수 내부 블럭을 시전 한다.  

## 함수 내부에 들어가는 코드들은 반드시 한줄을 띄워야한다.
def 함수명 ([파라미터,...]) :
	실행코드
	[return 반환값]

이때, 함수 내부 코드는 텝을 한칸 띄어야 한다. 파이썬에서 띄어쓰기는 문법이므로, 주의하자!

 

 

 파이썬은 자바나 C 계열 언어와 달리 함수 정의가 매우 간결하다. 반환형을 함수 헤더에 표시하지도 않으며, 자료형 선언도 하지 않기 때문이다. 함수 내부에서도 반환 값이 없다면, return키워드를 사용하지 않으면 된다. 파이썬에서 함수 내부를 띄어쓰기로 구분하기 때문에 return이 없어도 가능한 것으로 보인다.

#함수내부 블럭을 2번째 코드까지로 판단하므로 오류가 나지않음 
def myFirstFun():
	print('Hello Python')

print('아무런 지장이없다.')
myFirstFun()

 

 

함수의 파라미터 💡


 '파라미터가 뭐라고 이렇게 파트를 나눠서 설명해 ?' 라고 생각할 수 있다. 그러나 생각보다 파이썬은 파라미터를 통해 다양한 기능을 지원한다. 

 

1] 고정 파라미터 📕

 함수 호출을 위해 반드시 필요한 파라미터이다. 고정 파라미터의 의미는 해당 함수를 이용하기 위해, 반드시 필요한 요소를 의미한다고 할 수 있다. 타 계열 언어에서 보듯 가장 일반적인 함수 파라미터다.

 

def fixedParams(a,b,c,d):
    return print(a,b,c,d)

#필수적으로 파라미터를 넣어야 호출 할 수 있다.
fixedParams(1,2,3,4)

 

2] 파라미터 키워드 📔

 파이썬 파라미터는 호출 시, 키워드의 속성을 가지고 있다. 타 언어에서 함수를 사용할 때, 함수 파라미터 순서에 맞춰, 필요한 요소들을 넣어 준다. 그러나, 파이썬에서는 해당 파라미터가 키워드 속성을 가지고 있어서, 파라미터 순서를 변경해도 지장이 없다. '키워드=인자' 형식으로 사용한다.

 

def fixedParams(a,b,c,d):
    return print(a,b,c,d)

fixedParams(1,2,3,4)            #result : 1 2 3 4
#키워드를 이용하면, 아래와 같이 파라미터 위치를 다르게 넣을 수 있다.
fixedParams(d=1,c=2,a=3,b=4)    #result : 3 4 2 1

 

3] 가변 파라미터 📗

 자바의 가변 파라미터 처럼 사용할 수 있다. 최소 0개의 파라미터를 받는다. 변수명 앞에 아스타리스크(*)를 붙여 사용한다. 가변 인수가 함수로 들어오면, 함수 내부에서는 튜플로 인식된다. 또한 가변 파라미터는 반드시 고정 파라미터(일반 적인 파라미터)보다 뒤에 위치해 있어야 한다. 고정 파라미터는 필수적인 의미라면, 가변 파라미터는 선택적이라고 할 수 있다. 때문에 앞에 온다면, 고정 파라미터와 모호성이 발생하므로, 무조건 고정 파라미터 보다 뒤에 와야 한다!

 

def unfixedParams1(*b):
    print(b)

# 여러개의 인자를 받았을 때 튜플로 인식한다.
unfixedParams1(1,2,3)       # (1,2,3,)
    
# ,로 자료형을 구별하므로 리스트가 들어온다면, 튜플에 단 하나의 리스트가 들어온것으로 해석
unfixedParams1([1,2,3])     # ([1,2,3],)

# 변수에 *붙이면 unpacking 상태가 된다.
unfixedParams1(*[1,2,3])    # (1,2,3,)

 위 예제는 가변 파라미터를 추가했을 때, 내부적으로 변수가 어떻게 들어오는지 확인하기 위한 예제이다. 위에서 언급한 것과 같이 파라미터를 튜플로 묶어서 변수로 담는다. 콤마(,)를 기준으로 튜플에 담기 때문에 리스트를 넣는다면, 리스트가 하나의 튜플 요소가 된다. 따라서 리스트 요소를 하나의 인자로 받고 싶다면, 리스트를 unpacking 해야 한다.

 

 

4] 가변 키워드 파라미터 📘

 가변 파라미터도 고정 파라미터와 같이 키워드를 사용할 수 있다. 변수명 앞에 아스타리스크 두 개(**)를 붙인 형식으로 사용한다.  파라미터 위치는 가변 파라미터 보다 뒤쪽에 위치한다.

def unfixed_keyword_params(**keywords):
    if keywords :
        for key,value in keywords.items():
            print(key,' - ' , value, end=' ')
        print()
    else :
        print("인수가 없어용")

unfixed_keyword_params() # 인수가 없어용
#키워드 가변 파라미터 사용
unfixed_keyword_params(username='jsik') # username  -  jsik
#가변이므로 여러개를 사용할 수 있음
unfixed_keyword_params(username='제이식',age=20) # username  -  제이식 age  -  20
#dic형태로도 사용이 가능하다.
unfixed_keyword_params(**{'username':'jsik','age':21}) # username  -  jsik age  -  21

 고정 파라미터는 하나의 파라미터에 대한 하나의 키워드만 존재하지만, 가변이기 때문에 여러 개의 파라미터에 대응하는 키워드가 필요하다. 때문에 딕셔너리 형태를 사용한다. 따라서, 고정 키워드 형태로 사용할 수도 있지만, 3번째 경우와 같이 딕셔너리 형태로 사용할 수도 있다. 단, 딕셔너리를 사용할 땐, 아스타리스크 두 개(**)를 붙여 사용해야 한다.

 

 

5] 디폴트 파라미터 📙

 자바에 없어서 답답했던 그것!! 파이썬에서는 디폴트 파라미터를 지원한다! 해당 파라미터를 생략해도, 자동으로 기본값으로 설정된 값이 들어간다. (당연히 입력하면, 해당 인자가 파라미터 값으로 들어간다.) 디폴트 파라미터는 반드시 오른쪽부터 정의해야 한다. 생략이 가능하기 때문에 왼쪽부터 가변 파라미터를 정의하면, 모호성이 생기기 때문이다.

 

def default_param2(a,b=20):
    print((a+b))


# 전달하지 않으면 생략가능
default_param2(10) # 10+20 = 30
# 전달하면, 기본값이 아닌 입력값으로 변수 설정
default_param2(10,30) # 10+30 = 40

 

 

파라미터들의 순서 📐


 누구는 누구보다 뒤에 들어가고, 누구는 누구보다 앞에 들어가고 헷갈릴 수 있다. 각 파라미터들의 위치를 판단하는 방법은 간단하다. 필수적으로 들어가야 할 값들은 왼쪽으로 배치되고, 오른쪽으로 밀려날 수 록 선택적 사항이라고 생각하면 편하다. 순서는 아래와 같다.

 

고정 (키워드) 파라미터 > 가변 파라미터 >  디폴트 파라미터 >가변 키워드 파라미터

 언뜻 보면, 디폴트 파라미터가 왜 저렇게 애매한 위치에 있지?라고 생각할 수 있다. 고정 파라미터보다는 밀리지만, 가변적인 키워드보다는 당연히 높을 수밖에 없다.(디폴트 일 뿐, 사용하지 않는 것은 아니니까!)  그런데 왜 가변 파라미터 보다 순위가 밀리는 것일까? 이유는 간단하다. 가변 파라미터가 존재하는 상태에서 디폴트 파라미터를 사용하려면, 디폴트 파라미터의 정의에 따라 오른쪽부터 정의되어야 하기 때문에 가변 파라미터 보다 뒤쪽으로 밀린 것이다! 원리를 이해한다면, 어렵지 않게 순서를 파악할 수 있으니, 잘 생각해보자.

 

 

아래의 예제는 종합적으로 모든 파라미터를 적용한 예제이니, 참고하자

#가변 파라미터와 섞는 경우
def param_final1(name,age,*info,recommand='없음',**args):
    result ="사용자 이름 : {} 나이 : {} ".format(name,age)
    if info :
        result+= '정보 : '
        for i in info:
            result += i + ' '

    result += "추천인 : " + recommand

    if args :
        result += '\n 비고 : '
        for key ,value in args.items():
            result += " {} - {} ".format(key,value)

    print(result)

param_final1('Jsik',20)
param_final1('Jsik',20,recommand='시끄당')
param_final1('Jsik',20,'배고픈 상태가 강함','헬스장 일찍닫는거 싫음',like='귀여운거미침',**{'status':'좋음'})

 

 

 

람다 함수 (lambda 함수) 📌


 나도 그랬지만, 제대로 람다를 모르는 사람들은 지레 겁먹을 수 있는 함수이다. 형태도 뭔가 너무 짧고, 처음 구현하려고 하면 굉장히 막막한 함수다.(필자는 처음 람다를 보았을 때 그랬다. 저 기괴한 코드는 무엇인고.... 하면서 자바 컬렉션에서 고통받았다고 한다.) 하지만 알고 나면 람다 함수로 쓸 수 있는 것은 죄다 쓰게 된다.

 

 람다란, 함수형 프로그래밍 언어에서 사용되는 개념의 익명 함수다. 자바 기초 때, 스레드를 사용하거나, 인터페이스를 사용하다 보면, 익명 함수를 종종 쓰게 된다. 써본 경험자들은 알 테지만, 코드의 사족이 너무 많다. 람다 함수는 이러한 사족을 떼어내어 핵심만 가진 표현식이라고 할 수 있다. 그래서 코드도 간결하고, 가독성 역시 높은 장점이 있다.

 

그럼 모든 함수는 람다 함수로 표현될 수 있는가? 

 그것은 아니다. 람다 함수로 표현하기 위해서는 특정한 형태의 함수만 가능하다. 함수의 종류 중 4번째인 파라미터가 존재하고, 리턴 값이 존재하는 경우에만 가능하다. ' y=f(x) '형태의 완벽한 함수면 된다고 생각하면 된다.(자바에서는 함수형 인터페이스라는 조건으로 많이 설명하기도 한다.) 

 

이해를 돕기 위해 예제를 가져왔다.

 

def fun(a):
    print('a는',a)
fun(10) #a는 10

print((lambda a : 'a는 %s'%(a))(10)) #a는 10

자바 인터페이스와 같은 예제를 가져오려고 했으나.. 애초에 파이썬엔 익명 함수를 자바처럼 구현을 할 수가 없다;; 하지만 위의 예제처럼 3줄의 코드를 단 한 줄로 줄여버리는 간결함을 보여준다.

 

아래와 같이 초기화를 할 수도 있다.

mylist=list(map(lambda i : i%2+1,[i for i in range(20)]))
print(mylist) #[1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2]

 

파이썬에선 람다를 자주 쓰니 반드시 형태를 잘 익혀 놓도록 하자!

결론 🔑


파이썬에는 오버로딩의 개념이 없는데, 공부해보니 없는 것이 다양하다. 파라미터가 너무나도 다양하기 때문에 오버 로딩할 이유가 없다. 자바 때 람다를 익히니, 파이썬에서도 비슷한 것 같은데, 안 그래도 짧은 코드가 람다로 인해 더 줄어서 편한 느낌은 확실히 있는 듯하다. 

 

 

References 📑


 

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함