WeniVooks

검색

견고한 파이썬

함수의 아규먼트와 파라미터

1. 파라미터와 아규먼트란?

함수의 아규먼트(argument)와 파라미터(parameter)는 프로그래밍에서 함수를 정의하고 호출할 때 중요한 개념이며 구분해야 하는 용어입니다. 이 용어에 대한 개념과 들어갈 수 있는 다양한 형태를 예제를 통해 알아보도록 하겠습니다.

1.1 파라미터 (Parameter)

파라미터는 함수를 정의할 때 사용되는 변수입니다. 파라미터는 함수가 호출될 때 들어온 값을 변수에 할당하는 역할을 합니다.

def my_function(x, y):
    return x + y
def my_function(x, y):
    return x + y

위 코드에서 xy는 파라미터입니다.

1.2 아규먼트 (Argument)

아규먼트는 함수를 호출할 때 전달하는 실제 값입니다. 이 값들은 함수 호출 시 파라미터에 할당됩니다.

result = my_function(5, 3)
result = my_function(5, 3)

위 코드에서 53은 아규먼트입니다.

1.3 파라미터와 아규먼트 예시

기본적으로는 함수를 정의할 때 설정된 파라미터의 수와, 함수 호출 시 전달되는 아규먼트의 수가 일치해야 합니다. 다만 앞으로 배울 기본값이 설정된 파라미터는 아규먼트에서 값을 입력할 필요가 없을 수 있습니다.

1.3.1 파라미터의 기본 사용

함수 f는 3개의 파라미터 a, b, c를 가집니다. 함수 호출 시, 키워드 인자(keyword arguments) 를 사용하여 원하는 파라미터에 값을 할당할 수 있습니다.

def f(a, b, c): print(a, b, c) f(100,200,300) f(a=100, b=200, c=300) # 출력: 100 200 300 f(c=300, a=100, b=200) # 출력: 100 200 300
1.3.2 기본값을 가진 파라미터

a, b, c 각각의 파라미터에 기본값을 설정했습니다. 기본값이 설정된 파라미터는 함수 호출 시 생략할 수 있습니다. 함수 호출 시 기본값이 아닌 다른 값을 사용하려면 새 값을 전달해야 합니다.

def f(a=10, b=20, c=30): print(a, b, c) f() # 출력: 10 20 30 f(100, 10) # 출력: 100 10 30 f(a=100, b=200, c=300) # 출력: 100 200 300 f(c=300, a=100, b=200) # 출력: 100 200 300
1.3.3 일부 파라미터만 기본값을 가지는 경우 (잘못된 예)

파이썬에서는 기본값이 없는 파라미터가 기본값을 가진 파라미터 뒤에 올 수 없습니다. 이 코드는 오류를 발생시킵니다.

def f(a=10, b=20, c): print(a, b, c) # error
1.3.4 일부 파라미터만 기본값을 가지는 경우 (올바른 예)

해당 예제는 bc 파라미터에 기본값을 설정했으며, a는 기본값이 없습니다. 기본값이 없는 파라미터에는 반드시 값을 전달해야 합니다.

def f(a, b=20, c=10): print(a, b, c) f(100, 10) # 출력: 100 10 10 f(a=100, b=200, c=300) # 출력: 100 200 300 f(c=300, a=100, b=200) # 출력: 100 200 300

이 예제는 a 파라미터에 기본값이 없으며, bc에는 기본값이 설정되어 있습니다. 함수 호출 시, a 파라미터에는 반드시 값을 전달해야 합니다.

def f(a, b=20, c=30): print(a, b, c) # print(f()) # error print(f(100, 10)) # 출력 : 100, 10, 30 print(f(a=100, b=200, c=300)) # 출력 : 100 200 300 print(f(c=300, a=100, b=200)) # 출력 : 100 200 300 # print(f(c=300)) # error

1.4 나아가기

1.4.1 컨벤션 자료형을 아규먼트로 넣었을 때

아래와 같이 함수를 만들어 호출하게 되면 외부에 있는 a 변수가 영향을 받게 됩니다.

def add_element(my_list): my_list.append(1) a = [2, 3, 4] add_element(a) print(a) # 출력: [2, 3, 4, 1]

위와 같은 코드는 함수 안에서 동작할 때 아래와 같은 화살표를 가지고 있습니다. id로 주소값을 찍어보면 같은 곳을 가리키고 있다는 것을 확인할 수 있습니다. 주소값을 출력하는 것은 여러분과 저의 출력결과가 다릅니다. 두 개의 출력 결과가 같은지만 확인해주세요.

def add_element(my_list): my_list.append(1) print(id(my_list)) # 출력: 135115033605760 a = [2, 3, 4] add_element(a) print(id(a)) # 출력: 135115033605760 print(a) # 출력: [2, 3, 4, 1]

따라서 my_list에 append는 a의 append와 같습니다.

그렇다면 아래와 같은 코드는 어떻게 해서 a가 10이 안되었는지 확인해보도록 하겠습니다.

def add_element(my_list): my_list = 10 print(id(my_list)) # 출력: 135115442078224 a = [2, 3, 4] add_element(a) print(id(a)) # 출력: 135115029248768 print(a) # 출력: [2, 3, 4]

이는 아래와 같은 화살표로 표시될 수 있습니다.

1.4.2 권장하지 않는 기본값

파이썬에서 함수의 기본값은 함수가 정의될 때만 한 번 평가됩니다. 이것은 리스트와 같이 변경 가능한 객체를 기본값으로 사용할 때 문제가 될 수 있습니다.

# 권장하지 않는 방법
def append_to_list(value, lst=[]):
    lst.append(value)
    return lst # 예상치 못한 결과가 발생할 수 있습니다.
# 권장하지 않는 방법
def append_to_list(value, lst=[]):
    lst.append(value)
    return lst # 예상치 못한 결과가 발생할 수 있습니다.

위의 방법은 권장되지 않습니다. lst=[]라는 기본값은 함수가 정의될 때 한 번만 생성되고, 같은 리스트 객체가 모든 함수 호출에 대해 공유됩니다. 이 때문에 리스트가 변경될 때마다 (즉, 함수가 호출될 때마다) 변경된 내용이 유지되며, 이는 다음과 같은 예상치 못한 결과를 초래할 수 있습니다.

append_to_list(1) # 출력: [1]
append_to_list(2) # 출력: [1, 2], 그러나 결과가 [2]가 나올것으로 예상할수 도 있습니다.
append_to_list(1) # 출력: [1]
append_to_list(2) # 출력: [1, 2], 그러나 결과가 [2]가 나올것으로 예상할수 도 있습니다.

권장 방법은 다음과 같습니다.

# 권장 방법
def append_to_list(value, lst=None):
    if lst is None:
        lst = []
    lst.append(value)
    return lst
# 권장 방법
def append_to_list(value, lst=None):
    if lst is None:
        lst = []
    lst.append(value)
    return lst

이 방법은 lst 파라미터의 기본값을 None으로 설정하고, 함수 본문 내에서 None 값을 새로운 리스트로 바꾸어 주어, 함수 호출 사이에 리스트가 공유되지 않도록 합니다. 이렇게 하면, 각 함수 호출이 독립적인 리스트를 가지게 되므로, 위에서 설명한 예상치 못한 부작용을 피할 수 있습니다.

append_to_list(1) # 결과: [1]
append_to_list(2) # 결과: [2]
append_to_list(1) # 결과: [1]
append_to_list(2) # 결과: [2]

이러한 방법은 함수 호출 간에 상태를 공유하지 않아야 하는 경우, 특히 기본값이 변경 가능한 객체일 때 유용합니다.

{"packages":["numpy","pandas","matplotlib","lxml"]}
7.2 간단한 함수 만들어보기7.4 지역 변수와 전역 변수