[Python] Data Types

Yujin·2023년 7월 18일
0
post-thumbnail

Data Types

Data Types : 값의 종류와 그 값에 적용 가능한 연산과 동작을 결정하는 속성

1. Numeric Types (수치형)

(1) int (정수) - 0, 음수, 양수

<진수 표현>

  • 2진수 (binary) : 0b
  • 8진수 (octal) : 0o
  • 16진수 (hexadecimal) : 0x
print(0b10) # 2
print(0030) # 24
print(0x10) # 16

#진법 변경
print(bin(12)) # 0b1100
print(oct(12)) # 0o14
print(hex(12)) # 0xc

(2) float (실수) - 유리수, 무리수

  • 프로그래밍 언어에서 float는 실수에 대한 근삿값

<유한 정밀도>

  • 컴퓨터 메모리 용량이 한정돼 있고 한 숫자에 대해 저장하는 용량이 제한됨
  • 0.6666666666666666과 1.6666666666666667은 제한된 양의 메모리에 저장할 수 ㅣㅇㅆ는 2/3과 5/3에 가장 가까운 값
print(2 / 3) # 0.6666666666666666
print(5 / 3) # 1.6666666666666667

<실수 연산 시 주의사항>

  • 컴퓨터는 2진수를 사용, 사람은 10진법을 사용
  • 이때 10진수 0.1은 2진수로 표현하면 0.00011001100110011001100110… 같이 무한대로 반복
  • 무한대 숫자를 그대로 저장할 수 없어서 사람이 사용하는 10진법의 근삿값만 표시
  • 0.1의 경우 3602879701896397 / 2 ** 5이며 0.1에 가깝지만 정확히 동일하지는 않음
  • 이런 과정에서 예상치 못한 결과 발생
  • 이런 증상을 ‘Floating point rounding error’라고 함

<Floating point rounding error 해결책>

  • 두 수의 차이가 매우 작은 수보다 작은지를 확인하거나 math 모듈 활용
a = 3.2 - 3.1 # 0.10000000000000009
b = 1.2 - 1.1 # 0.09999999999999987

# 1. 임의의 작은 수 활용
print(abs(a - b) <= 1e-10) # True

# 2. math 모듈 활용 (더 정확)
import math
print(math.isclose(a, b)) # True

<지수 표현 방식>

  • e또는 E를 사용한 지수 표현
number = 314e-2 # 314 * 0.01 (e-2 : 10의 -2제곱. e 의미 : 제곱 표현을 하겠다.)

print(type(number)) # float

print(number) # 3.14

print(314e2) # 31400.0

(3) complex (복소수)

2. Text Sequence Type

(1) str (문자열)

  • 문자들의 순서가 있는 변경 불가능한 시퀀스 자료형 (불변형 자료형)

  • 표현 방법

    • 문자열은 단일 문자나 여러 문자의 조합으로 구성
    • 작은 따옴표(’) 또는 큰 따옴표(”)로 감싸서 표현
      • 한 파일 내에서는 하나의 따옴표로 통일 권장
  • 중첩 따옴표

    • 따옴표 안에 따옴표를 표현할 경우
      • 작은 따옴표가 들어 있는 경우 : 큰 따옴표로 문자열 생성

      • 큰 따옴표가 들어 있는 경우 : 작은 따옴표로 문자열 생성

        
        print("문자열 안에 '작은 따옴표'를 사용하려면 큰 따옴표로 묶는다.")
        print('문자열 안에 "큰 따옴표"를 사용하려면 작은 따옴푤로 묶는다.')
  • Escape sequence

    • 역슬래시(backslash) 뒤에 특정 문자가 와서 특수한 기능을 하는 문자 조합

    • 파이썬의 일반적인 문법 규칙을 잠시 탈출한다는 의미

      예약 문자내용 (의미)
      \n줄 바꿈
      \t
      \백슬래시
      \’작은 따옴표
      \”큰 따옴표
  • String Interpolation : 문자열 내에 변수나 표현식을 삽입하는 방법

    • f-string : 문자열에 f 또는 F 접두어를 붙이고 표현식을 {expression}로 작성하여 문자열에 파이썬 표현식의 값을 삽입할 수 있음

      bugs = 'roaches'
      counts = 13
      area = 'living room'
      
      #Debugging roaches 13 living room
      print(f'Debugging {bugs} {counts} {area}') 
      #f-string 응용
      greeting = 'hi'
      print(f'{greeting:^10}') 
      print(f'{greeting:>10}') 
      print(f'{3.141592:.4f}') #앞의 실수를 소수점 4자리까지 출력 (3.1416)
    • str.format : f-string 이전 사용했던 문법

      #Debugging roaches 13 living room
      print('Debugging {} {} {}'.format(bugs, counts, area))
    • % operator : formatting 이전 사용했던 문법

      #Debugging roaches 13 living room
      print('Debugging %s %d %s' %(bugs, counts, area))
  • slicing

    • 기본 형태 lst[start:end:step]

      • start : 슬라이싱 시작 위치
      • end : 슬라이싱 끝낼 위치 cf) end 값을 포함하지 않고 end-1 까지의 값을 포함
      • step : 슬라이싱 할 단위를 지정하며 생략할 경우 1단위가 됨
    • 특정 시작 위치부터 끝까지 (end 값 생략)

      my_str = "hello"
      print(my_str[3:]) # lo
    • 처음 부터 특정 위치까지 (start 값 생략)

      my_str = "hello"
      print(my_str[:3]) # hel
      print(my_str[::-1]) # olleh (문자열 뒤집기)
    • 중간 부분 가져오기

      my_str = "hello"
      print(my_str[2:4]) # ll
    • step 활용

      my_str = "hello"
      print(my_str[0:5:2]) # hlo
  • 문자열은 불변 (변경 불가)
my_str = 'hello'

my_str[1] = 'z' # TypeError : 'str' object does not support item assignment

3. Sequence Types - list, tuple, range

여러개의 값들을 순서대로 나열하여 저장하는 자료형

<특징>

  • 순서 (sequence)
    • 값들이 순서대로 저장 (cf. 정렬은 아님. 그냥 나열)
  • 인덱싱 (indexing)
    • 각 값에 고유한 인덱스(번호)를 가지고 있으며, 인덱스를 사용하여 특정 위치의 값을 선택하거나 수정할 수 있음
    • 0부터 시작
  • 슬라이싱 (slicing)
    • 인덱스 범위를 조절해 부분적인 값 추출 가능
  • 길이 (length)
    • len() 함수를 사용하여 저장된 값의 개수(길이)를 구할 수 있음
  • 반복 (iteration)
    • 반복문을 사용하여 저장된 값들을 반복적으로 처리 가능

(1) list (리스트)

  • 0개 이상의 객체를 포함하며 데이터 목록을 저장
    • 0개일 때 : 빈 객체
  • 대괄호 사용

(2) tuple (튜플)

  • 0개 이상의 객체를 포함하며 데이터 목록을 저장
  • 소괄호 사용
  • 불변 (변경 불가)
my_tuple = (1, 'a', 3, 'b', 5)

my_tuple[1] = 'z' # TypeError : 'tuple object does not support item assignment
  • 튜플은 개발자가 직접 사용하기보다 파이썬 내부 동작에서 주로 사용
x, y = (10, 20)

print(x) # 10
print(y) # 20

# 파이썬은 쉼표를 튜플 생성자로 사용하므로 괄호는 생략 가능
x, y = 10, 20

(3) range

  • 연속된 정수 시퀀스를 생성하는 변경 불가능한 자료형
  • 표현
    • 인수가 1개일 때
      • range(MAX)
      • 0 부터 MAX-1까지의 숫자를 연속된 객체로 만들어 반환 (MAX 포함 X)
        range(10) # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
    • 인수가 2개일 때
      • range(MIN, MAX)
      • MIN 부터 MAX-1 까지의 숫자를 연속된 객체로 만들어 반환 (MAX 포함 X)
    • 인수가 3개일 때
      • range(MIN, MAX, GAP)
      • MIN에서 MAX-1 까지의 숫자를 연속된 객체로 만들어주는데, 각 숫자들 사이에 GAP 만큼의 차이를 두고 만들어준다.
        range(0, 10, 2) # 0, 2, 4, 6, 8
  • 리스트로 형 변환 시 데이터 확인 가능
my_range_1 = range(5)
my_range_2 = range(1, 10)

print(list(my_range_1)) # [0, 1, 2, 3, 4]
print(list(my_range_2)) # [1, 2, 3, 4, 5, 6, 6, 7, 8, 9]

4. Non-sequence Types - dict, set

(1) dict (딕셔너리)

  • key-value 쌍으로 이루어진 순서와 중복이 없는 변경 가능한 자료형
  • key는 변경 불가능한 자료형만 사용 가능 (str, int, float, tuple, range, …)
  • value는 모든 자료형 사용 가능
  • 중괄호({}) 사용
my_dict_1 = {}
my_dict_2 = {'key' : 'value'}
my_dict_3 = {'apple' : 12, 'list' : [1, 2, 3]}

print(my_dict_1) # {}
print(my_dict_2) # {'key' : 'value'}
print(my_dict_3) # {'apple' : 12, 'list' : [1, 2, 3]}

print(my_dict_3['apple']) # 12
print(my_dict_3['list']) # [1, 2, 3]

# 값 변경
my_dict_3['apple'] = 100
print(my_dict_3) # {'apple' : 100, 'list' : [1, 2, 3]}

(2) set (세트)

  • 순서와 중복이 없는 변경 가능한 자료형 (순서 보장 X, 중복 허용 X)
  • 순서가 없으므로 인덱스가 없다.
  • 수학에서의 집합과 동일한 연산 처리 가능
  • 중괄호({}) 사용
my_set_1 = set() # 빈 자료형을 나타낼 때는 set() 형태로 작성. 빈 중괄호로 나타낼 경우 dict와 혼동 우려
my_set_2 = {1, 2, 3}
my_set_3 = {1, 1, 1}

print(my_set_1) # set()
print(my_set_2) # {1, 2, 3}
print(my_set_3) # {1}
my_set_1 = {1, 2, 3}
my_set_2 = {3, 6, 9}

# 합집합
print(my_set_1 | my_set_2) # {1, 2, 3, 6, 9}

# 차집합
print(my_set_1 - my_set_2) # {1, 2}

# 교집합
print(my_set_1 & my_set_2) # {3}

5. 기타

(1) None

  • 파이썬에서 ‘값이 없음’을 표현하는 자료형
variable = None
print(variable) # None

(2) Boolean

  • 참(True)과 거짓(False)을 표현하는 자료형
  • 비교/논리 연산의 평가 결과로 사용됨
  • 주로 조건문, 반복문과 함께 사용
bool_1 = True
bool_2 - False

print(bool_1) # True
print(bool_2) # False

print(3 > 1) # True
print('3' != 3) # False

(3) Collection

  • 여러 개의 항목 또는 요소를 담는 자료 구조

  • str, list, tuple, set, dict

컬렉션변경 가능 여부나열, 순서 여부
strXO (Sequence)
listOO (Sequence)
tupleXO (Sequence)
setOX (Non-sequence)
dictO (단, key는 변경 불가. value는 변경 가능)X (Non-sequence)
# 불변과 가변
my_str = 'hello'
# my_str[0] = 'z' # 에러 발생

my_list = [1, 2, 3]
my_list[0] = 100
print(my_list) # [100, 2, 3]
  • list를 객체들의 참조를 모아놓은 컬렉션이라고도 부른다.
  • 참조를 100으로 바꿔놓았다.

  • 참고
    • 가변 데이터의 특징
      list_1 = [1, 2, 3]
      list_2 = list_1 # list_1의 "메모리 주소"를 list_2에 할당 (값을 할당 X)
      
      list_1[0] = 100
      print(list_1) # [100, 2, 3]
      print(list_2) # [100, 2, 3]
    • 불변 데이터의 특징
      x = 10
      y = x
      
      x = 20
      print(x)
      print(y)

형 변환

1. 암시적 형 변환

파이썬이 자동으로 형 변환을 하는 것

# 범위가 더 넓은 쪽으로 변환됨. int 보다 float 범위가 넓으므로 float 형태로 변환
print(3 + 5.0) # 8.0

# True = 1, False = 0
print(True + 3) # 4
print(True + False) # 1

2. 명시적 형 변환

개발자가 직접 형 변환을 하는 것. 암시적 형 변환이 아닌 경우를 모두 포함

  • str → integer : 형식에 맞는 숫자만 가능
  • integer → str : 모두 가능

1개의 댓글

comment-user-thumbnail
2023년 7월 18일

항상 좋은 글 감사합니다.

답글 달기