반응형

목차

  1. 함수와 매개변수
    1. 함수란?
    2. 매개 변수
    3. 자주 발생할 수 있는 실수들
  2. 다양한 매개 변수
    1. '기본' 매개 변수
    2. '가변' 매개 변수
    3. '키워드' 매개 변수

함수란?

Python의 함수는 특정 작업을 수행하는 재사용 가능한 코드 블록입니다. 입력 인수(있는 경우)를 사용하고 일련의 작업을 수행하며 출력(있는 경우)을 생성합니다. 다음은 두 개의 숫자를 입력으로 받아 함께 더하고 결과를 반환하는 간단한 함수의 예입니다.

def add_numbers(x, y):
    sum = x + y
    return sum


이 예에서 add_numbers는 함수의 이름이고 x와 y는 입력 인수이며 sum은 x와 y의 합계를 저장하는 변수입니다. 'return' 문은 함수의 출력을 지정하며, 이 경우에는 'sum' 값입니다. 해당 함수를 출력하려면 위 사진과 같이 정의된 함수에 값을 넣어 print 할 수 있습니다.

이런 식으로 함수를 정의한 후에는 코드의 어느 곳에서나 함수를 호출하고 설계된 작업을 수행하는 데 사용할 수 있습니다. 예를 들면 다음과 같습니다.

result = add_numbers(5, 3)
print(result)  # Output: 8


이 예에서 add_numbers 함수는 입력 인수 3 과 4가 함께 호출되고 결과(7)은 result 변수에 할당됩니다. 마지막으로 print 문은 result의 값을 콘솔에 출력합니다. 처음 사진처럼 바로 출력하는 방법과 위 사진 처럼 또 다른 변수를 지정해 출력하는 방법 중 편한 방법으로 사용하면 될 것 같습니다.


매개 변수

Python에서 매개변수는 함수가 호출될 때 함수에 전달되는 값에 대한 자리 표시자 역할을 하는 변수입니다. 사용자의 필요에 따라 다른 입력 값을 취함으로써 기능을 보다 유연하고 재사용할 수 있습니다. 함수가 호출될 때 함수에 전달되는 실제 값을 인수라고 합니다.

다음은 매개변수의 개념을 설명하는 예시입니다.

def greet(name): # 'name' 은 파라미터 입니다.
    print(f"Hello, {name}!")

# 다른 인수로 함수 불러오기
greet("철수") # '철수'가 인수입니다.
greet("영희")   # '영희'가 인수입니다.


이 예에서 greet 함수에는 name이라는 단일 매개변수가 있습니다. greet 함수를 호출할 때 name 매개변수를 대체하는 다른 인수("Alice" 및 "Bob")를 전달합니다. 그런 다음 함수는 전달된 인수를 사용하여 인사말 메시지를 인쇄합니다.


자주 발생할 수 있는 실수들

1. 매개변수 이름 철자 오류
함수 내에서 철자가 틀린 매개변수 이름이 사용되는 경우 함수를 호출할 때 오류가 발생하거나 잘못된 동작이 발생할 수 있습니다.

def greet(user_name):  # 올바른 파라미터 이름
    print(f"Hello, {username}!")  # 값 이름에 오타가 있어 NameError가 출력됩니다.
    print(f"Hello, {user_name}!" # 올바른 방법

greet("철수")


2. 함수를 호출할 때 괄호를 잊어버리기
함수를 호출할 때 괄호를 추가하는 것을 잊으면 예상 반환 값이 아닌 함수 개체 자체에 대한 참조가 발생합니다.

def square(x):
    return x * x

result = square  # 괄호가 없습니다.
result = square(4) # 올바른 방법

print(result(4))  # TypeError: 'function' object is not callable가 출력됩니다.
print(result) # 올바르게 출력하는 방법


3. 잘못된 인수 수
인수가 너무 적거나 너무 많은 함수를 호출하면 TypeError가 발생할 수 있습니다. 함수를 호출할 때 올바른 개수의 인수를 제공해야 합니다.

def add(a, b):
    return a + b

result = add(1)  # 두 번째 인수가 없기 때문에 TypeError가 출력됩니다.
result = add(1, 2)


4. 인수 유형을 고려하지 않음
함수에 전달된 인수 유형을 고려하지 않으면 예기치 않은 동작이나 TypeError 또는 AttributeError와 같은 오류가 발생할 수 있습니다. 인수 유형을 확인하고 그에 따라 처리하거나 예상되는 입력 유형을 명확하게 문서화하는 것이 좋습니다.

def greet(name):
    print(f"Hello, {name}!")

greet(123)  # 출력이 될 수 있으나 에러가 발생할 가능성도 있습니다.
greet("Alice") # 올바른 방법


5. 내장 함수 덮어쓰기
실수로 매개변수에 대한 내장 함수와 동일한 이름을 사용하면 예기치 않은 동작이 발생하고 함수 범위 내에서 내장 함수에 액세스할 수 없게 될 수 있습니다.

def power(base, pow):  # power 함수는 pow로 쓰기도 합니다. 때문에 충돌할 가능성이 있습니다.
    return base ** pow

def power(base, exponent):  # 파라미터 'pow'를 'exponent'로 변경해줍니다.
    return base ** exponent

result = power(2, pow(2, 3))  # pow로 지정하고 출력하면 TypeError가 출력됩니다.


6. 함수 인수 수정
목록이나 사전과 같은 변경 가능한 함수 인수를 수정하면 호출자가 원래 개체가 이전 버전을 출력하지 못하는 등 부작용이 발생할 수 있습니다. 이를 방지하려면 변경 가능한 객체를 수정하기 전에 사본을 만들어야 합니다.

def add_item(item, items_list):
    items_list.append(item)
    return items_list

original_list = [1, 2, 3]
result = add_item(4, original_list)
print(original_list)  # Output: [1, 2, 3, 4] (expected output: [1, 2, 3])

* 복사본을 만드는 예시

def add_item(item, items_list):
    new_list = items_list.copy()  # Create a copy of the input list
    new_list.append(item)
    return new_list

original_list = [1, 2, 3]
result = add_item(4, original_list)
print(original_list)  # Output: [1, 2, 3]

 

7. 변경 가능한 기본 매개변수 사용
목록이나 사전과 같은 변경 가능한 개체를 기본 매개 변수 값으로 지정하면 동일한 변경 가능한 개체가 함수 호출 간에 재사용되기 때문에 의도하지 않은 부작용이 발생할 수 있습니다.

def add_item(item, items_list=[]):
    items_list.append(item)
    return items_list

print(add_item(1))  # Output: [1]
print(add_item(2))  # Output: [1, 2] (expected output: [2])


이 문제를 방지하려면 None을 기본값으로 사용하고 필요한 경우 함수 내부에 변경 가능한 새 객체를 만듭니다.

def add_item(item, items_list=None):
    if items_list is None:
        items_list = []
    items_list.append(item)
    return items_list


8. 위치 및 키워드 인수 순서
위치 인수는 항상 키워드 인수 앞에 와야 합니다. 순서를 섞으면 구문 오류가 발생하거나 값이 매개변수에 잘못 할당될 수 있습니다.

def example_function(a, b, c=0, d=0):
    pass

example_function(1, 2, 3, d=4)  # Correct
example_function(1, b=2, c=3, d=4)  # Incorrect, raises a syntax error


9. 매개변수 이름 충돌
가변 길이 인수 목록(*args 및 **kwargs)을 사용할 때 다른 매개변수의 이름이 매개변수에 전달된 키워드 인수의 이름과 충돌하지 않는지 확인해야합니다.

def example_function(a, b, *args, c=0, d=0, **kwargs):
    pass

example_function(1, 2, 3, 4, c=5, d=6, e=7, f=8)  # 옳은 방법
example_function(1, 2, 3, 4, a=5, b=6, c=7, d=8)  # 틀린 방법으로  a와 b는 앞에서 이미 지정되었습니다.


10. 선택적 매개변수를 처리하지 않음
선택적 매개변수를 사용할 때 선택적 매개변수가 제공되지 않는 경우를 함수가 처리할 수 있는지 확인해야합니다. 'None' 또는 기타 기본값을 확인하고 그에 따라 처리합니다.

def greet(name, greeting=None):
    if greeting is None:
        greeting = "Hello"
    print(f"{greeting}, {name}!")

greet("철수")  # Output: Hello, 철수!
greet("영희", "Hi")  # Output: Hi, 영희!


Python 함수에서 매개 변수를 지정할 때 이러한 일반적인 실수를 인식하고 모범 사례를 따르면 오류를 방지하고 보다 강력하고 유지 관리가 수월한 코드를 작성할 수 있습니다.


나머지는 2편에 올라올 예정입니다!

 

반응형