Development Tip

Python 강좌 09 - 함수

MoonLight314 2024. 12. 23. 11:07
728x90

안녕하세요, 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
728x90

'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