60 - (파이썬) 튜플, 이뮤터블 자료, 뮤터블 자료
# 람다
: 매개변수로 함수를 전달하기 위해 함수 구문을 작성하는 것이 번거로울 때 함수를 간단하게 선언하는 방법. 1회용 함수를 만들어야 할 때 주로 사용한다.
# 튜플
: 함수와 함께 사용되는 리스트와 비슷한 자료형으로, 리스트와 다르게 한번 결정된 요소는 바꿀 수 없다.
- 소괄호 기호를 사용해서 만든다.
- 요소 접근 연산자를 이용해 각각의 요소에 접근할 수 있다.
tup = (0,1,"two",True)
print(tup)
print(tup[0])
print(tup[2])
print(tup[3])
>>>
(0, 1, 'two', True)
0
two
True
- 요소를 하나만 가지는 튜플을 만드려면 다음과 같이 쉼표를 넣어서 선언한다. (쉼표를 넣지않으면 숫자, 문자열 등에 괄호를 감싼 것이라고 인식한다.)
# 이렇게 하면 <class 'str'>
st = ("zero")
print(st,type(st))
>>>
zero <class 'str'>
# 이렇게 해야 <class 'tuple'>
tu = (0,)
print(tu,type(tu))
>>>
(0,) <class 'tuple'>
- 괄호를 생략해도 튜플로 인식할 수 있는 경우에는 괄호를 생략하기도 한다.
np1 = 10, 20, 30
np2 = "내가 튜플이 될 상인가",
print(np1,type(np1))
print(np2,type(np2))
>>>
(10, 20, 30) <class 'tuple'>
('내가 튜플이 될 상인가',) <class 'tuple'>
- 리스트와 다르게 한번 결정된 요소는 바꿀 수 없다.
#리스트
liszt = [1,2,3,"drink"]
liszt[3] = 4
print(liszt)
>>>
[1, 2, 3, 4]
#튜플
tup = (1,2,3,"drink")
tup[3] = 3.141592
print(tup)
>>>
TypeError: 'tuple' object does not support item assignment
그러니께 튜플은
1. 외관이 간단하고
2. 요소를 변경할 수 없다.
... 그래서?
# 튜플의 특성 (1) 외관이 간단하다
다중 할당 구문 (aka 괄호 없는 튜플)
: 왼쪽과 오른쪽에 반복할 수 있는 것을 올리고 =로 연결하면 왼쪽 변수에 오른쪽의 값이 할당된다. 리스트로도 작성할 수 있지만 튜플이 더 간단하게 생겨서 튜플을 사용한다.
(a,b) = (3,4)
print("a:",a)
print("b:",b)
>>>
a: 3
b: 4
여기에 괄호를 생략하면
a,b = 3,4
print("a:",a)
print("b:",b)
>>>
a: 3
b: 4
참고적으로 다중 할당 구문의
- 왼쪽 위치에는 리스트와 튜플 형태의 코드만 쓸 수 있다. (딕셔너리는 사용 불가)
- 오른쪽은 반복가능한 것은 모두 가능하다.
- 리스트와 섞어서 a, b = [10, 20] 처럼 쓸 수도 있다.
아 근디 아래와 같은 코드는 1=3이 되어서 오류 뜸 ㅇㅅㅇ
[1,2] = [3,4]
>>> SyntaxError: cannot assign to literal
책에만 나오는... 변수의 값을 교환하는 튜플
#변수 값 교환
a,b = 10,20
print("교환 전")
print("a:",a)
print("b:",b)
print("교환 후")
a,b = b,a
print("a:",a)
print("b:",b)
>>>
교환 전
a: 10
b: 20
교환 후
a: 20
b: 10
튜플과 함수
: 함수의 리턴에 튜플을 사용하면 여러 개의 값을 리턴하고 할당할 수 있기 때문에 튜플은 함수의 리턴에 많이 사용된다.
#함수 선언
def f():
return (0,1,2)
#여러 개의 값 리턴
x,y,z = f()
#출력
print("x:",x)
print("y:",y)
print("z:",z)
>>>
x: 0
y: 1
z: 2
튜플과 함수 리턴 : enumerate
nyam = ["고구마", "노각", "두리안"]
i = 0
for item in nyam :
print(i, item)
i += 1
>>>
0 고구마
1 노각
2 두리안
-를 enumerate를 이용해서 입력하면
nyam = ["고구마", "노각", "두리안"]
for item in enumerate(nyam) :
print(item)
>>>
(0, '고구마')
(1, '노각')
(2, '두리안')
이고, 여기서 item은 튜플임을 알 수 있다. 그리고 튜플이니 괄호를 생략하고 이렇게 보여줄 수도 있지.
nyam = ["고구마", "노각", "두리안"]
for i, item in enumerate(nyam) :
print(i, item)
>>>
0 고구마
1 노각
2 두리안
튜플과 함수 리턴 : items()
기억나니...?
cute = {
"오레오" : "냥",
"나이" : 9,
"데뷔" : (2014, 9, 26)
}
for key in cute:
print(key)
>>>
오레오
나이
데뷔
여기에
cute = {
"오레오" : "냥",
"나이" : 9,
"데뷔" : (2014, 9, 26)
}
for key in cute.items():
print(key)
>>>
('오레오', '냥')
('나이', 9)
('데뷔', (2014, 9, 26))
값을 받아서 요렇게 사용한다
cute = {
"오레오" : "냥",
"나이" : 9,
"데뷔" : (2014, 9, 26)
}
for key, value in cute.items():
print(key,value)
>>>
오레오 냥
나이 9
데뷔 (2014, 9, 26)
기억해줘) 이렇게 내부의 요소를 변경하지 않으면서 여러 개의 요소를 사용하는 것은 기능이 간단하고 용량도 덜 잡아먹는 튜플을 쓰는 것이 일반적이다.
# 튜플의 특성 (2): 요소를 변경할 수 없다
자료의 구분 방법 : 기본자료형 & 복합자료형
자료의 다른 구분 방법 : 뮤터블 & 이뮤터블
이뮤터블 자료
: 변수에 넣었을 때 스택에 있는 값을 변경해야만 값을 변경할 수 있는 자료
eg) 숫자, 불, 문자열, 튜플
#이뮤터블
i = 100
i = 0
bl = True
bl = False
hey = "드루와"
hey = "나가"
print(i)
print(bl)
>>>
0
False
나가
그래서 스택에 있는 값 내부의 하나만 변경이 안된다. 즉,
hey = "나가"
hey[0] = "와"
>>>
TypeError: 'str' object does not support item assignment
그래서 아까
tup = (1,2,3,"drink")
tup[3] = 3.141592
print(tup)
>>>
TypeError: 'tuple' object does not support item assignment
뮤터블 자료
: 변수에 넣었을 때 스택에 있는 값을 변경하지 않아도 값을 변경할 수 있는 자료 (뭔 소리여)
eg) 리스트, 딕셔너리
liszt = [1,2,3,"drink"]
liszt[3] = 4
print(liszt)
>>>
[1, 2, 3, 4]
그래서, 이뮤터블 자료는 딕셔너리의 키로 사용할 수 없다.
(단, 이는 성립하지 않는다. 뮤터블 자료를 딕셔너리의 키로 사용할 수 없다는 아니다. 특수처리하면 뮤터블 자료도 딕셔너리 키로 쓸 수 있긴 함.)
dict = {
("튜플을", "key로") : True
}
print(dict)
>>>
{('튜플을', 'key로'): True}
... 어따 써요? > 메모화에 쓸 수 있어염
calendar = {
(2024,5,27) : "독해 AI과제, 강제성 해제 배포",
(2024,7,2) : "마이너 이슈 배포",
(2024,9,9) : "형성평가 재평가 배포"
}
for k, v in calendar.items():
print(k,v)
>>>
(2024, 5, 27) 독해 AI과제, 강제성 해제 배포
(2024, 7, 2) 마이너 이슈 배포
(2024, 9, 9) 형성평가 재평가 배포
리스트를 키로 못 쓰는 이유는 unhashable이라서 인데.. 이건 좀 고급 개념임
calendar = {
[2024,5,27] : "독해 AI과제, 강제성 해제 배포",
[2024,7,2] : "마이너 이슈 배포",
[2024,9,9] : "형성평가 재평가 배포"
}
>>>
TypeError: unhashable type: 'list'
※ 정리하자면 emutable이면 hashable이고 hashable이면 딕셔너리의 key로 쓸 수 있다.
그래서 emutable인 숫자, 불, 문자열, 튜플은 딕셔너리의 key로 쓸 수 있다.
....어?
hashable...?
Hashable이란, hasher로 인하여 int값인 hash value를 가져서 hashing 될수있는 타입을 의미한다.

니가 왜 여기서 나와....?