본문 바로가기
Study/Python

[기초문법] 사용자 정의 함수 , lambda 함수

by 까망우동 2023. 2. 28.
반응형

Index

    사용자 정의 함수는 필요에 따라 만들어서 사용할 수 있는 함수다.  아래와 같이 def 키워드로 시작하여 함수 이름과 괄호 안에 parameter를 지정하고, 함수 내에서 수행할 작업은 콜론(:) 다음에 들여쓰기하여 작성, 결과를 반환하기 위해서는 return 키워드를 사용한다. 

     

    #사용자 정의함수 작성방식

    Python 에서 사용자 정의함수는 프로그래머가 필요에 따라 임의로 만드는, 재사용 가능한 코드 블록으로 아래와 같은 형식으로 작성한다. 

     

    def 함수이름(매개변수1, 매개변수2, ...):
        실행할 문장1
        실행할 문장2
        ...
        return 반환값

    def func(a,b):
        print(a,b)
        return a+b
    
    func(3,4) # 3 4
    print(func(3,4)) # 3 4 7
    print(func(a=5,b=3)) # 5 3 8

     

    #지역변수와 전역변수

     

    a = 1
    b = 2
    c = 3 
    
    def f1() :
        global b # b라는 변수가 global 변수임을 정의 
        b = 20 # 그렇기 때문에 global b 값이 20 으로 변함 
        c = 30 
        print('[1]',a,b,c)
    
    def f2() : 
        b = 300 # 지역변수기 때문에 global b 값은 20으로 유지 
        c = 400
        print('[2]',a,b,c)
    
    print('[3]',a,b,c)  # 1,2,3
    f1() # 1,20,30
    f2() # 1, 300, 400
    print('[4]',a,b,c) #1, 20, 3

     

    #Container 의 Unpack 활용 및 가변인자(*args, **Kwargs)

    사용자 정의함수에서 매개변수가 여러개일때, *을 활용하여 아래와 같이 container 의 unpack값으로 전달할 수 있다 

     

    def func(a,b):
        print(a,b)
    
    t = (3,4)
    l = ['abc',400]
    s = {'abc',400}
    d = {'b':10, 'a':20}
    
    func(t) # error 발생 : 입력 매개변수가 1개 뿐이라 
    func(*t) # 3 4
    func(*l) # abc 400 
    func(*s) # 400 abc : 순서 랜덤

     

    다만 container 가 dict 타입일땐, 아래와 같이 * , ** 에 따라 출력값이 달라진다. 

    아래 예시에서, *d는 딕셔너리 d의 key 값을 인자로 b,a 를 순선대로 전달하고 , **d는 key = value 형식으로 전달한다. 즉  func(a,b) 에서 a 에 해당하는 20 , b에 해당하는 10 값이 전달된다. 

     

    func(*d) # b a
    func(**d) # 20 10

     

    거꾸로, 아래 예시와 같이 매개변수 자리에 *args 써서 여러개 변수를 받게 하고 실제 def 안에서는 unpack 되기전의 contatiner 상태를 활용할 수 도 있다. (*args 를 가변인자라고 부르고, 임의 개수의 매개변수를 받기위해 사용한다 )

     

    def args_func(*args):
        for i, v in enumerate(args):
            print('결과:{}'.format(i),v)
        print('----')
    
    
    args_func("Lee") # 결과:0 Lee
    args_func('Lee', 'Park')
    args_func('Lee', 'Park', 'Kim')  # 결과:0 Lee  결과:1 Park  결과:2 Kim

     

    그렇다면 dict 에서는 어떻게 쓸까? **kwargs : 가변키워드인자 를 사용한다. **kwargs 를 통해서 임의 개수의 키워드 인자를 입력받을 수 있고, kwargs 라는 dictionary 객체가 함수내에 생성된다. 

     

    def kwargs_func(**kwargs):
        for v in kwargs.keys():
            print("{}".format(v), kwargs[v])
        print('-----')
    
    kwargs_func(name1='Lee')
    kwargs_func(name1='Lee',name2='Park',name3='Cho')

     

    정리하면 def의 매개변수의 개수와 형태가 어떻게 들어올지 모르는 상황에서, 아래와 같이 종합적으로 사용할 수 있다. 

     

    def func(arg_1,args_2,*args,**kwargs):
        print(arg_1,args_2,args,kwargs)
    
    func(10,"abc",1,2,3,4,'kim','park',age1=20,age2=20,age3=30)

     

     

    #Annotation 활용법

    Annotation은 함수의 인자와 반환값의 데이터 타입, 혹은 추가적인 설명을 주석 형태로 작성하는 것으로, 코드의 가독성을 높일 수 있다. 

     

    def add(a: int, b: 'b설명') -> int:
        """두 정수를 더한 결과를 반환합니다."""
        return a + b
    
    print(add.__annotations__)

     

    위 예시와 같이, 인자의 annotation은 인자 이름 다음에 : 을 붙인 뒤 데이터 타입이나 설명을 작성합니다. 반환값의 annotation은 함수의 인자들 다음에 -> 연산자를 사용하여 작성하며, 반환값의 데이터 타입이나 설명을 작성합니다.

     

    #Lambda 식  

    람다식은 이름없는 함수를 만드는 표현식으로, 함수명이 namespace 에 등록되지 않는 방식이다. 아래 예시와 같이 간단한 함수를 정의할때 주로 사용한다. 

     

    def add(x,y):
        return x+y
    
    add = lambda x,y:x+y
    
    # add(x,y) 에 대한 결과값 같음

     

    이름없이 함수를 만들기 때문에, 아래와 같이 변수에 직접 할당되어 사용하는게 가능하다. 

     

    numbers = [1, 2, 3, 4, 5]
    square = list(map(lambda x:x**2, numbers))
    print(square)

     

     

    반응형

    댓글