ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 될수있는 타입을 의미한다.

     

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

     


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

Designed by Tistory.