ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 8. 파이썬 자료형 튜플
    파이썬(Python) 강의 2019. 2. 12. 13:55

    이제 문법을 두개 알아보았으니 다시 자료형으로 넘어 올 차례이다. 이 포스트를 통해 파이썬에 존재하는 튜플(Tuple)을 어떻게 표현하고, 어떤 함수들이 있는지 살펴보도록 한다.

    들어가기전에

    이 포스트는 여러분이 파이썬을 설치했고 각자 원하는 IDE를 이용해 파이썬을 개발한다고 가정한다. 대화형(Interactive) 터미널을 사용해도 상관 없다. 혹시 파이썬을 설치하지 않았다면  1.파이썬 설치 및 개발환경 설정 이 포스트에서 파이썬과 파이썬 개발환경을 먼저 셋업하길 바란다. 앞서 말했듯이 반드시 실습 해 보길 바라고 30분 이상 소요하지 말라. 

    예상 소요 시간 30분 이내

    목표

    • 튜플 (Tuple)
    • 튜플 접근 및 읽기
    • 불변성 (Immutability)
    • 리스트 <-> 튜플
    • sort

    튜플 (Tuple)

     튜플은 리스트와 매우 유사하다. 순서가 존재하고 오브젝트들을 저장 할 수 있다. 리스트처럼 인덱스로 접근이 가능하고 시퀀스 오퍼레이션이 가능하다. 하지만 튜플이 리스트와 다른점이 두 가지 있다. 첫번째는 대괄호([]) 가 아닌 그냥 괄호 (())로 표현한다는 점, 두번째는 내부의 값을 변경 할 수 없다는 점이다. Mutability와 Immutability를 기억하는가? 그렇다 튜플안의 오브젝트들은 Immutable하다. 한번 만들어지면 새로 복사해서 다시 만들지 않는 이상 변경 할 수 없다.

    빈 튜플 (Empty Tuple)

     빈 튜플은 다음과 같이 괄호를 이용해 만든다.
    emptyTuple = ()
    print(emptyTuple) ()

    아이템이 한 개인 튜플

     아이템이 한 개인 튜플은 다음과 같이 만든다. 주의하자. 콤마를 쓰지 않으면 파이썬이 튜플로 인식하지 못한다.
    oneElementTuple = (10,)
    print(oneElementTuple) (10, )
    확인하기 위해 콤마를 빼고 실행 해 보자.
    oneElementTuple = (10)
    print(oneElementTuple) 10
    튜플의 형태가 아닌 그냥 숫자가 나오는 것을 확인 할 수 있다.

    아이템이 두 개 이상인 튜플

     아이템이 두 개 이상인 튜플은 콤마로 나누어 표현하면 된다.
    tuple = (10, 30, 20, 80)
    print(tuple)
    자료형을 섞어서 넣은 튜플을 보자. 리스트와 마찬가지로 튜플은 아무 오브젝트나 할당 하는 것이 가능하다.
    tuple = (["apple", "orange"], "cat", 17, 45.3)
    print(tuple) (['apple', 'orange'], 'cat', 17, 45.3)

    중첩 튜플(Nested Tuple)

     리스트와 마찬가지로 튜플도 '아무 오브젝트나' 집어 넣을 수 있기 때문에 자기 자신과 같은 자료형인 튜플도 집어 넣을 수 있다. 

    tuple = ((1, 2), (3, 4), (6, 8))
    print(tuple) ((1, 2), (3, 4), (6, 8))

    튜플 접근 및 읽기

    인덱스로 접근

     튜플은 리스트와 마찬가지로 인덱스를 이용해 접근 가능하다.
    tuple = (10, 30, 20, 80)
    print(tuple[2]) 20

    슬라이싱

     튜플 또한 시퀀스이기 때문에 슬라이싱 오퍼레이션이 가능하다.
    tuple = (10, 30, 20, 80)
    print(tuple[:2]) (10, 30)

    불변성 (Immutability)

    그렇다면 튜플을 수정하면 어떻게 될까? 아래를 실행 해 보자.

    tuple = (10, 30, 20, 80)
    tuple[1] = 100
    print(tuple) tuple[1] = 100 TypeError: 'tuple' object does not support item assignment

    실행을 하면 위 처럼 튜플에 오브젝트를 할당 할 수 없다고 에러가 뜰 것이다. 튜플이 Immutable하기 때문이다. 그렇다면 아래의 예제를 보자.

    tuple = (["apple", "orange"], "cat", 17, 45.3)
    tuple[0][1] = "WHAT?"
    print(tuple) (['apple', 'WHAT?'], 'cat', 17, 45.3)

    어라? 튜플은 분명 수정 할 수 없다고 했는데 왜 orange가  What?으로 변경되었는가??? 자.. 다시한번 본인에게 질문 해 보자. 지금 튜플의 값을 변경했는가, 아니면 튜플 의 값인 '리스트' 안에 있는 값을 변경했는가? 그렇다. 여러분은 리스트의 값을 변경 한 것이디 튜플의 값을 변경한 게 아니다. 레퍼런스에 대해 이야기 했던게 기억나는가? 


    여러분은 붉은 박스의 오렌지 부분의 값을 What으로 바꾼 것이지 튜플이 가지고 있는 값(인덱스 0의 노란색 동그라미 또는 파랗고 긴 네모의 레퍼런스) 자체를 바꾼 것이 아니다. 리스트는 Mutable하므로 당연히 값을 변경 할 수 있다.

    tuple = (["apple", "orange"], "cat", 17, 45.3)
    tuple[0] = ["mango", "banana"]
    print(tuple) tuple[0] = ["mango", "banana"] TypeError: 'tuple' object does not support item assignment
    그렇다면 위의 예는 어떠한가? tuple[0] 자체의 리스트를 아얘 갈아 치우려고 하니까 에러가 난다. 
    혹시 지금 레퍼런스가 어쩌니 저쩌니 이해가 안되도 걱정하지 말라. 지금 넘어가고 파이썬과 컴퓨터를 계속 공부하다 보면 이해하는 날이 온다. 그리고 원래 처음에는 이해가 안되는게 정상이다.

    리스트 <-> 튜플

     튜플을 리스트로 변경하려면 어떻게 할까? list함수를 사용하면 된다.

    tuple = (10, 30, 20, 80)
    tList = list(tuple)
    print(tList) [10, 30, 20, 80]

    마찬가지로 리스트를 튜플로 변경하고 싶다면 tuple함수를 사용하면 된다.
    list = [10, 30, 20, 80]
    lTuple = tuple(list)
    print(lTuple) (10, 30, 20, 80)

    sort

    튜플 내부의 값들을 이용해 소팅을 하려면 sort함수를 이용하면 된다.

    tuple = (100, 20, 1, 49, 3)
    sortedTuple = sorted(tuple)
    print(tuple)
    print(sortedTuple) (100, 20, 1, 49, 3) [1, 3, 20, 49, 100]

    잘 보자. sortedTuple의 자료형이 무엇인가? 그렇다 리스트이다! 튜플은 값을 변경 할 수 없었다는 것을 기억하는가? 그래서 list.sort()가 리스트 내부에서 in-place로 소팅을 했던 것 과 다르게 tuple에서는 tuple의 값을 변경 할 수 없으므로 sort라는 함수가 존재하지 않는다. sorted라는 함수는 본래 리스트를 리턴한다. 

     이번 포스트를 이용해 파이썬 자료형 튜플에 대해서 알아보았다. 다음 포스트에서는 이 블로그에서 다루게 될 마지막 자료형인 파일에 대해서 

    댓글

f.software engineer @ All Right Reserved