bts = {
"RM": {
"실명" : "김남준",
"가명" : "RM",
"생년월일" : "1994년 9월 12일",
"출생지" : "대한민국 서울특별시 동작구 상도동",
"학력" : "글로벌사이버대학교 방송연예학과",
"포지션" : "리더 · 메인 래퍼"
},
"진": {
"실명" : "김석진",
"가명" : "진",
"생년월일" : "1992년 12월 4일",
"출생지" : "대한민국 경기도 과천시",
"학력" : "한양사이버대학교 대학원",
"포지션" : "서브 보컬"
},
"제이홉": {
"실명" : "정호석",
"가명" : "제이홉",
"생년월일" : "1994년 2월 18일",
"출생지" : "대한민국 광주광역시 북구 일곡동",
"학력" : "글로벌사이버대학교 방송연예학과",
"포지션" : "서브 래퍼 · 메인 댄서"
}
]
print(bts["제이홉"]["생년월일"])
**options
def buy_A_car(**kwargs):
print(f"다음 사양의 자동차를 구입하십니다:")
for option in kwargs:
print(f"{option} : {kwargs[option]}")
buy_A_car(seat="가죽", blackbox="최신", tint="yes")
#kwargs파라미터는 dictionary로 함수에 전해진다.
#{'seat': '가죽', 'blackbox': '최신', 'tint': 'yes'}
def print_arguments(*args):
print(f"arguments: {args}")
print_arguments(1,2,3) #(1,2,3)튜플로 변환되어 함수에 전달
>arguments: (1,2,3)
def do_something(*args, **kwargs):
함수를 사용하는 이유 중 하나는 반복되는 코드블럭을 함수로 정의해서 효과적으로 코드를 관리하고 가독성을 높이기 위함이다.
중첩함수를 사용하는 이유도 동일하다. 함수 안의 코드 중 반복되는 코드가 있다면 중첩함수로 선언하면 부모함수의 코드를 효과적으로 관리하고 가독성을 높일 수 있다.
def print_all_elements(list_of_things):
#중첩함수 선언
def print_each_element(things):
for thing in things:
print(thing)
if len(list_of_things) > 0:
print_each_element(list_of_things)
else:
print("there is notihing")
중첩함수가 부모함수의 변수나 정보를 가두어 사용하는것을 closure라고 한다.
그리고 부모함수는 중첩함수를 리턴해준다. 그러면 부모함수의 변수를 외부로부터 직접적인 접근은 격리하면서도 중첩함수를 통해서 격리된 부모함수의 변수를 사용한 연산은 가능하게 해준다.
*summary
- 중첩 함수가 부모함수의 변수나 정보를 중첩 함수 내에서 사용한다.
- 부모함수는 리턴값으로 중첩 함수를 리턴한다.
- 부모함수에서 리턴했으므로 부모 함수의 변수는 직접적인 접근이 불가능 하지만 부모함수가 리턴한 중첩함수를 통해서 사용될 수 있다.
closure는 어떠한 정보를 기반으로 연산을 실행하고 싶지만 기반이 되는 정보는 접근을 제한하여 노출이 되거나 수정이 되지 못하게 하고 싶을 때 사용한다. 주로 함수나 오브젝트를 생성해내는데 사용된다.
def generate_power(base_number):
def nth_power(power):
return base_number ** power
return nth_power
calculate_power_of_two = generate_power(2)
calculate_power_of_two(7)
> 128
calculate_power_of_two(10)
> 1024
calculate_power_of_seven = generate_power(7)
calculate_power_of_seven(3)
> 343
calculate_power_of_seven(5)
> 16907
@is_paid_user
def jackpot_stock_information():
return "계시가 내려졌습니다. 삼성전자를 사세요!"