본문 바로가기

파이썬

[python]#9 파이썬 함수, 에러 유형

Python에서 함수는 특정 작업을 수행하는 재사용 가능한 코드의 명명된 블록입니다. 함수는 코드를 모듈화하고 더 읽기 쉽고 유지 관리 및 재사용이 가능하도록 도와줍니다.

Python 함수는 일반적으로 일부 입력 인수를 사용하고 입력을 기반으로 일부 작업을 수행하며 선택적으로 결과를 반환하거나 다른 작업을 수행합니다.


다음은 Python 함수를 정의하기 위한 기본 구문입니다.

def function_name(argument1, argument2, ...):
    # Function body
    # Code to perform the desired task
    return result

def 키워드는 함수 이름과 괄호 안의 입력 인수 목록이 뒤따르는 함수를 정의하는 데 사용됩니다. 함수 본문은 들여쓰기되어 있으며 작업을 수행하는 코드를 포함합니다. return 문은 선택적으로 함수에서 값을 반환하는 데 사용됩니다.

다음은 두 개의 숫자를 입력으로 받아 함께 더하고 결과를 반환하는 Python 함수의 예입니다.

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

일단 정의되면 함수는 필요한 인수를 전달하여 이름으로 호출할 수 있습니다.

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

이렇게 하면 인수 3과 5를 사용하여 add_numbers 함수를 호출하고 이 함수는 두 숫자의 합을 반환한 다음 콘솔에 출력합니다.

 

다음은 문자를 입력으로 받아 결과를 반환하는 Python 함수의 예입니다

def greet(name):
    """
    This function takes in a name as input and prints a personalized greeting.
    """
    print("Hello, " + name + "! How are you today?")

# Example usage of the greet function
greet("Alice") # prints "Hello, Alice! How are you today?"
greet("Bob") # prints "Hello, Bob! How are you today?"

이 예제에서 welcome 함수는 이름 매개변수를 가져와 개인화된 인사말 메시지를 인쇄하는 데 사용합니다. 함수는 def 키워드 뒤에 함수 이름, 괄호 안의 매개변수 및 콜론을 사용하여 정의됩니다. 함수 본문은 들여쓰기되어 있으며 함수가 호출될 때 실행되는 코드를 포함합니다. 마지막으로 함수는 name 매개 변수에 대한 값을 제공하는 인수와 함께 호출됩니다.

 

함수 내의 코드에 문제가 있는 경우 Python 함수에 오류가 발생할 수 있습니다.

다음은 Python 함수에서 발생할 수 있는 몇 가지 일반적인 유형의 오류입니다.,

Syntax Errors: 이러한 오류는 함수 내의 코드 구문이 올바르지 않을 때 발생합니다. 예를 들어 괄호 닫기, 콜론 누락, 키워드 철자 오류 등이 있습니다.

def greeting(name
    print("Hello, " + name + "!")

이 함수에는 함수의 첫 번째 줄에 닫는 괄호가 없기 때문에 구문 오류가 있습니다. 함수가 호출되면 Python은 다음과 같은 메시지와 함께 SyntaxError를 발생시킵니다.

  File "<stdin>", line 2
    print("Hello, " + name + "!")
        ^
SyntaxError: invalid syntax

이 오류를 수정하려면 함수의 첫 번째 줄에 누락된 닫는 괄호를 추가하기만 하면 됩니다.

def greeting(name):
    print("Hello, " + name + "!")



Name Errors: 이 오류는 함수가 정의되지 않았거나 범위를 벗어난 변수나 이름을 사용하려고 할 때 발생합니다.
다음은 이름 오류가 있는 Python 함수의 예입니다.

def double(x):
    result = 2 * x
    return result

y = triple(3)
print(y)

이 함수는 triple() 함수가 코드에 정의되어 있지 않기 때문에 이름 오류가 있습니다. 함수가 호출되면 Python은 다음과 같은 메시지와 함께 NameError를 발생시킵니다.

 

Traceback (most recent call last):
  File "example.py", line 5, in <module>
    y = triple(3)
NameError: name 'triple' is not defined

이 오류를 수정하려면 triple() 함수를 정의하거나 정의된 double() 함수를 사용하도록 함수 호출을 변경할 수 있습니다.

# Option 1: Define the triple() function
def triple(x):
    result = 3 * x
    return result

y = triple(3)
print(y) # Output: 9

# Option 2: Use the double() function instead
y = double(3)
print(y) # Output: 6

이제 함수를 오류 없이 호출할 수 있으며 예상 출력을 반환합니다.


Type Errors: 이 오류는 함수가 잘못된 데이터 유형의 인수로 호출되거나 함수가 호환되지 않는 데이터 유형에 대해 작업을 수행하려고 할 때 발생합니다.

def calculate_average(numbers):
    total = sum(numbers)
    average = total / len(numbers)
    print("The average is: " + average)

calculate_average([1, 2, 3])

이 함수에서 목표는 숫자 목록의 평균을 계산하는 것입니다. 그러나 함수 끝의 print 문에 이름 오류가 있습니다. 특히, 변수 average는 float이지만 print 문은 이를 문자열과 연결하려고 시도합니다.
함수가 호출되면 Python은 다음과 같은 메시지와 함께 TypeError를 발생시킵니다.

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in calculate_average
TypeError: can only concatenate str (not "float") to str

이 오류를 수정하려면 평균 변수를 나머지 메시지와 연결하기 전에 문자열로 변환해야 합니다.

def calculate_average(numbers):
    total = sum(numbers)
    average = total / len(numbers)
    print("The average is: " + str(average))

calculate_average([1, 2, 3])

이제 함수는 오류 없이 실행되고 올바른 평균을 인쇄해야 합니다.


Index Errors: 이 오류는 함수가 존재하지 않는 목록 또는 배열의 인덱스에 액세스하려고 할 때 발생합니다.

def get_element(lst, index):
    return lst[index]

my_list = [1, 2, 3]
print(get_element(my_list, 3))

이 함수에서 함수에 전달된 인덱스 인수가 목록 lst의 길이보다 크거나 같으면 인덱스 오류가 발생할 수 있습니다. 범위를 벗어난 인덱스 값으로 함수가 호출되면 Python은 다음과 같은 메시지와 함께 IndexError를 발생시킵니다.

  File "<stdin>", line 2, in get_element
IndexError: list index out of range

이 경우 목록에 존재하지 않는 요소에 액세스하려고 하기 때문에 오류가 발생합니다.
이 오류를 수정하려면 함수에 전달된 인덱스가 목록 범위 내에 있는지 확인해야 합니다. 이를 수행하는 한 가지 방법은 인덱스가 범위 내에 있는지 확인하는 함수에 검사를 추가하는 것입니다.

def get_element(lst, index):
    if index >= len(lst):
        raise IndexError("Index out of range.")
    return lst[index]

my_list = [1, 2, 3]
print(get_element(my_list, 3))

이제 범위를 벗어난 인덱스로 함수를 호출하면 사용자 지정 오류 메시지와 함께 IndexError가 발생합니다.

Assertion Errors: 이러한 오류는 함수에서 만든 어설션이 실패할 때 발생합니다.

 

def divide(x, y):
    assert y != 0, "Cannot divide by zero."
    return x / y

print(divide(10, 0))

이 함수에서 함수에 전달된 y 인수가 0인 경우 어설션 오류가 발생할 수 있습니다. 함수가 y=0으로 호출되면 Python은 다음과 같은 메시지와 함께 AssertionError를 발생시킵니다.

AssertionError: Cannot divide by zero.

이 경우 입력 인수에 대해 정의되지 않은 나눗셈 연산을 수행하려고 하기 때문에 오류가 발생합니다.
이 오류를 수정하기 위해 y가 0인지 확인하고 그럴 경우 AssertionError를 발생시키는 함수에 어설션을 추가할 수 있습니다. 이렇게 하면 나누기 작업이 수행되지 않고 사용자 정의 오류 메시지가 제공됩니다.

def divide(x, y):
    assert y != 0, "Cannot divide by zero."
    return x / y

print(divide(10, 5))   # Output: 2.0
print(divide(10, 0))   # Raises AssertionError: Cannot divide by zero.

이제 함수가 y=0으로 호출되면 맞춤 오류 메시지와 함께 AssertionError가 발생합니다.


ValueError: 이 오류는 함수가 올바른 유형의 인수를 받았지만 부적절한 값을 받았을 때 발생합니다.

def convert_to_int(value):
    try:
        int_value = int(value)
        return int_value
    except ValueError:
        raise ValueError("Cannot convert input to integer.")

print(convert_to_int("not a number"))


이 함수에서 함수에 전달된 값 인수를 int() 함수를 사용하여 정수로 변환할 수 없는 경우 ValueError가 발생할 수 있습니다. 함수가 변환할 수 없는 값으로 호출되면 Python은 다음과 같은 메시지와 함께 ValueError를 발생시킵니다.

ValueError: invalid literal for int() with base 10: 'not a number'

이 경우 유효한 정수 값을 나타내지 않는 문자열을 변환하려고 하기 때문에 오류가 발생합니다.
이 오류를 수정하기 위해 try/except 블록을 사용하여 ValueError를 포착하고 사용자 정의 오류 메시지를 발생시킬 수 있습니다.