01_Python

41_함수

chuu_travel 2025. 1. 8. 23:13
728x90
01. 파이썬 함수의 구조

- define/파이썬에서 함수를 만드는 구조

 

def 함수명(매개변수):
       <수행할 문장>

 

#  welcome 함수 정의
def welcome():
    print("Hello!")
    print("Nice to meet you")
# welcome 함수 호출
welcome()
Hello!
Nice to meet you

 

 

# add 함수 정의
def add(a, b):
    return a + b
num1 = 3
num2 = 4
c = add(num1, num2)
print(c)
7

 

 

02. 함수 사용의 장점
  • 코드의 용도를 구분
  • 코드 재사용이 용이
  • 실수를 방지(오타 등)

 

03. 매개변수와 인수
  • 매개변수 : 함수에 입력으로 전달된 값을 받는 변수 (a, b)
  • 인수 : 함수를 호출할 때 전달하는 입력값 (3, 4)
  • 인수와 매개변수는 다른 개념이지만 함수가 호출된 뒤에는 구분이 모호해지므로 구분하지 않는 경우도 많음
  • 함수의 사용법
    • 결괏값을 받을 변수 = 함수이름(입력인수1, 입력인수2, ......)
def print_n_times(value, n):
    for _ in range(n):
        print(value)

 

print_n_times("안녕하세요", 3)
안녕하세요
안녕하세요
안녕하세요

 

# 매개변수를 2개를 지정하고 인수를 하나만 넣는다면 에러 발생
print_n_times("안녕하세요")
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[15], line 2
      1 # 매개변수를 2개를 지정하고 인수를 하나만 넣는다면 에러 발생
----> 2 print_n_times("안녕하세요")

TypeError: print_n_times() missing 1 required positional argument: 'n'

 

# 지정한 매개변수보다 인수를 많이 넣으면 에러 발생
print_n_times("안녕하세요", 10, 20)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[17], line 2
      1 # 지정한 매개변수보다 인수를 많이 넣으면 에러 발생
----> 2 print_n_times("안녕하세요", 10, 20)

TypeError: print_n_times() takes 2 positional arguments but 3 were given

 

# 입력값이 없고 결괏값이 있는 함수
def say():
    return "Hi"
say()
'Hi'

 

a = say()
print(a)
Hi

 

# 입력값이 있고 결괏값이 없는 함수
def add(a, b):
    print(f"{a}, {b}의 합은 {a + b} 입니다")
add(3, 4)
3, 4의 합은 7 입니다

 

# 결괏값 확인
a = add(3, 4)
#a = None

print(a)
3, 4의 합은 7 입니다
None

 

 

04. 매개변수 지정하여 호출하기
add(a = 3, b = 7)
3, 7의 합은 10 입니다

 

add(b = 5, a = 3)
3, 5의 합은 8 입니다

 

 

05. 함수의 결괏값
def add_and_mul(a, b):
    return a + b, a * b

 

result = add_and_mul(3, 4)

# 함수의 결괏값은 2개가 아니라 하나의 튜플로 반환되었음(함수의 결괏값의 데이터타입은 튜플)
print(result)
7

 

 

# 2개의 결괏값처럼 받고 싶다면
result1, result2 = add_and_mul(3, 4)

print(result1)
print(result2)
7
12

 

def add_and_mul(a, b):
    return a + b
    return a * b  ##영원히 실행되지 않는 코드
# 함수는 return을 만나는 순간 함수 실행이 종료됨
result = add_and_mul(2, 3)

print(result)
5

 

 

06. return
  • 함수를 종료시키고 싶을 때 사용할 수도 있음
def say_nick(nick):
    if nick == "바보":
        return

    print(f"나의 별명은 {nick} 입니다")

 

say_nick("야호")
나의 별명은 야호 입니다
say_nick("바보")
result = say_nick("바보")

print(result)
None

 

 

07. 디폴트 매개변수
  • 디폴트 : 매개변수로 전달되는 인수가 없는 경우에 기본적으로 사용하는 값
def say_myself(name, old, man = True):
    print(f"나의 이름은 {name} 입니다")
    print(f"나이는 {old}살 입니다")

    if man:
        print("남자입니다")

    else:
        print("여자입니다")

 

# default값은 생략 가능
say_myself("파이썬", 27)
나의 이름은 파이썬 입니다
나이는 27살 입니다
남자입니다

 

# default값을 덮어쓰기도 가능
say_myself("파이썬", 27, True)
나의 이름은 파이썬 입니다
나이는 27살 입니다
남자입니다

 

say_myself("파이썬", 27, False)
나의 이름은 파이썬 입니다
나이는 27살 입니다
여자입니다

 

say_myself("파이썬", 27, "girl")
나의 이름은 파이썬 입니다
나이는 27살 입니다
남자입니다

 

 

def print_n_times(value, n = 2):
    for _ in range(n):
        print(value)
print_n_times("안녕하세요")
안녕하세요
안녕하세요

 

 

08. 디폴트 매개변수의 위치
#파이썬은 인수를 어디에 대입해야할지 알 수 없으므로, 디폴트 매개변수 뒤에 인수가 올 수 없다.
def say_myself(name, man = True, old):
    print(f"나의 이름은 {name} 입니다")
    print(f"나이는 {old}살 입니다")

    if man:
        print("남자입니다")

    else:
        print("여자입니다")
  Cell In[65], line 2
    def say_myself(name, man = True, old):
                                     ^
SyntaxError: parameter without a default follows parameter with a default

 

09. 지역변수와 전역변수

 

  • 지역변수
    • 함수 내부에서 선언한 변수는 함수 내부에서만 사용할 수 있는 변수가 됨
    • 함수 외부에서는 지역변수에 접근할 수 없음
  • 전역변수
    • 함수 외부에서 선언한 변수는 함수 내부에서도 사용 가능
def vartest():
    var = 10
    print(var)
vartest()
10

 

print(var) ##함수 내부에서 만든 변수이기때문에 지역변수, 함수 바깥에서 지역변수를 쓰려고 하면 에러가남
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[82], line 1
----> 1 print(var)

NameError: name 'var' is not defined

 

var2 = 10
def var2test():
    print(var2)

 

var2test()
10

 

print(var2)
10

 

 

10. 전역변수를 함수 내부에서 사용하는 2가지 경우
  • 단순 참조
  • 전역 변수의 값을 변경
a = 0
def f():
    a = 10
    print(a)
f()
10
print(a)
0

 

def f():
    global a  #전역변수 a를 사용하겠다
    a = 10
    print(a)
f()
10

 

print(a)
10

 

※ 함수 내부에서 전역변수를 건드리면 디버깅이 어려워지므로, global은 주력으로 쓰지 않고 꼭 필요할 때만 쓸 것

 

11. mutable과 immutable
def modify(lst, text):
    lst[0] = 99
    text = text.replace("a", "b")
    return lst, text
my_list = [1, 2, 3]
my_string = "apple"
modify(my_list, my_string)

print(my_list, my_string)
[99, 2, 3] apple

 

※ 99는 대체됨, apple은 그대로

##다른 변수에 값을 받으면 apple도 변경된 값으로 출력됨

modified_list, modified_string = modify(my_list, my_string)

print(modified_list, modified_string)
[99, 2, 3] bpple

 

 

12. 가변 매개변수(여러 개의 입력값을 받는 함수)
  • 함수로 전달해야하는 인수의 개수가 정해지지 않은 매개변수
  • 함수 정의시 매개변수 앞에 * 을 붙이면 가변 매개변수가 됨
  • 전달되는 인수는 하나의 튜플 형태로 전달
  • 가변 매개변수의 제약
    • 가변 매개변수 뒤에는 일반 매개변수가 올 수 없음
    • 가변 매개변수는 하나만 사용할 수 있음
def show(*args):     ##arguments
    print(args)
show("python")
('python',)

 

type(("python",))  ##콤마가 있어야 튜플
tuple

 

type(("python,"))  ##콤마가 없으면 String
str

 

show("happy", "birthday")
('happy', 'birthday')

 

 

def add_many(*args):
    result = 0

    for i in args:
        result += i

    return result
result = add_many(1, 2, 3)
print(result)
6

 

result = add_many(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
print(result)
55

 

 

add_many(range(10), )   ###수열로 들어가는게 아니라 통으로 들어감
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[33], line 1
----> 1 add_many(range(10), )

Cell In[28], line 5, in add_many(*args)
      2 result = 0
      4 for i in args:
----> 5     result += i
      7 return result

TypeError: unsupported operand type(s) for +=: 'int' and 'range'

 

result = 0

result + range(10)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[34], line 3
      1 result = 0
----> 3 result + range(10)

TypeError: unsupported operand type(s) for +: 'int' and 'range'

 

list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

 

 

13. 키워드 매개변수
def print_kwargs(**kwargs): ##키워드 매개변수는 딕셔너리로 받아야 한다
    print(kwargs)
print_kwargs(a = 1)
{'a': 1}

 

print_kwargs(name = "foo", age = 3)
{'name': 'foo', 'age': 3}

 

 

14. 함수 매개변수 순서
  1. 일반 매개변수
  2. 디폴트 매개변수
  3. 가변 매개변수
  4. 키워드 매개변수 

이론상 다 쓰고 싶으면 이순서대로 쓰면됨

 

 

15. 연습문제

 

# 1. 주어진 자연수가 홀수인지 짝수인지 판별해주는 함수(함수명 : is_odd)를 작성하기 

def is_odd(num):
    if num % 2 == 1:
        return True
    else:
        return False

#    return num % 2 == 1
is_odd(3)
True
# 2. 커피자판기 코드 만들기

- 커피자판기에 돈과 주문할 커피를 전달

- 주문할 수 있는 커피의 종류와 가격은 다음과 같음
        - 아메리카노: 1000원
        - 카페라떼 : 1500원
        - 카푸치노: 2000원

        - 없는 커피를 주문할 경우 입력한 돈을 그대로 반환

        - 구매 금액이 부족하면 입력한 돈을 그대로 반환

        - 정상 주문이면 주문한 커피와 잔돈을 반환

 

##해설

def coffee_machine(money, pick):
    print(f"{money}원에 {pick}을 선택하셨습니다")
    
    menu = {"아메리카노" : 1000, 
           "카페라떼" : 1500, 
           "카푸치노" : 2000}

    if pick not in menu:
        print(f"{pick}는 없는 메뉴입니다")
        return money

    elif menu[pick] > money:
        print(f"{pick}는 {menu[pick]}원 입니다")
        print(f"돈이{money[pick] - money}원 부족합니다")
        return money

    else:
        print(f"{pick}는 {menu[pick]}원 입니다")
        print(f"돈이{money - menu[pick]}원 부족합니다")
        return pick, money - menu[pick]
coffee_machine(pick = "마키아또", money = 15000)
15000원에 마키아또을 선택하셨습니다
마키아또는 없는 메뉴입니다

 

coffee_machine(pick = "카페라떼", money = 2000)
2000원에 카페라떼을 선택하셨습니다
카페라떼는 1500원 입니다
돈이500원 부족합니다
728x90

'01_Python' 카테고리의 다른 글

43_파이썬 내장함수  (3) 2025.01.09
42_데이터 입출력  (1) 2025.01.09
40_제어문>제어문연습(2)  (0) 2025.01.08
39_제어문>리스트 내포(List comprehension)  (0) 2025.01.08
38_제어문>enumerate함수  (0) 2025.01.08