def 함수이름 (매개변수):
# 실행할 코드
print(매개변수)
return "반환값"
# 함수의 시행(호출, call)
result = 함수이름("인자")
print(result)
매개변수(parameter): 매개 + 변수
a = 10
b = 20
if a > b:
print(a - b)
else:
print(b + a)
c = 30
d = 40
if c > d:
print(c - d)
else:
print(c + d)
줄이 너무 길고 가독성이 떨어진다.
def my_func(a, b):
if a > b:
return(a - b)
else:
return(b + a)
print(my_func(10, 20))
print(my_func(30, 40))
def calculator(a, b, operator):
#operator = "+" or "-" or "*" or "/"
if (operator == "+"):
return (a + b)
elif (operator == "-"):
return (a - b)
elif (operator == "*"):
return (a * b)
elif (operator == "/"):
return float(a / b)
else:
return("지원하지 않는 연산입니다.")
print(calculator(4, 5, "*"))
print(calculator(7, 9, "-"))
print(calculator(43454223, 56462, "/"))
print(calculator(65423, 3121, "+"))
print(calculator(4, 5, "#%^"))
결과

# 예시 1.
print("안녕하세요", "반값습니다!", sep='-', end='/')
# 예시 2.
def my_func(a, b, c=None, operator=None):
if operator =="+":
return a + b
else:
return c
print(my_func(10, 20, operator="+"))
단, 기본값 매개변수는 뒤쪽에 위치해야함
def greet(name, message="안녕하세요~!"):
print(f"{name}님, {message}")
greet("Dongyun2")
greet("ff", "반갑습니다!")
def add_all(*args):
return sum(args)
print(add_all(1, 2, 3, 4, 5))
def print_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_info(name = "동윤2", age = 26, city = "포항")
# 가변 인자 사용시 주의사항
# --> 위치 인자 --> 기본값 인자 --> *args --> **kwargs 순서로 정의해야 함
def average(*args):
return sum(args) / len(args)
print(average(1, 3, 5, 4, 5, 6))
결과

def longgest_str(*args):
return max(args, key=len)
print(longgest_str("안녕", "안녕하시렵니까", "쎕쎄요는 나의 유행어", "에어컨~"))
결과

def info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
info(user_name = "동윤2", age = 26, city = "포항", phone_number = "010-1234-5678")
결과

def bargain(**kwargs):
sale_items = {}
for key, value in kwargs.items():
sale_items[key] = int(value * 0.9)
print(f"{key}: {value}")
return sale_items
print(bargain(cable = 18000, bottle = 5000, chair = 64000, wallet = 50000))
결과

# 전역변수
x = 200
def my_func():
#지역변수
x = 10
print(x)
my_func()
print("함수 밖", x)
x = 10
def my_func2():
# x = 20
x = x + 5
print(x)
my_func2()
print("전역변수", x)
x = 10
def my_func3():
global x # 전역변수 사용 선언
x = x + 5
print("지역", x)
my_func3()
print("전역", x)
# 권장되는 패턴
# 부수효과(side effect)를 발생시키지 않는 함수를 위주로 프로그래밍
x = 10
def my_func4(x):
x += 5
return x
x = my_func4(x)
print("전역", x)
current_user = '' # current_user = None
login_count = 0
def login(name):
global current_user
global login_count
if current_user:
print(f"이미 {current_user}(이/가) 로그인되어 있습니다.")
else:
current_user += name
print(f"{name}님 로그인 성공")
return current_user
if current_user == None:
current_user = name
print(f"{name}님 로그인 성공")
else:
print(f"이미 {current_user}(이/가) 로그인되어 있습니다.")
login_count += 1
if login_count > 4
print("더 이상 로그인 시도를 할 수 없습니다.")
def logout():
global current_user
# global login_count
current_user = '' # 걍 초기화 해버림
print("로그아웃 되었습니다.")
return current_user
if current_uesr == None:
print("로그인 상태가 아닙니다.")
else:
print("로그아웃 되었습니다!")
current_user = None
login_count = 0
# login("동윤2")
# login("빠니보틀")
# logout()
# login("빠니보틀")
# print(current_user)
결과

#재귀함수
#1. 자기 자신을 호출하는 함수
#2. 반드시 기본조건(종료조건)이 있어야 함
#+ 큰 문제를 작은 문제로 나누었을 때, 일정한 패턴이 있어야 한다.
import time
def recursive_func(n):
# 기본조건
if n == 0:
return
recursive_func(n-1)
print("재귀 호출", n)
time.sleep(1)
recursive_func(5)
def power(a, b):
if b == 0:
return 1 # a^0
c = 1 # a^0
for b in range(b): # b번 거듭제곱
c = c * a
return c
# if b == 0:
# return 1
# return a * power(a, b - 1)
# --> b = 0 이 되는 순간까지 b + 1 번 곱
print(power(2, 4)) # 16
def factorial1(a):
if a == 1:
return 1 # a! = a * (a-1) * (a-2) * (a-3)* ..... * (a-n) * .....* 3 * 2 * 1
b = 1 # factorial를 받을 변수 b에 1을 할당 // 0! = 1
for a in range(a, 1, -1):
b = b * a
return b
print(factorial1(5)) # 120
def factorial2(a):
if a == 1:
return 1 # a! = a * (a-1) * (a-2) * (a-3)* ..... * (a-n) * .....* 3 * 2 * 1
return a * factorial2(a-1) # a! = a * (a-1)~~~~~
print(factorial2(5)) # 120
def fibonacci1(n):
if n <= 0:
return 0
a, b = 1, 1
for n in range(1, n-1):
a, b = b, a+ b
return b
print(fibonacci1(7)) # 13
def fibonacci2(n):
if n <= 0:
return 0
if n <= 2:
return 1
return fibonacci2(n-1) + fibonacci2(n-2)
print(fibonacci2(6)) # 8
# 1 --> 1
# 2 --> 1
# 3 --> 2
# 4 --> 3
# 5 --> 5
# 6 --> 8
# 7 --> 13
def add(x, y):
return x + y
add_func = lambda x, y: x + y
print(add_func(3, 5)) # 8
print((lambda x: x ** 2)(10)) # 100
my_list = [1, 2, 3, 4]
def square_func(x):
return x ** 2
print(list(map(square_func, my_list))) # [1, 4, 9, 16]
print(list(map(lambda x: x ** 2, my_list))) # [1, 4, 9, 16]
my_list2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def is_even(x):
return x % 2 == 0
print(list(filter(is_even, my_list2))) # [2, 4, 6, 8, 10]
print(list(filter(lambda x: (x % 2) == 0, my_list2))) # [2, 4, 6, 8, 10]
my_list3 = ["apple", "banana", "watermelon", "grape"]
print(sorted(my_list3, key = lambda word: len(word))) # ['apple', 'grape', 'banana', 'watermelon']
students = [("Alice", [80, 90]), ("Bob", [60, 65]), ("Charlie", [70, 70])]
# 리스트 안에 튜플 안에 문자열과 리스트
# 안의 정수 리스트를 불러와서 계산을 해야됨
print(list(filter(lambda x: sum(x[1]) / len(x[1]) >= 70, students))) # [('Alice', [80, 90]), ('Charlie', [70, 70])]
# x = 튜플, x[1] = 점수 리스트
결과

sentences = ["Python is fun", "Lambda functions are powerful", "Coding is creative"]
# 규칙이 있다면, 띄어쓰기, 대문자 구분, 문장의 첫 번째 단어?
print(list(map(lambda sentences: sentences.split()[0], sentences))) # ['Python', 'Lambda', 'Coding']
# map이 아닌 filter를 쓰면 람다함수 조건식에 의해서 모든 문자열들이 true로 판별되니까 모든 문장이 필터를 통과하게 된다.
# map --> 데이터를 변환(첫 단어만 뽑아내는 등) / filter --> 데이터를 선별(조건에 맞는 원소만 남김)
결과

people = [("Alice", 30), ("Bob", 25), ("Charlie", 35)]
print(sorted(people, key = lambda x: x[1])) # [('Bob', 25), ('Alice', 30), ('Charlie', 35)]
결과
