Python - def

김기훈·2025년 10월 26일

Python

목록 보기
4/8

함수(def)

  • 함수를 정의할때 사용하는 매개변수의 개수와 호출시 입력되는 매개변수의 개수동일해야함
    • 매개변수가 2개인데 입력을 1개만 하거나 입력을 3개하면 오류발생

기본 구조

# 1. return값이 없기 때문에 None 출력
def function(x, y):
    z = x + y

print(function(10, 2))  

# 2. return x + y 도 가능
def function(x, y):
    z = x + y
    return z
    
print(function(10, 2)) # 12

전역변수

# 1
a = 100 # 전역변수

def f(): 
    global a # 함수 밖에 있는 전역변수를 안으로 끌고옴
    a = a + 1
    return a # f() = 101

# 2. dict값은 전역변수의 값을 지역변수로 가져올 수 있다. 즉, global 필요없음
won = {'A등급':1000, 'B등급':500, 'C등급':100} # 전역변수

def 계산(a, b, c):
    합계 = won['A등급']* a + won['B등급'] *b + won['C등급']*c
    return 합계 # 지역변수 자리 

print(계산(5, 2, 3), '원') # 6300원

매개변수

기본 매개변수

  • 매개변수 자리에 기본값을 설정해 놓은 것
    • 기본값을 설정해놓은 매개변수 자리에 아무것도 들어가지 않을경우 기본값 출력
      • 주의 ⚠️ : 일반매개변수 앞에 기본매개변수를 배치하면 안된다.((n=2, value) 안됨)
def oz(value, n=2):
    for i in range(n):      출력 : 하나
        print(value)              하나

oz("하나")
oz("하나" , n=5 ) # 실행시에 n=2가 있어도 5번 반복

가변 매개변수( *args )

  • *args
    • 위치 기반 인자를 튜플(tuple)로 받는다.
    • 몇개가 들어올지 모를 때 사용한다.
      • * 이 중요한거고 이름은 상관없다.(관례상 args를 자주 사용)
  • 주의 ⚠️
    • 가변매개변수를 일반매개변수 앞에쓰면 실행불가 : (*values,n)
    • 가변 매개변수는 한개만 사용 가능
def 함수이름(매개변수, *가변 매개변수):
    코드
# 1. 기본 형태
def example(*args):
	print(args)

example(1, 2, 3) 	# 출력: (1, 2, 3)

# 2. 
def check(n, *values):
    for i in range(n):
        for value in values: # 범위는 가변 매개변수 
            print(value)                          
        print() # 한줄 씩 띄기 

check(2, "하나", "둘", "셋")

가변 + 기본

  • 기본매개변수,가변매개변수 순서로 작성하면 실행불가 가변이 앞에 있어야 한다.
#(가변 매개변수, 기본 매개변수)
def oz(*values, n=3):
    for i in range(n):
        for value in values:
            print(value)
        print()

oz("기본 매개변수 다음에", "가변 매개변수를", "넣을 수 있을까요?", 10)

가변 키워드 매개변수(**kwargs)

  • **kwargs
    • 키워드 인자(= 이름을 지정한 인자)를 딕셔너리(dict)로 받음.
    • **kwargs → key=value 형태로 들어온 인자들을 dict로 묶음
            def example(**kwargs):
                print(kwargs)

            example(name="Kihoon", age=25, lang="Python")
            # 출력: {'name': 'Kihoon', 'age': 25, 'lang': 'Python'}

가변 + 가변 키워드

  • 동시에 사용(def example(a, *args, **kwargs))
    • 순서 주의: *args → **kwargs
                  def example(a, *args, **kwargs):
                      print("a:", a)
                      print("args:", args)
                      print("kwargs:", kwargs)

                  example(10, 20, 30, name="Kihoon", age=25)
                  # a: 10
                  # args: (20, 30)
                  # kwargs: {'name': 'Kihoon', 'age': 25}

여러 함수의 형태

재귀함수

  • 함수 안에 자신의 함수를 다시 호출하는 함수
# 1. for문 사용
def factorial(n):
    output = 1
    for i in range(1, n+1):
        output *= i
    return output

n = int(input("구하고자하는 팩토리얼의 수를 입력해주세요"))
print(f'{n}의 결과는 {factorial(n)}입니다.')

# 2. if문 사용
#재귀함수를 이용한 팩토리얼 구현 코드
def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)

n = int(input("구하고자하는 팩토리얼의 수를 입력해주세요"))
print(f'{n}의 결과는 {factorial(n)}입니다.')

콜백함수

  • 함수 A가 끝난 뒤 특정 시점에서 함수 B를 다시 호출하도록 넘겨주는 함수
    • 함수를 인자로 전달해서 나중에 실행되도록 예약하는 개념
# 예제 1
def greet(name):
    print(f"안녕, {name}!")

def process_user(callback):
    print("사용자 데이터를 불러오는 중...")
    user_name = "기훈"
    # 데이터를 불러온 뒤 콜백 함수 실행
    callback(user_name)

# greet 함수를 콜백으로 전달
process_user(greet)

## 실행 순서
1. process_user()가 실행됨
2. “사용자 데이터를 불러오는 중...” 출력
3. 내부에서 callback(user_name) 호출
4. 전달받은 greet가 실행되어 → "안녕, 기훈!" 출력

실용 예제

# “계산기 + 콜백”
def add(a, b):
    return a + b

def multiply(a, b):
    return a * b

def calculate(a, b, callback):
    print(f"'{callback.__name__}' 함수를 사용합니다.")
    result = callback(a, b)  # 전달받은 함수 실행
    print(f"결과: {result}")

# add를 콜백으로 전달
calculate(3, 5, add)

# multiply를 콜백으로 전달
calculate(3, 5, multiply)

## 출력
'add' 함수를 사용합니다.
결과: 8
'multiply' 함수를 사용합니다.
결과: 15

함수를 매개변수로 받는 내장 함수

map(function, iterable)

  • iterable의 각 요소에 함수를 적용해서 새로운 이터레이터를 만들어 준다.
# 예제 1
numbers = [1, 2, 3, 4, 5]

def square(x):
    return x * x

result = map(square, numbers)
print(list(result))

출력 : [1, 4, 9, 16, 25]
  • map()은 numbers의 각 요소를 square() 함수에 넣어 실행
    • square가 콜백 함수 역할
      • [square(1), square(2), square(3), square(4), square(5)] 동작

filter(function, iterable)

  • iterable의 각 요소를 함수에 넣고 True인 값만 남김
numbers = [1, 2, 3, 4, 5]

def is_even(x):
    return x % 2 == 0   # 짝수면 True, 홀수면 False

result = filter(is_even, numbers)
print(list(result)) # [2,4]
  • filter()는 numbers의 각 요소를 is_even() 함수에 넣고, 그 결과가 True인 값만 골라냄
    • [x for x in numbers if is_even(x)] 동작

람다(lambda)와 함께 쓰면 더 직관적

numbers = [1, 2, 3, 4, 5]

# map 예시: 제곱
print(list(map(lambda x: x**2, numbers)))  # [1, 4, 9, 16, 25]

# filter 예시: 홀수만
print(list(filter(lambda x: x % 2 == 1, numbers)))  # [1, 3, 5]

제너레이터

  • 필요할 때 마다 값을 하나씩 만들어내는 함수
    • return 을 만나면 딱 한번 결과를 주고 끝낸다.
      • 제너레이터 yield를 사용해서 한번 멈췄다가 다음에 불리면 다시 이어서 실행 가능
    • 결과적으로 메모리를 아끼고,삐르고 효율적인 반복 처리가 가능하다.
# 예제 1
def simple_generator():
    print("첫 번째 yield 실행 전")
    yield 1
    print("두 번째 yield 실행 전")
    yield 2
    print("세 번째 yield 실행 전")
    yield 3

gen = simple_generator()

print(next(gen))  # 1
print(next(gen))  # 2
print(next(gen))  # 3

## 출력
첫 번째 yield 실행 전
1
두 번째 yield 실행 전
2
세 번째 yield 실행 전
3

# 

실전 제너레이터

# 짝수 생성기
def even_numbers(limit):
    for i in range(limit):
        if i % 2 == 0:
            yield i

gen = even_numbers(10)

for num in gen:
    print(num)
  • for num in gen: = for문은 내부적으로 next(gen)을 계속 호출
    • StopIteration 예외가 나오면 반복을 멈춥니다.
  • gen = even_numbers(10)
    • 이 코드를 실행하면 함수가 실행되는것이 아닌 gen이라는 제너레이터 객체가 생성
      • for num in gen: 이게 시작되면 내부적으로 next(gen)을 호출
  • 함수가 yield i를 만나면, 그 순간의 값 i를 바깥(for문)에 돌려줌 즉, num=i

수준별 학습 - 제너레이터



profile
안녕하세요.

0개의 댓글