TIL - 03/25 - Python - 2

Sung Jun Jin·2020년 3월 25일
0

TIL

목록 보기
4/25
post-custom-banner

Complex Dictionary

더 복잡하고 많은 양의 데이터를 담기 위해서 list안에 dictionary를 담아주는 방식을 사용한다.

ex)

bts = [
  {
      "실명" : "김남준",
      "가명" : "RM",
      "생년월일" : "1994년 9월 12일",
      "학력" : "글러벌사이버대학교 방송연예학과",
      "포지션" : "리더, 메인래퍼"
  },

  {
	"실명" : "김석진",
	"가명" : "진",
	"생년월일" : "1992년 12월 4일",
	"출생지" : "대한민국 경기도 과천시",
	"학력" : "한양사이버대학교 대학원",
	"포지션" : "서브 보컬"
  },
  
  {
	"실명" : "민윤기",
	"가명" : "슈가",
	"생년월일" : "1993년 3월 9일",
	"출생지" : "대한민국 대구광역시 북구 태전동",
	"학력" : "글로벌사이버대학교 방송연예학과",
	"포지션" : "리드 래퍼"
  },
  
  {
	"실명" : "정호석",
	"가명" : "제이홉",
	"생년월일" : "1994년 2월 18일",
	"출생지" : "대한민국 광주광역시 북구 일곡동",
	"학력" : "글로벌사이버대학교 방송연예학과",
	"포지션" : "서브 래퍼 · 메인 댄서"
  },
  {
	"실명" : "박지민",
	"가명" : "지민",
	"생년월일" : "1995년 10월 13일",
	"출생지" : "대한민국 부산광역시 금정구 금사동",
	"학력" : "글로벌사이버대학교 방송연예학과",
	"포지션" : "리드 보컬 · 메인 댄서"
  },
  {
	"실명" : "김태형",
	"가명" : "뷔",
	"생년월일" : "1995년 12월 30일",
	"출생지" : "대한민국 대구광역시 서구 비산동",
	"학력" : "글로벌사이버대학교 방송연예학과",
	"포지션" : "서브 보컬"
  },
  {
	"실명" : "전정국",
	"가명" : "정국",
	"생년월일" : "1997년 9월 1일",
	"출생지" : "대한민국 부산광역시 북구 만덕동",
	"학력" : "글로벌사이버대학교 방송연예학과",
	"포지션" : "메인 보컬 · 서브 래퍼 · 리드 댄서"
  }
  
]

Nested Dictionary

만약 위 list에서 지민의 정보를 가져오려면 다음과 같이 접근해야한다

  1. 인덱스 번호로 찾거나
print(bts[4])

# 출력 : {'실명': '박지민', '가명': '지민', '생년월일': '1995년 10월 13일', '출생지': '대한민국 부산광역시 금정구 금사동', '학력': '글로벌사이버대학교 방송연예학과', '포지션': '리드 보컬 · 메인 댄서'}
  1. for문을 돌려 찾거나
for member in bts :
   if member["가명"] == "지민" :
     print(member)
     
# 출력 : {'실명': '박지민', '가명': '지민', '생년월일': '1995년 10월 13일', '출생지': '대한민국 부산광역시 금정구 금사동', '학력': '글로벌사이버대학교 방송연예학과', '포지션': '리드 보컬 · 메인 댄서'}    

데이터가 더 많아지면 불편할 수 있으므로 nested dictionary를 사용해준다.

bts = {
  
  "RM" : {
    "이름" : "김남준",
    "가명" : "RM",
    "생년월일" : "1994년 9월 12일",
		"출생지" : "대한민국 서울특별시 동작구 상도동",
		"학력" : "글로벌사이버대학교 방송연예학과",
		"포지션" : "리더 · 메인 래퍼"
    },
  
  "지민" : {
    
    "실명" : "박지민",
		"가명" : "지민",
		"생년월일" : "1995년 10월 13일",
		"출생지" : "대한민국 부산광역시 금정구 금사동",
		"학력" : "글로벌사이버대학교 방송연예학과",
		"포지션" : "리드 보컬 · 메인 댄서"
  },
  
}

print(bts["RM"])
# 출력 : {'이름': '김남준', '가명': 'RM', '생년월일': '1994년 9월 12일', '출생지': '대한민국 서울특별시 동작구 상도동', '학력': '글로벌사이버대학교 방송연예학과', '포지션': '리더 · 메인 래퍼'}

print(bts["지민"])

# 출력 : {'실명': '박지민', '가명': '지민', '생년월일': '1995년 10월 13일', '출생지': '대한민국 부산광역시 금정구 금사동', '학력': '글로벌사이버대학교 방송연예학과', '포지션': '리드 보컬 · 메인 댄서'}

Keyworded variable length of arguments

예를 들어 수십가지나되는 자동차의 옵션들을 함수에 parameter로 넘겨줄때는 어떻게 할까?
수십개의 argument를 함수에 모두 정의해줘야 할까?

def get_options(seat,blackbox,sunroof,window,color="빨강") :
   print(f"옵션 목록 : {seat},{blackbox},{sunroof},{window},{color}")
   

get_options("가죽","최신","짙은 선팅","창문 6개")

이렇게 함수를 정의할 경우, 사용자의 옵션선택에 따라 낭비되는 parameter가 많이 생길것이다.

이렇게 함수를 정의할 때, 사전에 정확한 parameter의 수를 알 수 없는 경우가 생긴다. 파이썬에서는 Keyworded variable length of arguments라는 기능이 있다. 수가 정해지지 않고 유동적으로 변할 수 있는 keyword argument이다.

선언 방법 - 일반적으로 argument 이름을 **kwargs 라고 짓는다.

def get_options(**kwargs) :
  print("선택한 옵션 목록")
  
  for option in kwargs :
    print(f"{option} : {kwargs[option]}")
    

get_options(seat="가죽", blackbox="최신", tint="yes")

'''
출력 : 
선택한 옵션 목록
seat : 가죽
blackbox : 최신
tint : yes
'''

원하는 만큼 옵션 리스트를 추가해서 더 parameter로 넘겨줄 수 있다. 넘어가는 parameter는 dictionary 형식으로 지정된다.

{'seat': '가죽', 'blackbox': '최신', 'tint': 'yes'}

Non-keyworded variable length of arguments

keyword를 사용하지않고 순서대로 parameter를 넘기는 방식이다. variable arguments라고 한다. 일반적으로 *args라고 선언한다.

def print_arguments(*args) :
  print(f"arguments : {args}")
  

print_arguments(1,2,3,4,5,5,6) # 출력 : arguments : (1, 2, 3, 4, 5, 5, 6)

print_arguments(1,2,3,4) # 출력 : arguments : (1, 2, 3, 4)

print_arguments(1,2,100,20000) # 출력 : arguments : (1,2,100,20000)

넘어가는 variable arguments는 tuple 형식으로 지정된다.

최종적으로 variable arguments와 keyworded variable arguments를 조합해서 parameter에 있어서 유동적인 함수를 만들 수 있다.

def do_something(*args, **kwargs) :

  # 코드 실행
  

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()
profile
주니어 개발쟈🤦‍♂️
post-custom-banner

0개의 댓글