python TIL day-4

yo·2020년 5월 28일
0

08:15 in
22:30 out
-어제 고생해서 익힌 함수 parameter 내용이 오늘 또 나왔는데 쉽게 이해됐고,
어제의 삽질이 헛된 것 같지 않아 뿌듯했다.
-반면 오늘 오후는 함수 중첩문, closure개념과 씨름하며 보냈다.
-함수 중첩문, closure, decorator는 python학습을 단념시키기 위해 체계적으로 설계된 것이 분명하다.
-온갖 블로그와 youtube강의들을 통해 closure개념을 마침내 이해하게 되어 기쁘다.
-내일 정신이 맑을 때 다시 손에 익혀야겠다.
-높은 산을 하루에 몇 번씩 만난다.
-힘들고 어렵고 좌절의 연속이지만, 긴 씨름 끝에 문제를(스스로 삽질하며) 해결해 냈을 때의 쾌감도 만만치 않게 크다.
-매일 밤 노트북 닫으며 스스로에게 "재밌냐?"고 물어본다. 이제 4일차. 아직 재밌다. 다행이다.

Looping Dictionary

basic

-dictionary로 반복문 돌릴 수 있다.
-dic의key, value, key+value 동시에 출력하는 세 가지 방법이 가능하다.

key값으로 반복문


-예시에서 보면 알겠지만 dic_name[key값] 을 통해 value를 얻어낼 수 있다.

Looping Dic with Values instead of Keys

-values함수를 통해 가능하다.

Looping Dictionary With Both Keys And Values

-key, value를 같이 반복문 실행 하려면 .items를 사용하자.
-items함수는 key, value를 tuple로 리턴한다. 잊지 말자. tuple, tuple로

complex Dictionary

-리스트의 요소로써 dict를 사용할 수 있다.

bts = [
	{
		"실명" : "김남준",
		"가명" : "RM",
		"생년월일" : "1994년 9월 12일",
		"출생지" : "대한민국 서울특별시 동작구 상도동",
		"학력" : "글로벌사이버대학교 방송연예학과",
		"포지션" : "리더 · 메인 래퍼"
	},
	{
		"실명" : "김석진",
		"가명" : "진",
		"생년월일" : "1992년 12월 4일",
		"출생지" : "대한민국 경기도 과천시",
		"학력" : "한양사이버대학교 대학원",
		"포지션" : "서브 보컬"
	}
    ]

-dict 안에 dict를 넣을 수도 있다

bts = {
	"RM": {
		"실명" : "김남준",
		"가명" : "RM",
		"생년월일" : "1994년 9월 12일",
		"출생지" : "대한민국 서울특별시 동작구 상도동",
		"학력" : "글로벌사이버대학교 방송연예학과",
		"포지션" : "리더 · 메인 래퍼"
	},
	"진": {
		"실명" : "김석진",
		"가명" : "진",
		"생년월일" : "1992년 12월 4일",
		"출생지" : "대한민국 경기도 과천시",
		"학력" : "한양사이버대학교 대학원",
		"포지션" : "서브 보컬"
	},
   }

list안에 dict를 넣으면 정보 찾기 까다롭다. 예를 들면 아래와 같이 해야한다.
for member in bts:
if member["가명"] == "제이홉":
print(member["생년월일"])

반면 dict안에 dict를 넣으면 찾기가 훨씬 수월하다.
print(bts["제이홉"]["생년월일"])

more complex Function Parameters

이번 챕터에서 중요하게 다룰 두 가지 내용.
-Keyworded variable length of arguments (*)
-(non-keyworded)variable length of arguments(**)

these two are for handling unknown number of arguments
또는 매우 많은 parameter값을 받을 때 사용한다.

Keyworded variable length of arguments

-요친구는 별표 두개로 시작한다.
-argument수를 0~N까지 유동적으로 넘겨줄 수 있다.
-dictionary형태로 지정된다.
-보통 **kwargs로 쓴다.

def buy_A_car(**kwargs):
    print(f"다음 사양의 자동차를 구입하십니다:")

    for option in kwargs:
        print(f"{option} : {kwargs[option]}")

호출 시엔 buy_A_car(seat="가죽", blackbox="최신", tint="yes") 같은 형태로 호출한다.
키값에 따옴표를 붙이지 않는 것이 중요한 특징이다.

위 호출에 응답하여 요렇게 결과된다. {'seat': '가죽', 'blackbox': '최신', 'tint': 'yes'}

Non-keyworded variable length of arguments

-별표 하나*로 시작한다.
-일반적으로 args로 쓴다.
-**요것과 비슷하다. 단지 키워드 사용만 안한다.
-arguments는 tuple로 변환되어 함수에 전달된다.

mixing args and kwargs

nested Function

-함수를 중첩해서 사용할 수 있다. (함수 안에서 함수 선언)
-중첩함수(nested function) 혹은 내부함수는 상위 부모함수 안에서만 호출 가능하다.

def parent_function():
    def child_function():
        print("this is a child function")

    child_function()

parent_function()
> "this is a child function"

중첩문 사용하는 이유

  1. 가독성
  2. closure

-함수 안 코드 중 반복되는 부분이 있다면 중첩함수를 선언해 부모함수를 효과적으로 관리할 수 있다.

closure

-중첩 함수가 부모 함수의 변수나 정보를 가두어 사용하는 것을 closure라고 한다.
-부모 함수는 중첩 함수를 리턴한다. 이를 통해 부모함수의 변수를 외부로부터 격리하면서 중첩 함수를 통해 격리된 부모함수의 변수를 사용한 연산은 가능하게 해준다.
-중첩 함수가 부모 함수의 변수나 정보를 중첩 함수 내에서 사용한다.
-부모 함수는 리턴값으로 중첩 함수를 리턴한다.
-부모 함수에서 리턴 했으므로 부모 함수의 변수는 직접적인 접근이 불가능 하지만 부모 함수가 리턴한 중첩 함수를 통해서 사용될 수 있다.

when to use closure?

-어떠한 정보를 기반으로 연산을 실행하고 싶지만 기반이 되는 정보는 접근을 제한하여 노출이 되거나 수정이 되지 못하게 하고 싶을때 사용

예를 들어 보겠습니다.
만일 주어진 어떠한 숫자의 수(數) 을 구하는 함수는 다음과 같을 것입니다.

def calculate_power(number, power):
    return number ** power

calculate_power(2, 7)
> 128

자 이제, 주어진 숫자의 승을 구하는게 아니라 특정 숫자의 승을 구하는 함수를 구현한다고 생각해봅시다. 예를 들어, 2의 승을 구하는 함수를 구현한다면 다음과 같습니다.

def calculate_power_of_two(power):
    return 2 ** power

calculate_power_of_two(7)
> 128
calculate_power_of_two(10)
> 1024

하지만 위의 함수는 2의 승밖에 구할 수 없습니다.
만일 특정 숫자의 숭을 구하는 함수가 필요 하지만 2가 아니라 설정되는 수의 승을 구하는 함수는 어떻게 구현할 수 있을까요?

이때 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

https://whatisthenext.tistory.com/112
위 사이트에 정리가 잘 되있어서 내용을 퍼왔다.

Decorator

-데코레이터는 함수를 수정하지 않으면서 추가 기능을 구현할 때 사용한다.

profile
Never stop asking why

0개의 댓글