[파이썬 개념 8] 함수
print(), len(), int() 처럼 지금까지 써 온 것들은 모두 함수입니다. 이 글에서는 함수를 직접 만드는 방법을 알아봅니다.
함수를 만들 줄 알면 긴 프로그램을 작은 조각으로 나누어 생각할 수 있습니다.
1. 함수가 필요한 이유
- 반복을 줄인다: 같은 코드를 여러 번 쓰지 않고 이름만 부른다.
- 고치기 쉽다: 규칙이 바뀌면 함수 한 곳만 고친다.
- 나누어 생각한다: 큰 문제를 "판정하는 함수", "세는 함수" 처럼 작은 일로 나눈다.
2. 함수 만들고 부르기
def greet():
print("안녕하세요")
print("푸름OJ입니다")
greet()
greet()
실행 결과
안녕하세요
푸름OJ입니다
안녕하세요
푸름OJ입니다
def 함수이름():으로 만들고, 할 일을 들여쓰기해서 씁니다.def는 함수를 만들기만 합니다.greet()처럼 불러야 실행됩니다.- 함수는 만든 다음에 불러야 합니다.
hello()
def hello():
print("hi")
실행 결과
NameError: name 'hello' is not defined. Did you mean: 'help'?
3. 매개변수와 인자
괄호 안에 이름을 쓰면, 함수를 부를 때 넘겨준 값이 그 이름에 담깁니다.
함수를 만들 때 쓴 이름을 매개변수, 부를 때 넘기는 값을 인자라고 합니다.
def greet(name): # name: 매개변수
print(f"{name}님, 안녕하세요")
greet("푸름") # "푸름": 인자
greet("소담")
실행 결과
푸름님, 안녕하세요
소담님, 안녕하세요
여러 개를 받을 때는 쉼표로 나눕니다. 넘기는 순서대로 담깁니다.
def show(name, score):
print(f"{name}: {score}점")
show("보람", 92)
show(85, "새롬")
실행 결과
보람: 92점
85: 새롬점
두 번째 줄은 순서를 바꾸어 넘겨서 엉뚱하게 출력되었습니다. 헷갈리면 이름을 붙여 넘길 수 있습니다.
def show(name, score):
print(f"{name}: {score}점")
show(score=85, name="새롬")
실행 결과
새롬: 85점
기본값
매개변수에 기본값을 주면, 부를 때 생략할 수 있습니다.
def greet(name, msg="안녕하세요"):
print(f"{name}님, {msg}")
greet("푸름")
greet("푸름", "반갑습니다")
실행 결과
푸름님, 안녕하세요
푸름님, 반갑습니다
4. return: 결과 돌려주기
return 은 함수의 결과를 부른 곳으로 돌려줍니다. 돌려받은 값은 변수에 담거나, 출력하거나, 다른 계산에 쓸 수 있습니다.
def average(a, b, c):
return (a + b + c) / 3
avg = average(80, 90, 100)
print(avg)
print(f"{average(70, 75, 81):.1f}")
print(average(80, 90, 100) >= 60)
실행 결과
90.0
75.3
True
print 와 return 의 차이
def add_print(a, b):
print(a + b)
def add_return(a, b):
return a + b
x = add_print(3, 4)
y = add_return(3, 4)
print("x:", x, "y:", y)
실행 결과
7
x: None y: 7
| return | ||
|---|---|---|
| 하는 일 | 화면에 보여 준다 | 부른 곳에 값을 돌려준다 |
| 결과를 변수에 담으면 | None (값 없음) |
그 값 |
결과를 다른 계산에 이어서 써야 하면 return 입니다. 함수 안에서는 계산만 하고 돌려주고, 출력은 밖에서 하는 습관이 좋습니다.
return 을 만나면 함수가 끝난다
def grade(score):
if score >= 90:
return "A"
if score >= 80:
return "B"
return "C"
print(grade(95), grade(85), grade(50))
실행 결과
A B C
return "A" 를 실행하면 그 자리에서 함수가 끝나므로 아래 if 는 검사하지 않습니다. 그래서 elif 를 쓰지 않아도 됩니다.
여러 값 돌려주기
쉼표로 나누어 돌려주면 받을 때도 여러 변수로 나누어 받습니다.
def min_max(nums):
return min(nums), max(nums)
lo, hi = min_max([7, 2, 9, 4])
print(lo, hi)
실행 결과
2 9
5. 지역 변수와 전역 변수
함수 안에서 만든 변수(지역 변수)는 함수 안에서만 쓸 수 있습니다.
def make():
secret = 42
return secret
print(make())
print(secret)
실행 결과
NameError: name 'secret' is not defined
함수 밖에서 만든 변수(전역 변수)는 함수 안에서 읽을 수는 있지만, 그 값에 의존하면 함수를 이해하기 어려워집니다.
필요한 값은 매개변수로 받고, 결과는 return 으로 돌려주는 것이 원칙입니다.
count = 0
def add_one(c):
return c + 1
count = add_one(count)
count = add_one(count)
print(count)
실행 결과
2
6. 함수로 나누어 문제 풀기
"리스트에서 소수가 몇 개인지 세기" 를 두 함수로 나누어 봅시다.
def is_prime(n):
if n < 2:
return False
for d in range(2, n):
if n % d == 0:
return False
return True
def count_primes(nums):
count = 0
for n in nums:
if is_prime(n):
count += 1
return count
print(is_prime(7), is_prime(9), is_prime(1))
print(count_primes([2, 3, 4, 5, 9, 11, 1]))
실행 결과
True False False
4
is_prime은 한 수가 소수인지만 판단합니다.count_primes는 개수 세는 일만 하고, 판단은is_prime에게 맡깁니다.
함수 하나가 한 가지 일만 하도록 나누면, 각각을 따로 시험해 볼 수 있어서 틀린 곳을 찾기 쉽습니다.
7. 함수 설계 순서
- 함수가 무엇을 받아서(매개변수) 무엇을 돌려줄지(return) 먼저 정한다.
- 이름을 하는 일이 드러나게 짓는다.
is_even,average,grade - 안쪽 코드를 쓴다.
- 여러 값을 넣어 불러 보며 확인한다. 경계값도 넣는다.
8. 자주 쓰는 내장 함수
| 함수 | 하는 일 |
|---|---|
print(), input() |
출력, 입력 |
int(), float(), str() |
자료형 바꾸기 |
len() |
개수, 글자 수 |
sum(), max(), min() |
합계, 최댓값, 최솟값 |
abs() |
절댓값 |
round(값, 자릿수) |
반올림 |
range() |
수의 범위 |
sorted() |
정렬한 새 리스트 |
type() |
자료형 확인 |
print(abs(-7), round(3.14159, 2), max(3, 9, 4))
실행 결과
7 3.14 9
정리
| 내용 | 모양 |
|---|---|
| 만들기 | def 이름(매개변수): |
| 부르기 | 이름(인자) |
| 돌려주기 | return 값 |
| 기본값 | def f(a, b=10): |
| 여러 값 | return a, b / x, y = f() |
- 만들기만 하면 실행되지 않는다. 불러야 실행된다.
print는 보여 주기,return은 돌려주기. 계산 결과는 return.- 함수 안의 변수는 함수 안에서만 쓸 수 있다. 값은 매개변수로 받고 return 으로 돌려준다.
- 함수 하나는 한 가지 일만.
확인 문제
- 다음 코드의 출력은?
def f(x): return x * 2 print(f(f(3))) - 짝수이면 True, 홀수이면 False 를 돌려주는 함수
is_even(n)을 쓰세요. - 함수 안에서
print만 하고return을 쓰지 않으면, 그 함수의 결과를 변수에 담았을 때 무엇이 담기나요?
연습해 보기
앞에서 푼 문제를 함수로 다시 짜 봅시다.
- 1043 성적 등급: 점수를 받아 등급을 돌려주는
grade(score) - 1047 윤년: 윤년이면 True 를 돌려주는
is_leap(year) - 1057 최대공약수: 두 수를 받아 최대공약수를 돌려주는
gcd(a, b) - 1062 소수 판정:
is_prime(n) - 1121 팩토리얼:
factorial(n)
확인 문제 정답
12: 안쪽f(3)이 6이 되고, 다시f(6)이 12가 됩니다.- 예시
def is_even(n): return n % 2 == 0 None(값 없음)
댓글 0
로그인하면 댓글을 쓸 수 있습니다.