Python

[Python / 기초] 파이썬 함수 - 선언, 호출, 인자, lambda, 재귀

씨주 2024. 1. 12. 10:33

📍 함수(function)

 

✅ 함수의 선언과 호출

✔️ 함수의 선언

def func_name(parameter1, parameter2):
    code1
    code2
    .
    .
    .
    return value

✔️ 함수의 호출(실행)

func_name(parameter1, parameter2)

# 직사각형의 넓이, 둘레
def rectangle(height, width):
    area = height * width
    perimeter = (height + width) * 2
    print(area, perimeter)
    
rectangle(100, 50) # 5000 300
rectangle(10, 20) # 200 60

 

✅ 함수의 return

  • 함수가 return을 만나면 해당 값을 반환하고 함수를 종료
  • 만약 return이 없다면 None을 자동으로 반환
  • return은 오직 하나의 객체만 반환
def my_max(num1, num2):
    return 'hello' 
    
    if num1 > num2:
        return num1
    elif num1 == num2:
        print('같습니다.')
    else:
        return num2
        
my_max(1,2) # 'hello'
def my_list_max(list1, list2):
    if sum(list1) > sum(list2):
        return list1
    else:
        return list2
        
my_list_max([1, 2, 3], [4, 5, 6]) # [4, 5, 6]

 

✅ 함수의 인자

✔️ 위치인자

: 기본적으로 함수는 인자의 위치로 판단

def cylinder(r, h):
    return 3.14 * r**2 * h

# 인수 위치따라 값 다름
print(cylinder(10, 5)) # 1570.0
print(cylinder(5, 10)) # 785.0

 

✔️ 기본값

def func(p1=v1):
    code
    .
    .
    .
    return p1

def greeting(name='익명'):
    return f'{name}님 안녕하세요!!'
    
greeting('heeju') # 'heeju님 안녕하세요!!'
greeting() # '익명님 안녕하세요!!'

 

# 기본값이 있는 인자를 뒤쪽에 배치하지 않을 시 error 발생
def greeting(name='익명', age):
    return f'{name}님은 {age}살입니다.'
더보기
  Cell In[13], line 1
    def greeting(name='익명', age):
                            ^
SyntaxError: non-default argument follows default argument
# 기본값이 있는 인자를 선언하지 않을 수 있기 때문에 함수 정의 시 뒤쪽에 배열해야 함
def greeting(age, name='익명'):
    return f'{name}님은 {age}살입니다.'
    
print(greeting(10)) # 익명님은 10살입니다.

 

✔️  키워드 인자

: 함수를 호출할 때 내가 원하는 위치에 직접적으로 특정인자를 전달 가능

 

def greeting(age, name='익명'):
    return f'{name}님은 {age}살입니다.'
    
print(greeting(10)) # 익명님은 10살입니다.
# 인자 위치를 변경하여 사용가능
print(greeting(name='홍길동', age=30)) # 홍길동님은 30살입니다.

 

✔️  가변 인자 리스트

: 인자를 여러개 받아올 수 있음

def func(*parms):
    code
    .
    .
    .

# 여러 개의 숫자를 받아 그 중 가장 큰 수를 리턴
def my_max(*numbers):
    result = numbers[0]
    
    for number in numbers:
        if result < number:
            result = number

    return result
    
print(my_max(1, 2, 3, 4, 5)) # 5
print(my_max(-1, -2, -3)) # -1

 

✔️  정의되지 않은 키워드 인자 처리하기

def func(**kwargs):
    code
    .
    .
    .

def fake_dict(**kwargs):
    for key, value in kwargs.items():
        print(f'{key}는 {value}입니다.')
        
fake_dict(korean='안녕', english='hello')
# korean는 안녕입니다.
# english는 hello입니다.

 

✔️  dictionary를 인자로 넣기(unpacking)

def sign_up(id, pw, pw_confirmation):
    if pw == pw_confirmation:
        print(f'{id}님 회원가입이 완료되었습니다.')
    else:
        print('비밀번호가 일치하지 않습니다.')
        
sign_up('change', '1234', '1234') # change님 회원가입이 완료되었습니다.
sign_up('change2', '1234', '12345') # 비밀번호가 일치하지 않습니다.
account = {
    'id': 'change',
    'pw': '1234',
    'pw_confirmation': '1234',
}
sign_up(**account) # change님 회원가입이 완료되었습니다.

 

✔️   lambda 표현식

: 일회성(임시) 함수

lambda parameter: expression

(lambda x, y: x + y)(1, 2) # 3

# 위와 같은 함수
def my_sum(x, y):
    return x + y

print(my_sum(1, 2)) # 3

 

✔️   타입힌트

def my_sum(a: int, b: int): # 인자 타입을 힌트
    return a + b
    
my_sum(1, 2) # 3

 

✔️   이름공간(scope)

: python에서 사용되는 이름들은 이름공간(namespace)에 저장됨

  • Local scope : 정의된 함수 내부
  • Enclosed scope : 상위 함수
  • Global scope : 함수 밖의 변수 혹은 import된 모듈
  • Built-in scope : python이 기본적으로 가지고 있는 함수 혹은 변수
str = '123'
print(str) # 123
# local scope에 str을 정의하였기 때문에 Built-in scope 오류 발생
str(123)
더보기
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[30], line 1
----> 1 str(123)

TypeError: 'str' object is not callable
del str
str(123) # '123'
a = 1

def local_scope(a):
    print(a)

# def 안의 a 값
local_scope(5) # 5
# def 밖의 a 값
print(a) # 1
# global 메소드로 def 밖의 a 사용 가능
a = 10

def global_scope():
    global a # def 밖의 a 값 사용
    print(a)

global_scope() # 10

 

✅ 재귀함수(recursive)

: 함수 내부에서 자기 자신을 호출하는 함수

✔️   팩토리얼

  • n! = 1 * 2 * 3 * ... * n
# 반복문
def fact(n):
    result = 1

    while n > 1:
        result = result * n
        n = n - 1
    return result

print(fact(5)) # 120
# 재귀
def factorial(n):
    if n <= 1:
        return 1
    else:
        return factorial(n-1) * n

print(factorial(5)) # 120

 

✔️   피보나치 수열

  • F(0) = F(1) = 1
  • F(N) = F(N-1) + F(N-2)
# 반복문
def fib_loop(n):
    result = [1, 1]

    for i in range(1, n):
        end1 = result[-1]
        end2 = result[-2]

        fib_num = end1 + end2

        result.append(fib_num)

    return result[-1]

print(fib_loop(10)) # 89
# 재귀
def fib_rec(n):
    if n == 0 or n == 1:
        return 1
    else:
        return fib_rec(n-1) + fib_rec(n-2)

print(fib_rec(10)) # 89