[TIL]Python. Dictionary & Parameters

여주링·2020년 11월 24일
0

Python

목록 보기
8/15

여러 개념들을 다 한번은 공부했다. 이제는 레벨업이 좀 필요할거같으니 좀더 어려운 개념들에 접근해보자

Looping Dictionary

dictionary도 for 반복구문(loop)을 사용하여 반복되는 로직을 실행시킬 수 있다. 다만 list와 다르게 dictionary는 각 요소가 key 와 value로 이루어져 있기때문에

기본 구문
forin 딕셔너리:
	코드

for 반복구문에서는 각 요소의 key만 리턴을 합니다. 그리고 해당 key를 가지고 값을 읽어들이는 구조 입니다.

key 값 말고 value 값으로 가능할까?

values() 함수를 사용하면 for 반복구문에서 key 값 대신에 value 값들을 가지고 반복 로직을 실행 할 수 있습니다.

for value in 딕셔너리.values(함수):
	코드

Key와 value 값 둘다 가지고 for 반복구문은?

물론 가능하다. items() 함수를 사용하면 된다.
Dictionary의 items 함수는 key와 value를 tuple로 리턴해줍니다.
그러므로 다음처럼 for 반복구문에서 2개의 값을 동시에 받게 됩니다.

for key, value in 딕셔너리.items():
    print(key, ":", value)

List of Dictionaries

이전에 배운 Dictionary의 개념으로 BTS멤버의 정보를 작성해 보았다

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

위의 기본적인 예시로 만약 내가 특정멤버의 어떤 생년월일을 알고싶다면

for member in bts:
	if member["가명"] == "제이홉": 
		print(member["생년월일"])

하나하나 요소를 확인하는 수 밖에 없음(나중에 대량의 요소 확인할때 진~짜 시간이 오래걸림)

이런경우 nested dictionary라는 개념을 적용해서 구현할수 있다.

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

위의 예시처럼 dictionary 안에 dictionary를 중첩적으로 사용하면 원하는 데이터를 더 효과적으로 표현할 수 있게된다.

More Complex Function Parameters

예를 들어, 'A'라는 자동차(옵션 40개)라고 가정해보자
'A'라는 자동차의 parameter를 구현하면 일일이 받으면 40개의 parameter가 나옴.. (너무 길다..) 게다가 옵션사항의 대다수가 과연 선택될지....
-> 그렇다면 40개의 parameter가 사용되지 않는데도 불구하고 불필요하게 parameter를 넣을 상황이 됨. 그리고 40개를 정했는데 수정사항이 생긴다면..? 나라면 너무나 귀찮을듯...(유동성이 떨어짐)

위의 'A'자동차처럼 사전에 정확히 필요한 parameter 수와 구조를 알수 없는 경우
dictionary를 parameter로 받아서 사용하는 것!

def buy_A_car(options): 
	print("다음 사양의 자동차를 구입하십니다:")
	
	for option in options:
		print(f"{option} : {options[option]}") 

options = {"seat" : "가죽", "blackbox" : "최신"} 

buy_A_car(options) 

> 다음 사양의 자동차를 구입하십니다: seat : 가죽 blackbox : 최신

이렇게 하면 원하는 옵션만 간단하게 설정 할 수 있게 된다.

그런데,

A자동차에 옵션을 하나도 추가 안하면 어떻게 될까?
그냥 빈 dictionary가 생긴다. 또한 dictionary가 아닌 다른값을 넘겨줄 오류가 생길수도 있음

Keyworded variable length of arguments

그래서 파이썬에서는 keyworded variable length of arguments 라는 기능이 있습니다.
말그대로 그 수가 정해지지 않고 유동적(0부터N까지)으로 변할 수 있는 keyword arguments(키워드 매개변수)이다.
keyword argument에 대해선 여기🤔

이름앞에 2개의 별표**로 시작된다.
보통의 keyword arguments처럼 사용하면 된다.
일반적인 keyword arugments와의 차이점은:

  • Keyword가 미리 정해져 있지 않기때문에 원하는 keyword를 유동적으로 사용할 수 있습니다.
  • Keyworded variable length of arguments는 dictionary 형태로 지정됩니다.

Keyworded variable length of arguments를 사용할때 일반적으로 argument 이름을 kwargs 라고 짓습니다. 그래서 대부분 **kwargs 라고 parameter 이름을 정합니다.(근데 맘대로 붙여도됨 **yeoju처럼)

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'}

*args 라는것도 있지 않아?

이 지시어는 여러개의 매개변수를 함수로 받고싶을 때 사용하는 지시어다.
Variable arguments라고 말하며 이를 선언하는 방법은 별표 2개 대신에 1개를 사용한다.
그리고 Tuple로 변환되어 함수에 전달됩니다.
(Tuple)이니 당연히 순서가 정해져있음!

Mixing *args and **kwargs

*args and **kwargs를 함께 사용할 수 있다.
args는 정해지지 않은 수의 (일반)파라미터를 받고
kwargs는 정해지지 않은 수의 키워드파라미터를 받는다.

def do_something(*args, **kwargs):
args(=arguments), kwargs(=keyword arguments)
     ## some code here...
     ....

그렇다면 왜 둘다 사용할까요?
둘다 사용하면 어떠한 형태와 수의 argument도 허용 가능한 함수가 됩니다.
즉, parameter에 있어서 굉장히 유동적인 함수가 되는것입니다.

do_something(1, 2, 3, name="정우성", age=45)
do_something(1, 2, 3, 4, 5, "hello", {"주소" : "서울", "국가" : "한국"})
do_something(name="정우성", gender="남", height="187")
do_something(1)
do_something()

#전부다 괜찮음

사용시 주의사항!

순서는 ⭐️일반argument, *args, **kwargs의 순서⭐️로!!
변경될경우 에러가 발생!
따라서 반드시 위 순서대로 사용해야함

profile
🌱Backend Developer👩‍💻

0개의 댓글