
함수(def)
- 함수를 정의할때 사용하는 매개변수의 개수와 호출시 입력되는 매개변수의 개수는 동일해야함
- 매개변수가 2개인데 입력을 1개만 하거나 입력을 3개하면 오류발생
기본 구조
def function(x, y):
z = x + y
print(function(10, 2))
def function(x, y):
z = x + y
return z
print(function(10, 2))
전역변수
a = 100
def f():
global a
a = a + 1
return a
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), '원')
매개변수
기본 매개변수
- 매개변수 자리에 기본값을 설정해 놓은 것
- 기본값을 설정해놓은 매개변수 자리에 아무것도 들어가지 않을경우 기본값 출력
- 주의 ⚠️ : 일반매개변수 앞에 기본매개변수를 배치하면 안된다.((n=2, value) 안됨)
def oz(value, n=2):
for i in range(n): 출력 : 하나
print(value) 하나
oz("하나")
oz("하나" , n=5 )
가변 매개변수( *args )
- *args
- 위치 기반 인자를 튜플(tuple)로 받는다.
- 몇개가 들어올지 모를 때 사용한다.
* 이 중요한거고 이름은 상관없다.(관례상 args를 자주 사용)
- 주의 ⚠️
- 가변매개변수를 일반매개변수 앞에쓰면 실행불가 : (*values,n)
- 가변 매개변수는 한개만 사용 가능
def 함수이름(매개변수, *가변 매개변수):
코드
def example(*args):
print(args)
example(1, 2, 3)
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")
가변 + 가변 키워드
- 동시에 사용(def example(a, *args, **kwargs))
def example(a, *args, **kwargs):
print("a:", a)
print("args:", args)
print("kwargs:", kwargs)
example(10, 20, 30, name="Kihoon", age=25)
여러 함수의 형태
재귀함수
def factorial(n):
output = 1
for i in range(1, n+1):
output *= i
return output
n = int(input("구하고자하는 팩토리얼의 수를 입력해주세요"))
print(f'{n}의 결과는 {factorial(n)}입니다.')
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n-1)
n = int(input("구하고자하는 팩토리얼의 수를 입력해주세요"))
print(f'{n}의 결과는 {factorial(n)}입니다.')
콜백함수
- 함수 A가 끝난 뒤 특정 시점에서 함수 B를 다시 호출하도록 넘겨주는 함수
- 함수를 인자로 전달해서 나중에 실행되도록 예약하는 개념
def greet(name):
print(f"안녕, {name}!")
def process_user(callback):
print("사용자 데이터를 불러오는 중...")
user_name = "기훈"
callback(user_name)
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}")
calculate(3, 5, add)
calculate(3, 5, multiply)
'add' 함수를 사용합니다.
결과: 8
'multiply' 함수를 사용합니다.
결과: 15
함수를 매개변수로 받는 내장 함수
map(function, iterable)
- iterable의 각 요소에 함수를 적용해서 새로운 이터레이터를 만들어 준다.
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
result = filter(is_even, numbers)
print(list(result))
- filter()는 numbers의 각 요소를 is_even() 함수에 넣고, 그 결과가 True인 값만 골라냄
[x for x in numbers if is_even(x)] 동작
람다(lambda)와 함께 쓰면 더 직관적
numbers = [1, 2, 3, 4, 5]
print(list(map(lambda x: x**2, numbers)))
print(list(filter(lambda x: x % 2 == 1, numbers)))
제너레이터
- 필요할 때 마다 값을 하나씩 만들어내는 함수
- return 을 만나면 딱 한번 결과를 주고 끝낸다.
- 제너레이터 yield를 사용해서 한번 멈췄다가 다음에 불리면 다시 이어서 실행 가능
- 결과적으로 메모리를 아끼고,삐르고 효율적인 반복 처리가 가능하다.
def simple_generator():
print("첫 번째 yield 실행 전")
yield 1
print("두 번째 yield 실행 전")
yield 2
print("세 번째 yield 실행 전")
yield 3
gen = simple_generator()
print(next(gen))
print(next(gen))
print(next(gen))
첫 번째 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
수준별 학습 - 제너레이터

