-
60 - (파이썬) 튜플, 이뮤터블 자료, 뮤터블 자료study with Q - 파이썬 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 될수있는 타입을 의미한다.
니가 왜 여기서 나와....?
'study with Q - 파이썬' 카테고리의 다른 글
62 - (파이썬) map/filter 함수 구현 (0) 2024.07.03 61 - (파이썬) 콜백함수, map/filter 함수 (0) 2024.07.01 59 - (파이썬) 조기 리턴과 리스트 평탄화하는 재귀 함수 (0) 2024.06.23 58 - (파이썬) 재귀 함수, 피보나치 수, 메모화(memorization) (0) 2024.06.19 57 - (파이썬) 재귀 함수, 팩토리얼 연산 (0) 2024.06.19