파이썬 / / 2025. 5. 29. 02:10

12. 파이썬 함수 기초부터 응용까지 한번에 끝내기.

반응형

파이썬-함수

 

 

함수의 개념 이해하기

함수를 배우기 전에 커피머신을 떠올려보세요. 우리가 커피머신에 원두와 물을 넣으면, 커피머신은 이를 처리해서 맛있는 커피를 만들어 줍니다. 여기서 원두와 물은 '입력값', 커피는 '출력값'이 됩니다.

프로그래밍의 함수도 이와 똑같습니다. 어떤 값을 입력받아서 특정한 작업을 수행한 후, 결과를 돌려주는 것이 바로 함수의 역할입니다.

예를 들어 수학 시간에 배운 y = 2x + 1도 함수입니다. x값을 입력하면 그에 따라 y값이 결정되죠. x가 3이면 y는 7이 되는 것처럼 말입니다.


왜 함수를 사용할까요?

 

프로그래밍을 하다 보면 같은 코드를 여러 번 작성하게 되는 경우가 많습니다. 예를 들어 두 수를 더하는 계산을 프로그램 곳곳에서 해야 한다면, 매번 더하기 코드를 작성하는 것보다 함수로 만들어 두고 필요할 때마다 사용하는 것이 훨씬 효율적입니다.

또한 함수를 사용하면 프로그램을 기능별로 나누어 관리할 수 있어서, 프로그램의 흐름을 이해하기 쉽고 오류를 찾기도 간편합니다.

 


파이썬 함수의 기본 구조

 

파이썬에서 함수를 만드는 기본 형태는 다음과 같습니다:

```python
def 함수이름(매개변수):
    실행할_코드1
    실행할_코드2
    ...
    return 결과값  # 생략 가능
```

가장 간단한 함수를 만들어보겠습니다:

```python
def plus(x, y):  # plus라는 이름의 함수를 정의, x와 y를 입력받음
    result = x + y  # 두 수를 더해서 result에 저장
    return result   # 결과값을 돌려줌

# 함수 사용하기
answer = plus(5, 3)  # 5와 3을 plus 함수에 전달
print(answer)        # 8이 출력됨
```

여기서 x, y는 '매개변수'라고 하고, 함수를 호출할 때 전달하는 5, 3은 '인수'라고 합니다.


 

입력값과 출력값이 모두 있는 함수

 


<가장 일반적인 형태의 함수입니다>

 

```python
def multiply(a, b):  # 두 수를 곱하는 함수
    result = a * b   # 곱셈 계산
    return result    # 결과 반환

number = multiply(4, 7)  # 4와 7을 곱한 결과를 number에 저장
print(number)            # 28이 출력됨
```

<입력값이 없는 함수>

입력값 없이도 동작하는 함수를 만들 수 있습니다:

```python
def greet():             # 매개변수가 없음
    return "안녕하세요!"  # 항상 같은 인사말 반환

message = greet()  # 괄호는 비어있지만 반드시 써야 함
print(message)     # "안녕하세요!"가 출력됨
```

<출력값이 없는 함수>

결과를 돌려주지 않고 단순히 작업만 수행하는 함수입니다:

```python
def show_info(name, age):  # 정보를 출력만 하는 함수
    print(f"{name}님의 나이는 {age}살입니다.")  # 화면에 출력만 함

show_info("김철수", 12)  # "김철수님의 나이는 12살입니다." 출력
# 이 함수는 return이 없으므로 결과값을 받을 수 없음
```

<입력값도 출력값도 없는 함수>

가장 단순한 형태의 함수입니다:

```python
def say_hello():      # 입력값 없음
    print("반갑습니다!")  # 출력값도 없고 단순히 인사만 출력

say_hello()  # "반갑습니다!" 출력
```

<함수 호출 시 매개변수 지정하기>

함수를 호출할 때 매개변수 이름을 직접 지정할 수 있습니다:

```python
def subtract(first, second):  # 첫 번째 수에서 두 번째 수를 빼는 함수
    return first - second

일반적인 방법
result1 = subtract(10, 3)  # 10 - 3 = 7

매개변수 이름을 지정하는 방법
result2 = subtract(first=10, second=3)  # 같은 결과: 7

순서를 바꿔도 됨
result3 = subtract(second=3, first=10)  # 여전히 10 - 3 = 7

print(result1, result2, result3)  # 7 7 7 출력
```

<입력값이 여러 개일 때 처리하기>

 

때로는 함수에 몇 개의 값이 들어올지 미리 알 수 없는 경우가 있습니다. 이럴 때는 `*`를 사용합니다:

```python
def sum_all(*numbers):  # 몇 개든 숫자를 받을 수 있음
    total = 0           # 합계를 저장할 변수
    for num in numbers: # 받은 모든 숫자를 하나씩 처리
        total = total + num  # 합계에 더하기
    return total        # 최종 합계 반환

다양한 개수의 숫자로 테스트
print(sum_all(1, 2))           # 3 출력
print(sum_all(1, 2, 3, 4))     # 10 출력
print(sum_all(5, 10, 15, 20, 25))  # 75 출력
```

좀 더 복잡한 예제를 살펴보겠습니다:

```python
def calc(operation, *nums):  # 첫 번째는 연산 종류, 나머지는 숫자들
    if operation == "plus":     # 더하기인 경우
        result = 0
        for n in nums:
            result = result + n
    elif operation == "times":  # 곱하기인 경우
        result = 1
        for n in nums:
            result = result * n
    return result

print(calc("plus", 2, 4, 6))    # 2+4+6 = 12
print(calc("times", 2, 4, 6))   # 2×4×6 = 48
```

<키워드 매개변수 활용하기>

`**`를 사용하면 키워드 형태의 매개변수들을 딕셔너리로 받을 수 있습니다:

```python
def print_student_info(**info):  # 학생 정보를 받는 함수
    print("=== 학생 정보 ===")
    for key, value in info.items():  # 딕셔너리의 모든 항목 출력
        print(f"{key}: {value}")

<다양한 정보를 키워드로 전달>
print_student_info(name="이영희", age=11, grade=5, hobby="그림그리기")
# === 학생 정보 ===
# name: 이영희
# age: 11
# grade: 5
# hobby: 그림그리기
```

<함수는 항상 하나의 값만 반환한다>

함수에서 여러 개의 값을 반환하는 것처럼 보여도, 실제로는 하나의 튜플로 묶여서 반환됩니다:

```python
def get_math_results(a, b):  # 두 수의 사칙연산 결과를 모두 구하는 함수
    plus_result = a + b      # 더하기
    minus_result = a - b     # 빼기
    return plus_result, minus_result  # 두 개 값을 반환하는 것처럼 보임

# 하나의 변수로 받으면 튜플이 됨
results = get_math_results(8, 3)
print(results)  # (11, 5) 출력 - 튜플 형태

# 두 개의 변수로 받으면 각각 분리됨
add_result, sub_result = get_math_results(8, 3)
print(add_result)   # 11 출력
print(sub_result)   # 5 출력
```

중요한 점은 함수에서 return을 만나면 그 즉시 함수가 끝난다는 것입니다:

```python
def test_return():
    return "첫 번째"
    return "두 번째"  # 이 줄은 실행되지 않음

result = test_return()
print(result)  # "첫 번째"만 출력됨
```

<특별한 return 사용법>

특정 조건에서 함수를 즉시 종료하고 싶을 때 return을 단독으로 사용할 수 있습니다:

```python
def check_password(password):  # 비밀번호 확인 함수
    if password == "1234":     # 잘못된 비밀번호인 경우
        return                 # 함수를 즉시 종료
    print("비밀번호가 맞습니다!")  # 올바른 경우에만 실행

check_password("hello")  # 아무것도 출력되지 않음
check_password("5678")   # "비밀번호가 맞습니다!" 출력
```

<매개변수에 기본값 설정하기>

함수의 매개변수에 미리 기본값을 설정해 둘 수 있습니다:

```python
def introduce_pet(name, age, animal="강아지"):  # animal의 기본값은 "강아지"
    print(f"우리 {animal}의 이름은 {name}이고, {age}살입니다.")

# 기본값 사용 (강아지로 자동 설정됨)
introduce_pet("멍멍이", 3)  # "우리 강아지의 이름은 멍멍이이고, 3살입니다."

# 기본값을 다른 값으로 변경
introduce_pet("야옹이", 2, "고양이")  # "우리 고양이의 이름은 야옹이이고, 2살입니다."
```

주의할 점은 기본값이 있는 매개변수는 항상 맨 뒤에 위치해야 한다는 것입니다:

```python
# 올바른 예
def good_function(name, age, hobby="독서"):
    pass

# 잘못된 예 - 오류 발생!
def bad_function(name, hobby="독서", age):  # age가 기본값 뒤에 오면 안됨
    pass
```

<변수의 유효 범위 이해하기>

함수 안에서 사용하는 변수와 함수 밖의 변수는 서로 다릅니다:

```python
score = 80  # 함수 밖의 변수

def change_score(score):  # 매개변수 score는 함수 안에서만 사용
    score = score + 10    # 함수 안의 score를 변경
    print(f"함수 안에서 score: {score}")

change_score(score)  # "함수 안에서 score: 90" 출력
print(f"함수 밖에서 score: {score}")  # "함수 밖에서 score: 80" 출력
```

함수 밖의 변수를 변경하고 싶다면 return을 사용합니다:

```python
score = 80

def increase_score(current_score):  # 점수를 증가시키는 함수
    new_score = current_score + 10  # 10점 증가
    return new_score                # 새로운 점수 반환

score = increase_score(score)  # 반환값을 다시 score에 저장
print(score)  # 90 출력
```

<람다 함수 - 간단한 함수 만들기>

간단한 함수는 lambda를 사용해서 한 줄로 만들 수 있습니다:

```python
# 일반적인 함수
def double(x):
    return x * 2

# lambda를 사용한 함수 (같은 기능)
double_lambda = lambda x: x * 2

# 두 함수 모두 같은 결과
print(double(5))        # 10 출력
print(double_lambda(5)) # 10 출력

# 두 수를 더하는 lambda 함수
add_lambda = lambda a, b: a + b
print(add_lambda(3, 7))  # 10 출력
```

lambda는 주로 간단한 계산이나 정렬 등에서 많이 사용됩니다.

<실습 예제들>

마지막으로 다양한 함수 예제들을 살펴보겠습니다:

```python
# 1. 학생 성적 관리 함수
def calculate_grade(korean, english, math):
    """세 과목 점수를 받아서 평균과 등급을 계산하는 함수"""
    average = (korean + english + math) / 3  # 평균 계산
    
    if average >= 90:      # 평균에 따른 등급 결정
        grade = "A"
    elif average >= 80:
        grade = "B"
    elif average >= 70:
        grade = "C"
    else:
        grade = "D"
    
    return average, grade  # 평균과 등급을 함께 반환

# 함수 사용
avg, grade = calculate_grade(85, 92, 78)
print(f"평균: {avg:.1f}점, 등급: {grade}")  # 평균: 85.0점, 등급: B

# 2. 간단한 계산기 함수
def simple_calculator(num1, num2, operation):
    """두 수와 연산자를 받아서 계산하는 함수"""
    if operation == "+":
        return num1 + num2
    elif operation == "-":
        return num1 - num2
    elif operation == "*":
        return num1 * num2
    elif operation == "/":
        if num2 != 0:  # 0으로 나누기 방지
            return num1 / num2
        else:
            return "0으로 나눌 수 없습니다!"
    else:
        return "지원하지 않는 연산입니다!"

# 함수 사용
print(simple_calculator(15, 3, "+"))  # 18
print(simple_calculator(15, 3, "/"))  # 5.0
print(simple_calculator(15, 0, "/"))  # 0으로 나눌 수 없습니다!

# 3. 리스트의 최대값, 최소값 찾기 함수
def find_max_min(*numbers):
    """여러 개의 숫자 중 최대값과 최소값을 찾는 함수"""
    if len(numbers) == 0:  # 숫자가 하나도 없는 경우
        return "숫자를 입력해주세요!"
    
    max_num = numbers[0]  # 첫 번째 숫자를 최대값으로 설정
    min_num = numbers[0]  # 첫 번째 숫자를 최소값으로 설정
    
    for num in numbers:   # 모든 숫자를 확인
        if num > max_num: # 현재 숫자가 최대값보다 크면
            max_num = num # 최대값 업데이트
        if num < min_num: # 현재 숫자가 최소값보다 작으면
            min_num = num # 최소값 업데이트
    
    return max_num, min_num  # 최대값과 최소값 반환

# 함수 사용
max_val, min_val = find_max_min(5, 2, 9, 1, 7, 3)
print(f"최대값: {max_val}, 최소값: {min_val}")  # 최대값: 9, 최소값: 1
```

이제 파이썬 함수의 기본적인 개념부터 고급 활용법까지 모두 살펴보았습니다. 함수는 프로그래밍에서 매우 중요한 개념이므로, 다양한 예제를 만들어보면서 충분히 연습해보시기 바랍니다.

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유