안녕하세요, MoonLight입니다.
이번 Post에서는 Python의 함수에 대해서 알아보도록 하겠습니다.
1. 기본사항
Python의 함수는 코드를 재사용하고, 가독성을 높이며, 유지보수를 쉽게 하기 위해 사용되는 핵심적인 구성 요소입니다.
함수는 특정 작업을 수행하는 코드의 블록으로, 필요할 때 호출하여 실행합니다.
1.1. 함수의 기본 구조
Python에서 함수는 def 키워드로 정의되며, 다음 구조를 따릅니다:
def 함수이름(매개변수1, 매개변수2, ...):
"""
함수의 설명 (선택 사항)
"""
# 실행할 코드
return 반환값 # 선택 사항
예제
def greet(name):
"""
이 함수는 이름을 받아서 환영 메시지를 반환합니다.
"""
return f"Hello, {name}!"
사용:
message = greet("Alice")
print(message)
출력:
Hello, Alice!
1.2. 함수 호출
함수는 정의된 후 이름과 괄호를 사용하여 호출합니다.
기본 호출
def add(a, b):
return a + b
result = add(3, 5) # 함수 호출
print(result)
출력:
8
1.3. 매개변수와 인자
위치 인자 (Positional Arguments)
인자의 순서가 중요합니다.
def subtract(a, b):
return a - b
print(subtract(10, 5))
출력:
5
print(subtract(5, 10))
출력:
-5
키워드 인자 (Keyword Arguments)
인자의 이름을 명시적으로 지정하여 순서를 변경할 수 있습니다.
print(subtract(b=10, a=5))
출력:
-5
기본값을 가진 매개변수 (Default Arguments)
기본값을 설정하면 값을 전달하지 않을 경우 기본값이 사용됩니다.
def greet(name, message="Hello"):
return f"{message}, {name}!"
print(greet("Alice")) # 출력: Hello, Alice!
print(greet("Alice", "Hi")) # 출력: Hi, Alice!
1.4. 반환값 (Return Values)
단일 반환값
def square(x):
return x * x
print(square(4))
출력:
16
다중 반환값
return을 사용해 여러 값을 반환할 수 있습니다.
def divide(a, b):
quotient = a // b
remainder = a % b
return quotient, remainder
q, r = divide(10, 3)
print(q, r)
출력:
3 1
1.5. 가변 인자
임의 개수의 위치 인자 (args)
args는 여러 개의 위치 인자를 튜플로 받아옵니다.
def sum_all(*args):
return sum(args)
print(sum_all(1, 2, 3, 4)) # 출력: 10
임의 개수의 키워드 인자 (kwargs)
kwargs는 여러 개의 키워드 인자를 딕셔너리로 받아옵니다.
def display_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
display_info(name="Alice", age=30, city="New York")
출력:
name: Alice
age: 30
city: New York
1.6. 함수의 스코프(Scope)
지역 변수(Local Variables)
함수 내부에서 선언된 변수는 함수 내부에서만 접근 가능합니다.
def example():
x = 10 # 지역 변수
print(x)
example()
# print(x) # 오류: x는 함수 외부에서 접근할 수 없음
전역 변수(Global Variables)
함수 외부에서 선언된 변수는 전역적으로 접근 가능합니다. 단, 함수 내부에서 전역 변수를 수정하려면 global 키워드를 사용해야 합니다.
y = 5 # 전역 변수
def modify_global():
global y
y = 10
modify_global()
print(y)
출력:
10
1.7. Lambda 함수 (익명 함수)
Lambda 함수는 간단한 작업을 수행하는 함수로, 한 줄로 작성됩니다.
square = lambda x: x * x
print(square(4))
출력:
16
add = lambda a, b: a + b
print(add(3, 5))
출력:
8
1.8. 고급 기능
재귀 함수(Recursion Function)
함수에서 자신을 호출하는 함수입니다. 주로 재귀적인 문제 해결에 사용됩니다.
def factorial(n):
if n == 0:
return 1
return n * factorial(n - 1)
print(factorial(5))
출력:
120
중첩 함수
함수 내부에서 다른 함수를 정의할 수 있습니다.
def outer_function(x):
def inner_function(y):
return x + y
return inner_function
add_five = outer_function(5)
print(add_five(3))
출력:
8
클로저(Closure)
중첩 함수에서 외부 함수의 변수를 기억하는 함수입니다.
def make_multiplier(n):
def multiplier(x):
return n * x
return multiplier
double = make_multiplier(2)
print(double(5))
출력:
10
1.9. 함수 데코레이터(Decorator)
Decorator는 기존 함수를 수정하거나 확장하는 데 사용되는 고급 문법입니다.
함수나 클래스를 "장식"하여 그 동작을 변경하거나 확장할 수 있도록 합니다.
데코레이터는 고차 함수(higher-order function)의 한 예입니다.
def decorator(func):
def wrapper():
print("Before the function call")
func()
print("After the function call")
return wrapper
@decorator
def say_hello():
print("Hello!")
say_hello()
출력:
Before the function call
Hello!
After the function call
1.10. 예제: 다양한 함수 활용
예제: 피보나치 수열 계산
def fibonacci(n):
fib = [0, 1]
for i in range(2, n):
fib.append(fib[-1] + fib[-2])
return fib
print(fibonacci(10))
출력:
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
1.11. 결론
Python의 함수는 코드 재사용성과 모듈화를 높이는 강력한 도구입니다.
def 키워드로 정의하며, 매개변수, 반환값, 스코프, 데코레이터 등 다양한 기능을 지원합니다.
간단한 작업에는 람다 함수를, 복잡한 로직에는 일반 함수를 사용하는 것이 좋습니다.
2. 예제
Ex. 1. "비트코인" 문자열을 화면에 출력하는 print_coin() 함수를 정의하라.
def print_coin():
print("비트코인")
Ex. 2. 1번에서 정의한 함수를 호출하라.
def print_coin():
print("비트코인")
print_coin()
출력:
비트코인
Ex. 3. 1번에서 정의한 print_coin 함수를 100번호출하라.
def print_coin():
print("비트코인")
for _ in range(100):
print_coin()
출력:
비트코인
비트코인
비트코인
비트코인
.
.
.
.
비트코인
비트코인
비트코인
비트코인
비트코인
비트코인
비트코인
비트코인
비트코인
비트코인
비트코인
비트코인
비트코인
Ex. 4. "비트코인" 문자열을 100번 화면에 출력하는 print_coins() 함수를 정의하라.
def print_coins():
for _ in range(100):
print("비트코인")
Ex. 5. 아래의 에러가 발생하는 이유에 대해 설명하라.
hello()
def hello():
print("Hi")
실행 예
NameError: name 'hello' is not defined
함수를 정의하기 전에 Call했기 때문에 hello()라는 함수를 알 수 없어서 위와 같은 Error가 발생합니다.
Ex. 6. 아래 코드의 실행 결과를 예측하라.
def message() :
print("A")
print("B")
message()
print("C")
message()
출력:
A
B
C
A
B
Ex. 7. 아래 코드의 실행 결과를 예측하라. (읽기 어려운 코드의 예입니다.)
print("A")
def message() :
print("B")
print("C")
message()
출력:
A
C
B
Ex. 8. 아래 코드의 실행 결과를 예측하라. (읽기 어려운 코드의 예입니다.)
print("A")
def message1() :
print("B")
print("C")
def message2() :
print("D")
message1()
print("E")
message2()
출력:
A
C
B
E
D
Ex. 9. 아래 코드의 실행 결과를 예측하라.
def message1():
print("A")
def message2():
print("B")
message1()
message2()
출력:
B
A
Ex. 10. 아래 코드의 실행 결과를 예측하라.
def message1():
print("A")
def message2():
print("B")
def message3():
for i in range (3) :
message2()
print("C")
message1()
message3()
출력:
B
C
B
C
B
C
A
Ex. 11. 함수의 호출 결과를 예측하라.
def 함수(문자열) :
print(문자열)
함수("안녕")
함수("Hi")
출력:
안녕
Hi
Ex. 12. 함수의 호출 결과를 예측하라.
def 함수(a, b) :
print(a + b)
함수(3, 4)
함수(7, 8)
출력:
7
15
Ex. 13. 아래와 같은 에러가 발생하는 원인을 설명하라.
def 함수(문자열) :
print(문자열)
함수()
TypeError: 함수() missing 1 required positional argument: '문자열'
함수 파라미터가 선언과 사용에서 다르다.
함수 선언시에는 Parameter를 '문자열'이라는 Parameter를 주어야 하지만, 실제 Call할 때는 아무 Parameter를 주지 않고 호출하였다.
Ex. 14. 아래와 같은 에러가 발생하는 원인을 설명하라.
def 함수(a, b) :
print(a + b)
함수("안녕", 3)
TypeError: must be str, not int
첫번째 Parameter가 선언은 int인데, Call할 때는 문자열을 사용을 하여서 Parameter가 Mis Match여서 Error가 발생.
Ex. 15. 하나의 문자를 입력받아 문자열 끝에 ":D" 스마일 문자열을 이어 붙여 출력하는 print_with_smile 함수를 정의하라.
def print_with_smile(s):
return s+":D"
Ex. 16. 15에서 정의한 함수를 호출하라. 파라미터는 "안녕하세요"로 입력하라.
def print_with_smile(s):
return s+":D"
print_with_smile("안녕하세요")
출력:
'안녕하세요:D'
Ex. 17. 현재 가격을 입력 받아 상한가 (30%)를 출력하는 print_upper_price 함수를 정의하라.
def print_upper_price(p):
return p*1.3
Ex. 18. 두 개의 숫자를 입력받아 두 수의 합을 출력하는 print_sum 함수를 정의하라.
def print_sum(a,b):
return a+b
Ex. 19. 두 개의 숫자를 입력받아 합/차/곱/나눗셈을 출력하는 print_arithmetic_operation 함수를 작성하라.
print_arithmetic_operation(3, 4)
3 + 4 = 7
3 - 4 = -1
3 * 4 = 12
3 / 4 = 0.75
def print_arithmetic_operation(a,b):
print("{} + {} = {}".format(a,b,a+b))
print("{} - {} = {}".format(a,b,a-b))
print("{} * {} = {}".format(a,b,a*b))
print("{} / {} = {}".format(a,b,a/b))
print_arithmetic_operation(3,4)
Ex. 20. 세 개의 숫자를 입력받아 가장 큰수를 출력하는 print_max 함수를 정의하라. 단 if 문을 사용해서 수를 비교하라.
def print_max(a,b,c):
if a>b and a>c:
print(a)
elif b>a and b>c:
print(b)
elif c>a and c>b:
print(c)
print_max(1,2,3)
출력:
3
Ex. 21. 입력된 문자열을 역순으로 출력하는 print_reverse 함수를 정의하라.
print_reverse("python")
nohtyp
def print_reverse(str):
for i in range(len(str)-1,-1,-1):
print(str[i],end='')
print_reverse('python')
출력:
nohtyp
Ex. 22. 성적 리스트를 입력 받아 평균을 출력하는 print_score 함수를 정의하라.
print_score ([1, 2, 3])
2.0
def print_score(score):
sum = 0
for i in score:
sum += i
print(sum/len(score))
print_score([1,2,3])
출력:
2.0
Ex. 23. 하나의 리스트를 입력받아 짝수만 화면에 출력하는 print_even 함수를 정의하라.
print_even ([1, 3, 2, 10, 12, 11, 15])
2
10
12
def print_even(l):
for i in l:
if i%2 == 0:
print(i)
print_even ([1, 3, 2, 10, 12, 11, 15])
출력:
2
10
12
Ex. 24. 하나의 딕셔너리를 입력받아 딕셔너리의 key 값을 화면에 출력하는 print_keys 함수를 정의하라.
print_keys ({"이름":"김말똥", "나이":30, "성별":0})
이름
나이
성별
def print_keys(d : dict):
for i in d.keys():
print(i)
print_keys ({"이름":"김말똥", "나이":30, "성별":0})
출력:
이름
나이
성별
Ex. 25. my_dict에는 날짜를 키값으로 OHLC가 리스트로 저장돼 있다.
my_dict = {"10/26" : [100, 130, 100, 100],
"10/27" : [10, 12, 10, 11]}
my_dict와 날짜 키값을 입력받아 OHLC 리스트를 출력하는 print_value_by_key 함수를 정의하라.
print_value_by_key (my_dict, "10/26")
[100, 130, 100, 100]
def print_value_by_key(d : dict,
date : str):
print(d[date])
my_dict = { "10/26" : [100, 130, 100, 100],
"10/27" : [10, 12, 10, 11]}
print_value_by_key (my_dict, "10/26")
출력:
[100, 130, 100, 100]
Ex. 26. 입력 문자열을 한 줄에 다섯글자씩 출력하는 print_5xn(string) 함수를 작성하라.
print_5xn("아이엠어보이유알어걸")
아이엠어보
이유알어걸
def print_5xn(s : str):
for i in range(len(s)):
print(s[i],end='')
if i != 0 and (i+1)%5 == 0:
print()
print_5xn("아이엠어보이유알어걸")
출력:
아이엠어보
이유알어걸
Ex. 27. 문자열과 한줄에 출력될 글자 수를 입력을 받아 한 줄에 입력된 글자 수만큼 출력하는 print_mxn(string) 함수를 작성하라.
printmxn("아이엠어보이유알어걸", 3)
아이엠
어보이
유알어
걸
def printmxn(s : str,
n : int):
for i in range(len(s)):
print(s[i],end='')
if i != 0 and (i+1)%n == 0:
print()
printmxn("아이엠어보이유알어걸", 3)
출력:
아이엠
어보이
유알어
걸
def printmxn(s : str,
n : int):
for i in range(len(s)):
print(s[i],end='')
if i != 0 and (i+1)%n == 0:
print()
printmxn("아이엠어보이유알어걸", 3)
출력:
아이엠
어보이
유알어
걸
Ex. 28. 연봉을 입력받아 월급을 계산하는 calc_monthly_salary(annual_salary) 함수를 정의하라. 회사는 연봉을 12개월로 나누어 분할 지급하며, 이 때 1원 미만은 버림한다.
calc_monthly_salary(12000000)
1000000
def calc_monthly_salary(annual_salary : int):
print(int(((annual_salary/12)/10000)*10000))
calc_monthly_salary(12000000)
출력:
1000000
Ex. 29. 아래 코드의 실행 결과를 예측하라.
def my_print (a, b) :
print("왼쪽:", a)
print("오른쪽:", b)
my_print(a=100, b=200)
my_print(b=100, a=200)
출력:
왼쪽: 100
오른쪽: 200
왼쪽: 200
오른쪽: 100
def my_print (a, b) :
print("왼쪽:", a)
print("오른쪽:", b)
my_print(a=100, b=200)
my_print(b=100, a=200)
출력:
왼쪽: 100
오른쪽: 200
왼쪽: 200
오른쪽: 100
함수 Call 시에 Parameter 이름을 적시하는 경우에는 Parameter 순서와 상관없이 이름을 우선시하여 Parameter를 전달합니다.
Ex. 30. 아래 코드의 실행 결과를 예측하라.
def my_print (a, b) :
print("왼쪽:", a)
print("오른쪽:", b)
my_print(b=100, a=200)
출력:
왼쪽: 200
오른쪽: 100
Ex. 31. 아래 코드를 실행한 결과를 예상하라.
def n_plus_1 (n) :
result = n + 1
n_plus_1(3)
print (result)
출력:
에러 발생
result라는 변수는 함수안에서 사용한 변수이기 때문에 함수 바깥에서는 Access할 수 없습니다.
Ex. 32. 문자열 하나를 입력받아 인터넷 주소를 반환하는 make_url 함수를 정의하라.
make_url("naver")
www.naver.com
def make_url(url : str):
print("www."+url+".com")
make_url("naver")
출력:
www.naver.com
Ex. 33. 문자열을 입력받아 각 문자들로 구성된 리스트로 반환하는 make_list 함수를 정의하라.
make_list("abcd")
['a', 'b', 'c', 'd']
def make_list(s : str):
l = []
for i in range(len(s)):
l.append(s[i])
print(l)
make_list("abcd")
출력:
['a', 'b', 'c', 'd']
Ex. 34. 숫자로 구성된 하나의 리스트를 입력받아, 짝수들을 추출하여 리스트로 반환하는 pickup_even 함수를 구현하라.
pickup_even([3, 4, 5, 6, 7, 8])
[4, 6, 8]
def pickup_even(num : list):
for i in num:
if i%2 == 0:
print(i)
pickup_even([3, 4, 5, 6, 7, 8])
출력:
4
6
8
Ex. 35. 콤마가 포함된 문자열 숫자를 입력받아 정수로 변환하는 convert_int 함수를 정의하라.
convert_int("1,234,567")
1234567
def convert_int(num : str):
num = num.replace(",","")
return int(num)
convert_int("1,234,567")
출력:
1234567
Ex. 36. 아래 코드의 실행 결과를 예측하라.
def 함수(num) :
return num + 4
a = 함수(10)
b = 함수(a)
c = 함수(b)
print(c)
출력:
22
Ex. 37. 아래 코드의 실행 결과를 예측하라.
def 함수(num) :
return num + 4
c = 함수(함수(함수(10)))
print(c)
출력:
22
Ex. 38. 아래 코드의 실행 결과를 예측하라.
def 함수1(num) :
return num + 4
def 함수2(num) :
return num * 10
a = 함수1(10)
c = 함수2(a)
print(c)
출력:
140
Ex. 39. 아래 코드의 실행 결과를 예측하라.
def 함수1(num) :
return num + 4
def 함수2(num) :
num = num + 2
return 함수1(num)
c = 함수2(10)
print(c)
출력:
16
Ex. 40. 아래 코드의 실행 결과를 예측하라.
def 함수0(num) :
return num * 2
def 함수1(num) :
return 함수0(num + 2)
def 함수2(num) :
num = num + 10
return 함수1(num)
c = 함수2(2)
print(c)
출력:
28
도움이 되셨으면 좋겠네요.
다른 강좌도 참고하시면 좋을 것 같습니다. 각 강좌의 Link는 아래를 참고하시기 바랍니다.
Python 강좌 01 - print()
Python 강좌 02 - 변수
Python 강좌 03 - 문자열
Python 강좌 04 - List
Python 강좌 05 - Tuple
Python 강좌 06 - Dictionary
Python 강좌 07 - 분기문
Python 강좌 08 - 반복문
Python 강좌 09 - 함수
Python 강좌 10 - Module
Python 강좌 11 - Class
Python 강좌 12 - File & Exception
'Development Tip' 카테고리의 다른 글
Python 강좌 11 - Class (0) | 2024.12.23 |
---|---|
Python 강좌 10 - Module (0) | 2024.12.23 |
Python 강좌 08 - 반복문 (0) | 2024.12.23 |
Python 강좌 07 - 분기문 (0) | 2024.12.23 |
Python 강좌 06 - Dictionary (0) | 2024.12.23 |