chapter02_03 튜플은 단순한 불변 리스트가 아니다

매일 공부(ML)·2022년 11월 2일
0

Fluent Python

목록 보기
6/130

시퀀스

튜플은 단순한 불변한 리스트가 아니다.

튜플은 불변 리스트로 사용할 수도 있고 필드명이 없는 레코드로 사용할 수도 있기에 레코드로 사용하는 경우를 간과하는 경우가 종종 있다.

레코드로서의 튜플

  • 튜플은 레코드를 담고 있고 각 항목은 레코드의 필드 하나를 의미하기에 항목의 위치가 곧 의미를 결정한다.

  • 튜플이 필드의 집합으로 사용하는 경우에는 항목 수가 고정 되어 있고 항목의 순서가 중요하다.

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]

불변 리스트로서의 튜플

profile
성장을 도울 아카이빙 블로그

0개의 댓글