study with Q - 파이썬

60 - (파이썬) 튜플, 이뮤터블 자료, 뮤터블 자료

quaquaz 2024. 6. 24. 20:41

# 람다

: 매개변수로 함수를 전달하기 위해 함수 구문을 작성하는 것이 번거로울 때 함수를 간단하게 선언하는 방법. 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 될수있는 타입을 의미한다.

 

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

 


https://replit.com/@wh3308/tuple