일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- RDS
- socket io
- crud
- 파이썬
- Props
- flask
- docker
- dict
- MongoDB
- TypeScript
- NeXT
- 중급파이썬
- EC2
- 채팅
- SAA
- wetube
- async
- AWS
- merge
- 튜플
- 카톡
- pandas
- node
- Class
- S3
- lambda
- git
- react
- Vue
- SSA
- Today
- Total
초보 개발자
11강 튜플의 패킹과 언패킹 본문
패킹 : 묶기
언패킹 : 풀기
* → 묶는다 라는 의미라고 생각하자 단! 단 하나의 경우에는 풀기의 의미도 있다.
그게 언제냐면 함수를 호출하면서 인자를 전달할 때이다.
튜플로 값을 묶는 행위를 가리켜 '튜플 패킹'이라 하고 반대로 튜플로 묶여 있는 값들을 풀어내느 행위를 '튜플 언패킹'이라 한다.
튜플 패킹 : 하나 이상의 값을 튜플로 묶는 행위
튜플 언패킹 : 튜플레 묶여 있는 값들을 풀어내는 행위
tri_one = (12, 15) #밑변 길이 12와 높이 길이 15를 묶어 놓은 것
# tri_one = 12, 15 이렇게 소괄호 생략할 수도 있다.
tri_one
(12, 15)
보통은 튜플 생성이라고 이야기를 한다. 하지만 튜플 패킹이라고 이야기를 할 수도 있다.
반대로 다음과 같이 튜플에 저장된 값을 꺼내는 행위를 가리켜 튜플 언패킹이라 한다.
물론 튜플 언패킹을 진행할 때는 튜플에 저장된 값의 수와 이를 저장하는 변수의 수가 일치해야 한다.
tri_three = (12,25)
bt,ht = tri_three # 튜플 언패킹
print(bt,ht)
12 25
그리고 다음과 같이 언패킹 과정에서 둘 이상의 값을 리스트로 묶어서 하나의 변수로 저장하는 것도 가능하다.
nums = (1,2,3,4,5)
n1,n2, *others = nums # 둘 이상의 값을 리스트로 묶을 때 *를 사용한다.
n1
1
n2
2
others # 이렇듯 튜플이 아닌 리스트로 묶인다는 사실을 기억하자.
[3,4,5]
튜플을 언패킹 하더라도 *로 묶어서 푼 경우 리스트로 묶인 것을 다시 한번 확인하자
아래와 같은 상황도 참고하자!
nums = (1,2,3,4,5)
first, *others,last = nums # 둘 이상의 값을 리스트로 묶을 때 *를 사용한다.
fist
1
others # 이렇듯 튜플이 아닌 리스트로 묶인다는 사실을 기억하자.
[2,3,4]
last
5
nums = (1,2,3,4,5)
*others,n1,n2 = nums # 둘 이상의 값을 리스트로 묶을 때 *를 사용한다.
others
[1,2,3] # 이렇듯 튜플이 아닌 리스트로 묶인다는 사실을 기억하자.
n1
4
n2
5
*는 어떤 자리에도 올 수있다. 그리고 리스트 역시 언패킹이 가능하다.
nums = [1,2,3,4,5]
n1,n2, *others = nums # 리스트도 언패킹됨
1
n2
2
others
[3,4,5]
튜플일때나 리스트일때나 결과는 완전히 동일한 것을 알 수 있다.
다음 예제와 같이 return문을 다음과 같이 구성할 수 있다.
def ret_nums():
return 1,2,3,4,5 # 튜플의 소괄호가 생략된 형태이다. 즉 패킹되어 반환된 것이다.
nums = ret_nums()
nums
(1,2,3,4,5)
그리고 다음과 같은 형태의 매개변수 선언도 가능하다.
def show_nums(n1,n2,*other): # 세 번째 이후 값들은 튜플로 묶여 other에 전달
print(n1,n2,other,sep=', ')
show_nums(1,2,3,4) # 3,4는 리스트로 묶일 줄 알았는데 튜플로 묶인다.
1,2,(3,4)
위와 같이 매개변수 앞에 *가 오면 이는 다음을 의미한다.
"나머지 값들은 튜플로 묶어서 이 변수에 저장하겠다."
그래서 다음과 같이 전달되는 값의 수에 상관없이 모든 정수의 합을 계산해서 반환하는 함수도 만들 수 있다.
def sum(*nums) # 전달되는 모든 값들을 하나의 튜플로 묶어서 nums에 저장
s = 0
for i in nums:
s += i
return s
sum(1,2,3)
6
sum(1,2,3,4)
10
sum(1,2,3,4,5)
반면 다음과 같이 '함수를 호출할 때 *가 사용되면' 이는 튜플 언패킹으로 이어진다. 이렇듯 *는 사용되는 위치에 따라서 패킹을 의미하기도 하고 언패킹을 의미하기도 한다.
def show_man(name,age,height):
print(name,age,height, sep=', ')
p = ('Yoon', 22, 180) # 180cm의 22세 Yoon군
show_man(*p) # p에 담긴 값을 풀어서 각각의 매개변수에 전달!!!!
Yoon, 22, 180
물론 위의 함수 호출과정에서 보인 언패킹은 리스트를 대상으로도 작동한다. 즉 다음과 같이 리스트를 전달하는 것도 가능하다.
P = ['Park', 21, 177]
show_man(*p) #리스트를 전달하는데 *를 붙인상황
Park, 21, 177
t = (1,2,(3,4)) #튜플안에 튜플이 있다.
a,b(c,d) = t
print(a,b,c,d,sep = ', ')
1, 2, 3, 4
위의 내용을 총 네 개의 변수에 나눠서 담을 때에는
1, 2, (3, 4) 다음과 같이 동일한 형태로 변수를 선언해서 언패킹 해야한다.
a, b, (c, d)
그리고 다음 튜플을 대상으로 이름과 키(height) 정보만 필요하다고 가정해보자
P = 'Hong', (32, 178), '010-1234-56xx', 'Korea'
na, (ag,he), ph, ad = P
print(na,he)
Hong 178
근데 이름과 키정보를 얻기 위해서 위와 같이 불필요한 정보까지 변수에 담는 것은 번거로운 일이다. 그래서 이러한 경우 다음 예에서 보이는 방법으로 이름과 키 정보만 뽑아내느 것이 더 편하다.
na, (_, he), _, _ = P
print(na,he)
Hong 178
[for 루트에서의 언패킹]
for 루프의 구성에서도 다음과 같은 형태로 언패킹을 진행할 수 있다.
ps = [('Lee',172),('Jung',182),('Yoon',179)] #리스트에 담긴 튜플
for n,h in ps:
print(n,h, sep = ', ')
Lee, 172
Jung, 182
Yoon, 179
만약 for i in ps: 와 같이 하나의 변수를 두면 튜플이 담기는데
ps안의 요소가 총 3개니까 3번 반복을 돌면서 요소들이 전부 튜플이니까 반복문이 돌면서 언패킹도 동시에 진행되고 있는 것을 확인할 수 있다.
ps = (['Lee',172],['Jung',182],['Yoon',179]) #튜플에 담긴 리스트
for n,h in ps:
print(n,h, sep = ', ')
Lee, 172
Jung, 182
Yoon, 179
겉에 감싸고 있는 것이 튜플이냐 리스트냐 -> 상관없다.
안에 요소가 튜플이냐 리스트냐 -> 상관없다.
물론 이 경우에도 언패킹이 진행이 된다.
'Python > 윤성우 열혈 파이썬' 카테고리의 다른 글
13강 dict의 생성과 zip (0) | 2021.12.22 |
---|---|
12강 네임드 튜플 (0) | 2021.12.22 |
10강 제너레이터 표현식 (0) | 2021.12.16 |
9강 제너레이터 함수 (0) | 2021.12.16 |
8강 map과 filter를 대신하는 리스트 컴프리헨션 (0) | 2021.12.16 |