에이블스쿨 6기 DX 트랙/일일 복습

DAY 05. 함수

d061120 2024. 9. 12. 01:53

8. 함수

  • 함수는 입력을 받아 무엇인가를 처리한 후 그 결과를 반환하는 것
  • 같은 입력이라도 함수의 기능에 따라 다른 출력이 나올 수 있다.
  • 함수는 def 문으로 정의하며, 기본적으로 세 가지로 구성됨
    1. 입력(Input)
      - 매개변수, 생략가능
    2. 처리
      - 코드
    3. 출력(Output)
      - 처리 결과, 생략가능

8.1. 입력

※ 입력 없이 처리되는 함수

[처리하는 함수]

# 함수 만들기: 처리하는 함수
def hello():
    print('안녕하세요? 반갑습니다!')

# 함수 사용하기
hello()
---
# 출력
# 안녕하세요? 반갑습니다!

→ 반환하는 것이 없으므로 a = hello() 후 print(a)를 하면 None이 출력된다.

 

[반환하는 함수]

# 함수 만들기: 반환하는 함수
def hello():
    return '안녕하세요? 반갑습니다!'

a = hello()
a
---
# 출력
# '안녕하세요? 반갑습니다!'

 

1) 매개변수

[매개변수를 갖는 함수]

# 함수 만들기
def hello(name):
    print(f'{name}님 안녕하세요? 반갑습니다!')

# 함수 사용
hello('홍길동')
---
# 출력
# 홍길동님 안녕하세요? 반갑습니다!

→ 위처럼 위치를 기준으로 매개변수에 전달되는 값을 위치 인수(Positional Argument) 라고 한다.

 

2) 매개변수 기본값

  • 위 함수는 매개변수가 없으면 오류가 발생한다.
  • '매개변수 = 값' 형태로 기본값을 지정할 수 있다.
  • 이름을 전달하지 않을때 '여러분'이 기본값으로 사용되게 수정하면 다음과 같다.
# 함수 만들기
def hello(name='여러분'):
    print(f'{name}님 안녕하세요? 반갑습니다!')

# 함수 사용
hello('홍길동')
hello()
---
# 출력
# 홍길동님 안녕하세요? 반갑습니다!
# 여러분님 안녕하세요? 반갑습니다!

→ 위와 같이 기본값으로 매개변수에 전달되는 인수를 기본 인수(Default Argument) 라고 한다.

 

3) 매개변수 순서

  • 매개변수 순서에 맞게 값을 넣으면 매개변수 이름은 생략 가능(=위치 인수)
  • '매개변수=값' 형태로 매개변수 이름을 지정하면 전달되는 순서 변경 가능
  • '매개변수=값' 형태로 매개변수에 전달되는 인수를 키워드 인수(Keyword Argument) 라고 한다.
# 함수 만들기
def hello(name, loud=1):
    if loud == 1:
        print(f'우~~와~~ {name}님 안녕하세요? 반갑습니다!!!')
    else:
        print(f'{name}님 안녕하세요? 반가워요.')

# 함수 사용
hello(name='홍길동', loud=1)   # 매개변수 이름 = 값 으로 지정
hello(loud=0, name='홍길동')   # 매개변수 이름으로 지정하면 순서 변경 가능
hello('홍길동', 0)             # 매개변수 순서에 맞게 값을 넣으면 매개변수 이름 생략 가능
hello('홍길동')                # 함수 생성 시 loud = 1 로 선언했으므로, 안쓰면 기본값 1이 입력됨
---
# 출력
# 우~~와~~ 홍길동님 안녕하세요? 반갑습니다!!!
# 홍길동님 안녕하세요? 반가워요.
# 홍길동님 안녕하세요? 반가워요.
# 우~~와~~ 홍길동님 안녕하세요? 반갑습니다!!!

 

4) 가변 인수

  • 임의 개수의 값이 매개변수에 전달되는 인수를 가변 인수(Arbitrary Argument) 라고 한다.
  • 가변 인수는 대부분 함수 안에서 반복문을 사용해 처리한다.
# 함수 만들기
def hello(*args):
    for who in args:
        print(f'{who}님 안녕하세요? 반갑습니다!')

# 함수 사용
hello('홍길동', '일지매', '강우동')   # 요소 개수만큼 함수가 실행됨
---
# 출력
# 홍길동님 안녕하세요? 반갑습니다!
# 일지매님 안녕하세요? 반갑습니다!
# 강우동님 안녕하세요? 반갑습니다!

 

[리스트 사용 시]

# 위 hello() 함수 사용
# 리스트 선언
whos = ['홍길동', '일지매', '강우동']

# 함수 사용
hello(*whos)
---
# 출력
# 홍길동님 안녕하세요? 반갑습니다!
# 일지매님 안녕하세요? 반갑습니다!
# 강우동님 안녕하세요? 반갑습니다!

 

[문자열 사용 시]

# '*'은 낱개씩 처리하라는 의미
print('ABCDEFG')
print(*'ABCDEFG')
---
# 출력
# ABCDEFG
# A B C D E F G

 

5) 가변 인수와 위치 인수

  • 위치 인수를 가변 인수 앞에 둔다.
  • 단, title='선생님' 같이 키워드 인수로는 사용 불가능
# 함수 만들기
def hello(title, *args):
    for who in args:
        print(f'{who}{title} 안녕하세요? 반갑습니다!')

# 함수 사용
hello('선생님', '홍길동', '일지매', '강우동')   # 첫 인수가 위치인수, 뒤는 가변인수
---
# 출력
# 홍길동선생님 안녕하세요? 반갑습니다!
# 일지매선생님 안녕하세요? 반갑습니다!
# 강우동선생님 안녕하세요? 반갑습니다!

 

  • 가변 인수 뒤에 위치 인수를 둘 수 없다.
  • 단, 가변 인수 뒤에 인수를 둘 경우 키워드 인수를 사용하면 가능
# 함수 만들기
def hello(*args, title):
    for who in args:
        print(f'{who}{title} 안녕하세요? 반갑습니다!')

# 함수 사용 (강사님이 잘 사용하는 방법)
hello('홍길동', '일지매', '강우동', title='선생님')
---
# 출력
# 홍길동선생님 안녕하세요? 반갑습니다!
# 일지매선생님 안녕하세요? 반갑습니다!
# 강우동선생님 안녕하세요? 반갑습니다!

 

8.2. 출력

  • 함수 내에서 결과값을 반환할 때는 return 문을 사용
  • 반환되는 값이 없는 함수의 결값을 받아 출력하면 None이 출력됨
  • 함수가 여러 개의 결괏값을 반환할 수도 있
# 함수 만들기
def calculate2(a, b):
    return a + b, a * b

# 함수 사용
r1, r2 = calculate2(10, 5)
print(r1)
print(r2)
---
# 출력
# 15
# 50

 

8.3. 예외 처리

  • 함수 내에서 발생할 수 있는 오류에 대한 사전 처리를 해주는 것이 좋다.
  • 다음 함수는 오류에 대한 처리가 없어 함수 사용 시 오류가 발생한다.
# 함수 만들기
def divide(a, b) :
    result = a / b
    return result

# 함수 사용
divide(10, 0)   # 분모는 0이 될 수 없다.
---
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
Cell In[151], line 7
      4     return result
      6 # 함수 사용
----> 7 divide(10, 0)

Cell In[151], line 3, in divide(a, b)
      2 def divide(a, b) :
----> 3     result = a / b
      4     return result

ZeroDivisionError: division by zero

 

1) 입력 오류 처리

  • 조건문을 사용하여 나누는 값, 즉 분모가 0인 경우에 대한 처리를 함수에 추가
# 함수 만들기
def divide(a, b) :
    if b == 0 :
        print('나누는 값이 0이 될 수 없습니다.')
        return
    else :
        result = a / b
        return result

# 함수 사용
result = divide(10, 0)   # 예측 가능한 에러에 대해서는 대처하는 것이 좋다.
print(result)
---
# 출력
# 나누는 값이 0이 될 수 없습니다.
# None

 

2) 입력 데이터 형식 확인

  • 입력되는 데이터 형식이 적절한지 확인하는 구문을 함수에 추가하여 에러에 대체할 수 있다.
# 함수 만들기
def divide(a, b) :
    if b == 0 :
        return 'ERR: 나누는 값이 0이 될 수 없습니다.'
    elif (type(a) != int) or (type(b) != int):
        return 'ERR: 정수 연산만 가능합니다.'
    else:
        return a / b

# 함수 사용
a = divide(10, 0)
b = divide(10, 'ab')
c = divide(10, 2)

# 확인
print(a, b, c, sep='\n')
---
# 출력
# ERR: 나누는 값이 0이 될 수 없습니다.
# ERR: 정수 연산만 가능합니다.
# 5.0

 

참고: 변수 우선 순위 (LEGB)

  • L: Local - 함수 안에서 선언된 변수
  • E: Enclosing - 함수가 함수를 호출한 경우 안쪽 함수 입장에서 밖의 함수가 선언한 변수
    • 쉽게 말해서 자신을 호출한 함수의 로컬 변수
  • G: Global - 함수 밖에서 선언한 전역 변수
  • B: Built-in - 파이썬이 기본적으로 제공하는 함수

※ 로컬 변수와 글로별 변수를 구분하는 것은 매우 중요하므로 코드 작성 시 주의해야 한다.

# 함수 선언
def test():
    global member              # 함수 안에서 전역 변수를 마음대로 다루겠다는 선언!!!
    print(member)              # member: 전역 변수
    member = [1, 2, 3, 4, 5]   # 전역 변수 재선언 가능
    print(member)

# 리스트 변수 선언
member = ['홍길동', '일지매', '한사랑']

# 함수 사용
test()
print('-' * 20)
print(member)
---
# 출력
# ['홍길동', '일지매', '한사랑']
# [1, 2, 3, 4, 5]
# --------------------
# [1, 2, 3, 4, 5]

→ 기본적으로 함수 안에서 전역 변수를 재선언 할 수는 없다. 재선언 시 오류 발생

 

8.4. 내장 함수

  • Python에서 기존에 제공하고 있는 많은 함수를 알고 사용할 수 있어야 한다.
  • 중요한 함수들이 많으니 교안 참고

'에이블스쿨 6기 DX 트랙 > 일일 복습' 카테고리의 다른 글

DAY 07. 데이터프레임 생성  (3) 2024.09.18
DAY 07. 넘파이 기초  (1) 2024.09.18
DAY 04. 제어문  (0) 2024.09.11
DAY 03. 딕셔너리 자료형  (3) 2024.09.06
DAY 03. 집합 자료형  (0) 2024.09.06