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