본문 바로가기
백엔드(Back-End)/Python

[Python] - 함수 - *args, **kwargs, 지역변수와 전역변수, Lambda Expression

by TwoJun 2022. 8. 20.

 

[Programming Language ] - Python

 

이번 포스팅에선 Python의 함수에서 여러 개의 매개변수를 받기 위해 사용할 수 있는 *args, **kwargs, 변수 선언 위치에 따라 활동범위가 달라지는 지역변수와 전역변수, 람다 표현식(Lambda Expression)에 대해 알아보도록 하겠습니다.

 

 

 

1. *args, **kwargs

1-1. *args

- *args는 사용자 정의 함수를 호출할 때 인자로 여러 개의 매개변수를 넘겨주기 위해 사용합니다.

- args는 인자 : arguments에서 따온 것이며 다른 키워드로 작성해도 무방하나 관례적으로 args를 많이 사용합니다.

- 일반 매개변수도 함께 주고자 하는 경우, Python은 일반 매개변수와 *args의 순서를 인식하지 못하므로 *args를 일반 매개변수보다 뒤에 위치시켜야 합니다.

 

- 아래 코드를 보며 *args가 사용되는 예시를 보겠습니다.

# *args
# 매개변수로 넘겨받은 정수를 모두 더하는 함수
def args_test(*args):
    # 매개변수로 받은 수들을 저장할 result 변수
    result = 0

    for count in args:
        result += count  
    return result 

print(args_test(1000, 20000, 30020))    #51020

 

 

- 위에서 언급된 것처럼 *args의 위치는 일반 매개변수 뒤에 위치시킵니다.

# *args는 일반 매개변수 뒤에 위치시킨다.
def args_test2(string, *args):
    print(string, args)

print(args_test2("사용자가 입력한 수 : ", 1000, 20000, 30020))  # 사용자가 입력한 수 :  (1000, 20000, 300020)

 

 

- 만약 순서를 지키지 않고 매개변수를 주게 된다면 의도하지 않은 결과가 출력되기에 반드시 매개변수로 넘겨줄 값들이 함께 존재할 경우 일반 매개변수의 뒤에 위치시켜야 합니다.

# 앞서 언급된 것처럼 순서를 지켜야 한다.
def args_test2(string, *args):
    print(string, args)

print(args_test2(1000, 20000, 30020, "사용자가 입력한 수 : "))  # 1000 (20000, 30020, '사용자가 입력한 수 : ')

 

 

 

 

1-2. **kwargs

- **kwargs는 *args와 역할은 비슷하나 함수에게 전달할 인자의 형태를 key : value 형태의 Dictionary 형태로 전달할 수 있습니다.

- kwargs는 keyword arguments에서 따온 키워드이며 *args와 마찬가지로 다른 키워드를 사용할 수도 있습니다.

- **kwargs, *args를 함께 사용하고자 하는 경우 **kwargs의 위치를 *args보다 뒤에 위치시킵니다.

- **kwargs 매개변수가 담긴 함수를 호출할 땐 전달 인자의 형태를 key = value 형태로 전달합니다.

 

- 아래 코드를 함께 확인해 보겠습니다.

# **kwargs
def input_string(**kwargs):
    print(kwargs)

input_string(name = 'wonjun1', age = 25)   # {'name': 'wonjun1', 'age': 25}

 

 

 

 

 

2. 지역변수(Local variable), 전역변수(Global variable)

2-1. 지역변수(Local variable) 

- Local scope, 즉, 지역 범위 내에서만 영향을 주고 받을 수 있는 변수가 지역변수입니다.

- 함수의 내부 scope에서 선언된 변수로, 사용범위는 함수의 블록 내에서만 가능합니다.

- 함수가 호출되어 실행되고 난 뒤 지역변수는 소실됩니다.

 

- global, nonlocal

- global : 해당 키워드를 통해 함수 내부에서도 전역변수에 접근이 가능합니다.

- nonlocal : 해당 키워드로 지역변수가 포함되지 않은 다른 함수에서도 지역변수에 접근할 수 있습니다.

# 예시 코드
a = 1  # 전역변수 선언

def var_test():
    result = a + 1   # 해당 변수는 지역변수, 함수 내부에서만 사용 가능
    return result

print(var_test())    # 4
print(a)       # 1

 

 

2-2. 전역변수(Global variable)

- Global scope, 즉, 특정 범위가 아닌 코드의 전체 범위에서 사용될 수 있는 변수를 의미합니다.

- 코드 전체의 모든 요소가 해당 전역변수에 접근할 수 있습니다.

# 전역변수
a =  10  

def var_test2():
    global a   # 함수 내에서도 전역변수인 a에게 접근하겠다는 의미
    a = a + 1
    return a

print(var_test2())   # 11
print(a)    # 11

 

 

 

 

3. Lambda Expression (람다 표현식)

- Lambda expression이란, 간단한 형태의 함수를 좀 더 직관적으로 표현식의 형태로 작성할 수 있는 방법입니다.

- 람다 표현식을 통해 함수명이 존재하지 않는 익명함수의 형태로 함수를 정의할 수 있습니다.

 

- 여기서 익명함수(Anonymous function)란, 함수명이 존재하지 않는 함수를 말하며, 함수명이 존재하지 않기에 특정한 변수에 함수를 저장합니다. 이렇게 만들어진 익명함수는 해당 변수를 통해 익명함수를 호출할 수 있습니다

 

- 간단한 로직을 가지고 있는 함수는 위와 같이 Lambda expression으로 정의하여 사용할 수 있지만 권장되지 않는 방법 중 하나입니다. 람다 표현식을 이용하여 함수를 정의할 수 있다라는 내용 정도만 알아두시고 def 키워드를 통해 사용자 정의 함수를 정의해 주시는 것이 좋습니다.

 

- def 키워드를 사용하지 않고 표현식의 경우는 lambda 키워드를 사용하여 함수를 정의합니다.

- 문법 :

  변수명 = lambda 매개변수: 수행 식

# Lambda expression
# 기존 def로 함수 선언
def number_add(a, b):
    result = a * b
    return result

# Lambda expression을 이용한 간단한 함수 작성
result_sum = lambda a, b: a + b
print(result_sum(10, 20))

 

 

리스트(List) 자료형에 람다 표현식을 사용하여 함수를 저장하고 인덱싱을 통해 함수를 호출할 수 있습니다.

# 리스트에 lambda expression 사용
numberList = [lambda num1, num2: num1 + num2, lambda num1, num2: num1 * num2]
print(numberList[0](10, 20) + numberList[1](30, 20))    # 630

 

 

 

이번 포스팅에선 Python의 함수의 여러 가지 매개변수를 다양하게 넘겨받는 *args, **kwargs와 함수를 정의하는 방법인 Lambda expression에 대해 알아보았습니다. 다음 포스팅에선 사용자 입출력(Input / Output)에 대해 알아보겠습니다.

 

======================================================================

해당 포스팅에 대해 내용 추가가 필요하다고 생각되면 기존 포스팅 내용에 다른 내용이 추가될 수 있습니다.

개인적으로 공부하며 정리한 내용이기에 오타나 틀린 부분이 있을 수 있습니다.

이에 대해 지적해 주시면 감사하겠습니다.

 

댓글