python의 자료형

scala data

  • bool, byte, int, float, complex

vector data

  • list, set, dict: 가변 시퀀스 - 데이터 변경이 가능
  • bytes, str, tuple: 불변 시퀀스 - 데이터 변경이 불가능

문자열

  • 문자열은 + 와 비교 연산자가 오버로딩 되어 있음
  • + 연산은 주의
  • 문자열을 영문과 숫자를 제외하고는 인코딩과 디코딩을 이용해서 저장하고 읽음
    • 한글의 경우는 euc-kr, ms949(cp949), utf-8, utf-8mb4 등이 있음
    • 최근에는 utf-8이나 utf-8mb4만 이용
  • 윈도우즈에서 한글을 사용하게 되면 기본 인코딩이 ms949인 경우가 있는데 인코딩이 다른 데이터를 읽어내면 글자가 깨지게 됨, 한글이 포함된 텍스트를 읽을 때는 인코딩을 확인하는 습관을 갖는데 좋음

list

  • 데이터를 논리적으로 순서대로 배치하는 자료구조
  • 파이썬의 list는 double linked list
    • 데이터를 동적으로 추가하거나 삭제할 수 있음
    • 맨 앞의 데이터나 맨 뒤의 데이터를 삭제하거나 추가하는 것은 쉽지만 중간에 데이터를 삽입하거나 삭제하면 느림
  • list는 스레드에 안전하지 않음
  • list 대안
    • queue.Queue, LifoQueue(스택), PriorityQueue(우선 순위 큐): 스레드 간에 안전하게 통신을 하기 위해서 사용
    • multiprocessing 모듈에서도 Queue와 유사한 클래스를 제공, 태스크 관리에 특화
    • 비동기 환경에서 사용하기 위한 asyncio 모듈의 클래스를 이용하는 것이 좋음
    • heapq 모듈에서도 제공
  • collections 모듈의 deque 클래스
    • queue는 FIFO 방식으로 동작
    • deque는 앞과 뒤 양쪽에서 삽입과 삭제가 가능
    • append와 pop에서 압도적으로 빠른 작업 시간을 가짐
    • 양끝단의 데이터를 추가하거나 삭제하는 작업의 경우 list는 O(n) 정도의 시간 복잡도를 나타내지만 deque는 O(1)

tuple

  • 리스트와 유사하고 접근 방법도 동일
  • 내부 데이터의 변경이 안됨
  • 생성할 때 ( ) 안에 데이터를 나열해도 되고 괄호를 생략하고 나열해도 됨
    • 하나의 데이터를 가지고 tuple을 만들고자 할 때는 (데이터,) 형태로 만들어야 함
  • unpacking 가능
    • 나누어서 사용이 가능한데 나머지 전부를 배정하고자 할 때는 * 를 붙여줘야 함
  • 리턴 데이터로 많이 사용
t = tuple(range(10))

# 첫번째와 두번째는 0, 1 배정, 나머지는 rest에 배정
# 중간에만 배정도 가능
one, two, *rest = t
one, *middle, last = t

a = 5
r = (a+1, a-1)[a>=5]
  • 기본 튜플은 인덱스를 가지고 데이터를 접근
    • 하나의 행을 나타내기가 어려움
  • collections.namedtuple은 dict처럼 이름과 값을 같이 저장
    • 대다수 다른 언어의 튜플은 namedtuple임
from collections import namedtuple

City = namedtuple("사람", "이름 나이 주소")
person = City("adam", 34, "서울")

print(person)

이중 for

singers = ["태연", "카리나", "이혜리", "조이"]
result = [i for i in singers if len(i) >= 3]
print(result)

li1 = [10, 20, 30]
li2 = [1000, 2000, 3000]
result = [i+j for i in li1 for j in li2]
print(result)

singers = [["태연", "티파니"], ["이혜리", "강민경"], ["아이린", "조이"]]
result = [singer for group in singers if len(group) >= 2 for singer in group]
print(result)