본문 바로가기

개발/파이썬

[Python] 문법 기초 - 자료형

정수형/실수형

  • 코테에서 이 정수형을 주로 다루게 됨.
  • 실수형 : 4바이트, 8바이트 등 고정된 크기의 메모리를 할당하므로 컴퓨터 시스템은 실수 정보를 표현하는 정확도에 한계를 가짐. (ex - 10진수에서 0.3+0.6=0.9 이지만, 2진수는 정확히 표현할 방법이 없음. 미세한 오차 발생)
  • round() 함수를 이용하는 것이 권장됨. 주로 반올림해서 소수점 아래 몇째자리 까지의 정확성을 보장함.

지수 표현 방식

  • 파이썬에선 e나 E를 이용해 지수 표현 방식을 사용할 수 있음.
  • e나 E 다음에 오는 수는 10의 지수부를 의미함.
  • 1e9 ⇒ 10의 9제곱
  • '최단 경로 알고리즘'에서는 도달할 수 없는 노드에 대하여 최단 거리를 무한(INF)로 설정하곤 함.
    ⇒ 이때, 가능한 최댓값이 10억 미만이라면 무한(INF)의 값으로 1e9를 이용할 수 있음.

주로 사용하는 연산자

  • 나누기 연산자(/) 사용 시 주의 
    • 파이썬에선 나누기 연산자(/) 사용 시, 실수형으로 반환됨.
  • 나머지 연산자(%)
    • 사용 예시: a가 홀수인지 확인해야 하는 경우
  • 몫 연산자(//)
  • 거듭 제곱 연산자(**)

 

리스트 자료형

  • 연결 리스트와 유사한 기능까지 지원함
  • C++의 STL vector와 기능적으로 유사함 (Java는 ArrayList)
  • 리스트 대신 배열 혹은 테이블이라 부르기도 한다.
  • 거꾸로 인덱싱 가능 (음수 활용)
  • # 뒤에서 첫번째 원소 출력 print(a[-1])
  • 슬라이싱(Slicing)
    • 연속적인 위치를 갖는 원소들을 가져와야 할 때 사용
    • 대괄호 안에 콜론(:)을 넣어서 시작 인덱스끝 인덱스 설정 가능
    • 참고: 끝 인덱스는 실제 인덱스보다 1을 더 크게 설정함
    • a = [1, 2, 3, 4, 5, 6, 7, 8, 9] # 두번째 ~ 네번째 원소 출력 print(a[1 : 4]) # [1:3] 일 것 같은데 4까지 써줘야 함
  • 리스트 컴프리헨션
    • 리스트를 초기화하는 방법 중 하나. 대괄호 안에 조건문과 반복문을 적용해 리스트를 초기화 할 수 있다. 
    • # 0 ~ 19까지의 수 중 홀수만 포함하는 리스트 array = [i for i in range(20) if i % 2 == 1] # 1 ~ 9까지의 수들의 제곱 값을 포함하는 리스트 array = [i * i for i in range(1, 10)]
    • array = [i for i in range(10)] print(array) # 결과 : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    • 2차원 리스트를 초기화할 때 효과적으로 사용할 수 있음. (N x M 크기)
    • # 좋은 예시 array = [[0] * m for _in range(n)] # 잘못된 예시 (전체 리스트 안에 포함된 각 리스트가 모두 같은 객체로 인식되어버림) array = [[0] * m] * n

언더바 사용은 언제?

  • 파이썬에선 반복을 수행할 때, 반복을 위한 변수의 값을 무시하고자 할 때 언더바(_)를 자주 씀.
    (반복을 위해 사용한 변수가 사용되지 않을 때)
  • # "Hello World"를 5번 출력하기 (변수 불필요) for _ in range(5): print("Hello World") # 1~9까지의 자연수 더하기 (변수가 필요한 상황) sum = 0 for i in range(1, 10): sum += i print(sum)

리스트 관련, 자주 사용하는 기타 메서드

  • remove() : removeAll() 이 파이썬엔 없기 때문에, 특정한 값을 가진 원소를 모두 제거하기 위해선 별도의 로직이 필요함.
      a = [1, 2, 3, 4, 5, 5, 5]
      remove_set = {3, 5}   # 집합 자료형
    
      #remove_list에 포함되지 않은 값만 저장
      result = [i for i in a if i not in remove_set]
      print(result)
    
      # 결과: [1, 2, 4]
  • 집합 자료형을 사용해야 함 (특정 원소의 존재 유무를 파악할 때 효과적으로 사용할 수 있음)

 

문자열 자료형

  • 다른 언어와 달리 큰 따옴표(”), 작은 따옴표(’) 모두 사용 가능
  • 덧셈과 곱셈을 사용할 수 있음.
  • 인덱싱과 슬라이싱 사용이 가능하나, 특정 인덱스의 값을 변경할 수는 없다.

 

튜플 자료형

  • 리스트와 유사하나, 한 번 선언된 값을 변경할 수 없다.
    ⇒ 바뀌면 안되는 데이터를 저장하기 좋겠네.
  • 소괄호(())를 이용해 선언하되, 리스트처럼 []로 특정 인덱스 값을 가져올 수 있음.
  • 기능이 제한적이지만 리스트에 비해 상대적으로 공간 효율적이다. (더 적은 양의 메모리를 사용함)
a = (1, 2, 3, 4, 5, 6, 7, 8, 9)

# 두번째 ~ 네번째 원소 출력
print(a[1 : 4])

튜플을 사용하면 좋은 경우

  • 서로 다른 성질의 데이터를 묶어서 관리해야 할 때
    (회사에서 만든 NameValue<K,V> 와 비슷할 듯)
    • 최단 경로 알고리즘에서는 (비용, 노드 번호)의 형태로 튜플 자료형을 자주 사용함.
  • 데이터의 나열을 해싱(Hasing)의 키 값으로 사용해야 할 때
    • 리스트와 다르게 변경이 불가능하니 키 값으로 사용 가능
  • 리스트보다 메모리를 효율적으로 사용해야 할 때

 

사전 자료형

  • 키(Key)와 값(Value)의 쌍을 데이터로 가지는 자료형으로, 다른 언어에선 해시 테이블로 불린다.
  • 변경 불가능(Immutable) 자료형을 키로 사용할 수 있다.
  • 사전 자료형은 해시 테이블(Hash Table)을 이용하므로, 데이터의 조회 및 수정에 있어서 O(1)의 시간에 처리할 수 있다.
  • 키와 값을 별도로 뽑아내는 메서드를 제공한다.
    • keys() : 키 데이터만 뽑아서 리스트로 이용
    • values() : 값 데이터만 뽑아서 리스트로 이용
# 사전 자료형 초기화1
a = dict()
a['key1'] = 1
a['key2'] = 2

# 사전 자료형 초기화2
b = {
    'key3': 3, 
    'key4': 4
}

key_list = list(b.keys())

 

집합 자료형

  • 중복을 허용하지 않는다.
  • 순서가 없다. (⇒ 인덱싱으로 값을 얻을 수 없음)
  • 리스트 혹은 문자열을 이용해 초기화 할 수 있다. set() 함수 사용.
  • 데이터의 조회 및 수정에 있어서 O(1)의 시간에 처리할 수 있다.
# 집합 자료형 초기화 방법1
data = set([1, 1, 2, 3, 4, 4, 5])

# 집합 자료형 초기화 방법2
data = {1, 1, 2, 3, 4, 4, 5}
  • 기본적으로 제공되는 집합 연산: 합집합, 교집합, 차집합
# 합집합
print(a | b)

# 교집합
print(a & b)

# 차집합
print(a - b)