더 복잡하고 많은 양의 데이터를 담기 위해서 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일",
"출생지" : "대한민국 부산광역시 북구 만덕동",
"학력" : "글로벌사이버대학교 방송연예학과",
"포지션" : "메인 보컬 · 서브 래퍼 · 리드 댄서"
}
]
만약 위 list에서 지민의 정보를 가져오려면 다음과 같이 접근해야한다
print(bts[4])
# 출력 : {'실명': '박지민', '가명': '지민', '생년월일': '1995년 10월 13일', '출생지': '대한민국 부산광역시 금정구 금사동', '학력': '글로벌사이버대학교 방송연예학과', '포지션': '리드 보컬 · 메인 댄서'}
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일', '출생지': '대한민국 부산광역시 금정구 금사동', '학력': '글로벌사이버대학교 방송연예학과', '포지션': '리드 보컬 · 메인 댄서'}
예를 들어 수십가지나되는 자동차의 옵션들을 함수에 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'}
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()