TIL8: python-6

Seoyul Kim·2020년 4월 3일
0

Python

목록 보기
10/16

1. complex dictionary

list of dictionaries

  • list 를 dictionary로 구성하면 손쉽게 여러 dictionary들을 grouping할 수 있다.
  • 그리고 for 구문을 사옹하여 각각의 dictionary등르 읽어들이고 원하는 로직을 실행할 수 있다.

nested dictionary

  • list of dictionaries의 경우 for 구문을 통해서 모든 요소를 하나하나 확인하기 때문에 list의 총 길이가 길다면 실행하는데 걸리는 시간이 길어진다
  • 특정 정보를 읽고 싶다면 dictionary안에 dictionary를 중첩적으로 사용하면 원하는 데이터를 더 효과적으로 표현하는 방법이 될 수 있다.
bts = {
	"RM": {
		"실명" : "김남준",
		"가명" : "RM",
		"생년월일" : "1994년 9월 12일",
		"출생지" : "대한민국 서울특별시 동작구 상도동",
		"학력" : "글로벌사이버대학교 방송연예학과",
		"포지션" : "리더 · 메인 래퍼"
	},
	"진": {
		"실명" : "김석진",
		"가명" : "진",
		"생년월일" : "1992년 12월 4일",
		"출생지" : "대한민국 경기도 과천시",
		"학력" : "한양사이버대학교 대학원",
		"포지션" : "서브 보컬"
	},
    
	"제이홉": {
		"실명" : "정호석",
		"가명" : "제이홉",
		"생년월일" : "1994년 2월 18일",
		"출생지" : "대한민국 광주광역시 북구 일곡동",
		"학력" : "글로벌사이버대학교 방송연예학과",
		"포지션" : "서브 래퍼 · 메인 댄서"
	}
 ]
print(bts["제이홉"]["생년월일"])

2. more complex function parameters

handling unknown member of arguments

  • 사전에 정확히 필요한 parameter 수와 구조를 알 수 없는 경우 dictionary를 parameter로 받아서 사용한다.

key worded variable length of arguments

  • 이름 그대로 keyword arguments인데 그 수가 정해지지 않고 유동적으로 변할 수 있는 keyword arguments이다.
  • 선언하기 위해서는 parameter이름 앞에 두개의 별표(**)로 시작해야 한다
**options
  • 한수를 호출할 때 일반적인 keyword arguments처럼 사용하면 된다.
  • 일반적인 keyword arguments와의 차이점은 argument 수를 0부터 n까지 유동적으로 넘겨줄 수 있고, keyword가 미리 정해져 있지 않기 때문에 keyword를 유동적을 사용할 수 있다.
  • dictionary 형태로 지정된다.
  • 사용할 때 일반적으로 argument 이름을 kwargs라고 짓는다. 그래서 대부분 **kwargs라고 parameter이름을 정한다.
  • kwargs 파라미터는 dictionary로 함수에 전해지기 때문에 함수 body 안에서는 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")

#kwargs파라미터는 dictionary로 함수에 전해진다.
#{'seat': '가죽', 'blackbox': '최신', 'tint': 'yes'}

non-keyworded variable length of argumnet

  • key worded variable length of arguments와 동일하지만 keyword를 사용하지 않고 순서대로 값을 전달하는 방식도 가능하다.
  • variable arguments를 선언하는 방법은 별표 1개를 사용해서 선언하며 tuple로 변환되어 함수에 전달된다.
def print_arguments(*args):
	print(f"arguments: {args}")

print_arguments(1,2,3)  #(1,2,3)튜플로 변환되어 함수에 전달
	
>arguments: (1,2,3)

mixing args and kwargs

  • variable argments와 keyworded variable arguments 둘다 사용하여 함수를 정의할 수 있다.
def do_something(*args, **kwargs):
  • 둘다 사용하면 어떠한 형태와 수의 arguments도 허용 가능한 함수가 된다.

3. nested function

  • 다른 구문들과 마찬가지로 함수도 함수안에 중첩되어 선언될 수 있다
  • 중첩함수 혹은 내부함수는 상위 부모 함수 안에서만 호출 가능하며 부모 함수를 벗어나서 호출 될 수 없다.

왜 nested function을 사용할까?

  1. 가독성
  • 함수를 사용하는 이유 중 하나는 반복되는 코드블럭을 함수로 정의해서 효과적으로 코드를 관리하고 가독성을 높이기 위함이다.

  • 중첩함수를 사용하는 이유도 동일하다. 함수 안의 코드 중 반복되는 코드가 있다면 중첩함수로 선언하면 부모함수의 코드를 효과적으로 관리하고 가독성을 높일 수 있다.

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")
  1. closure
  • 중첩함수가 부모함수의 변수나 정보를 가두어 사용하는것을 closure라고 한다.
    그리고 부모함수는 중첩함수를 리턴해준다. 그러면 부모함수의 변수를 외부로부터 직접적인 접근은 격리하면서도 중첩함수를 통해서 격리된 부모함수의 변수를 사용한 연산은 가능하게 해준다.

    *summary

    1. 중첩 함수가 부모함수의 변수나 정보를 중첩 함수 내에서 사용한다.
    2. 부모함수는 리턴값으로 중첩 함수를 리턴한다.
    3. 부모함수에서 리턴했으므로 부모 함수의 변수는 직접적인 접근이 불가능 하지만 부모함수가 리턴한 중첩함수를 통해서 사용될 수 있다.
  • 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

4. decorator

  • closure처럼 중첩함수를 리턴하는 함수이며 다른 함수에 적용해서 적용된 함수가 실행되기 전에 무조건 실행된다. 즉 특정 함수를 실행하기 전에 강제적으로 다른 함수가 먼적 실행된 후 실행되도록 하는 강제성을 제공하는 기능이다.
@is_paid_user
def jackpot_stock_information():
	return "계시가 내려졌습니다. 삼성전자를 사세요!"
  • @를 사용해 decorator 를 달아놓으면 해당 함수가 호출되기 전에 장식으로 달림 함수가 면서 호출이 되고 난 후에 본 함수가 호출된다.
  • decorator로 장식할 수 있는 함수는 중첨함수를 리턴하는 함수만 decorator 함수로 사용될 수 있다.
  • decorator의 기능을 다르게 설명하면 chain of functions 즉 여러개의 함수가 연속적으로 호출이 자동으로 되게해준다.
  • 그러기 위해서는 마지막 함수를 제외한 함수들은 그 다음 함수를 리턴해주어야 파이썬이 함수들을 차례대로 호출해줄 수 있다.
  • 만일 다음 함수를 리턴하지 않고 다른 값을 리턴해버리면 그 다음 함수로 넘어가지못하고 그냥 함수 실행이 종료되기 때문이다. 그렇기 때문에 decorator 함수는 그 다음 함수를 리턴해주어야한다.

0개의 댓글