튜플은 불변 리스트로 사용할 수도 있고 필드명이 없는 레코드로 사용할 수도 있기에 레코드로 사용하는 경우를 간과하는 경우가 종종 있다.
튜플은 레코드를 담고 있고 각 항목은 레코드의 필드 하나를 의미하기에 항목의 위치가 곧 의미를 결정한다.
튜플이 필드의 집합으로 사용하는 경우에는 항목 수가 고정 되어 있고 항목의 순서가 중요하다.
lax_coordinates = (33.9425, -118.408056)
city, year, pop, chg, area = ('Tokyo', 2003,32450,0.66,8014)
traveler_ids = [('USA','31195855'),('BRA','CE342567'),('ESP','XDA205856')]
for passport in sorted(traveler_ids):
print('%s/%s' % passport)
for country, _ in traveler_ids:
print(country)
튜플 언패킹은 병렬 할당을 할 때 가장 눈에 띈다.
lax_coordinates = (33.9425, -118.408056)
latitude, longitude = lax_coordinates #튜플 언패킹
latitude #33.9425
longitude # -118.408056
"""
튜플 언패킹을 이용하면 임시 변수를 사용하지 않고도 두 변수의 값을 서로 교환할 수 있다.
b,a = a, b
"""
#인수 앞에 *를 붙여서 튜플을 언패킹할 수 있다.
divmod(20,8) #(2,4)
t = (20,8)
divmod(*t) # (2,4)
quotient, remainder = divmod(*t)
quotient, remainder # (2,4)
"""
호출자에 여러 값을 간단히 반환하는 기능으로 os.path.split() 함수를 이용해서 파일 시스템 경로에서 경로명과 파일명을 가져올 수 있다.
_와 같은 더미 변수를 플레이스홀더로 사용해서 관심 없는 부분은 언패킹 할 때 무시할 수 있다.
"""
import os
_,filename = os.path.split('/home/luciano/.ssh/idrsa.pub')
튜플을 언패킹할 때 일부 항목에만 관심있는 경우에는 를 사용할 수도 있다. 에 대해서 알아보자
초과 항목을 잡기 위해서 사용하기*
a,b , *rest = range(5)
a,b, rest #(0,1,[2,3,4])
a,b, *rest = range(3)
a,b,rest #(0,1,[2])
a,b,*rest = range(2)
a,b,rest #(0,1,[])
"""
병렬 할당의 경우 *는 단 하나의 변수에만 적용할 수 있다.
"""
a,*body,c,d = range(5)
a,body,c,d #(0,[1,2],3,4)
*head,b,c,d =range(5)
head,b,c,d #([0,1],2,3,4)
언패킹할 표현식을 받는 튜플은 (a,b,(c,d))처럼 다른 튜플을 내포할 수 있고, 파이썬은 표현식이 내포된 구조체에 일치하면 제대로 처리한다.
metro_areas = [
('Tokyo','JP',36.9333,(35.689722, 139.691667)),
('Delhi NCR','IN',21.935,(28.613889, 77.200889)),
('Mexico City','MX',20.142,(19.43333, -99.13333)),
('New York-Newark','US',20.104,(40.808611, -74.020386)),
('Sao Paulo','BR',19.649,(-23.547778, -46.635833)), ]
print('{:15} | {:^9} | {:^9}'.format('','lat.','long.'))
fmt = '{:15} | {:^9.4f} | {:^9.4f}'
if longitude <=0:
print(fmt.format(name, latitude, longitude))
collections.namedtuple() 함수는 필드명과 클래스명을 추가한 튜플의 서브 클래스를 생성하는 팩토리 함수로, 디버깅할 때 유용하다
Card = collections.namedtuple('Card',['rank','suit'])
from collections import namedtuple
City = namedtuple('City','name country population coordinates')
tokyo = City('Tokyo', 'JP', 36.933, (35.689722, 139.69167))
tokyo
tokyo.population
tokyo.coordinates
tokyo[1]