[Python] DataType

변수의 생성과 삭제

# 변수의 생성과 삭제
a = 100
print(a)
del a
#print(a) # error 발생

'''
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-5-eb63b6d3deb5> in <module>
      3 print(a)
      4 del a
----> 5 print(a)

NameError: name 'a' is not defined

'''

Data Type!

Python에서 기본적으로 제공하는 built-in DataType으로 아래 6가지를 주로 많이 사용함

1. Numeric(숫자형)

2. Sequence

3. Text Sequence

4. Dictionary

5. Set

6. Bool

이런 DataType을 확인하고 싶거나 데이터가 어떤 class의 instance인지 확인하고 싶으면 type()함수를 사용하면 확인할 수 있다.

print(type(a))

1. Numeric(숫자형)#


Numeric 타입은 숫자 값을 저장한다.

- int(부호있는 정수)
- long(int 보다 긴 정수, 8, 16진수 표현 가능)
- float(부동소수점이 있는 실수)
- complex(복소수)
# example

# integer
a = 123
a = -178
a = 0

# floating-point
a = 1.2
a = -3.45

# float
a = 4.24E10
a = 4.24e-10

# Octal
# 숫자0, 알파벳 o, O로 사용
a = 0o177

# Hexadecimal
# 0x로 시작

a = 0x8ff
b = 0xABC

# complex
a = 3.14j
b = 4.53e1-7j

Tip. 왜 파이썬은 허수단위를 j로 사용하는가?

i는 많은 폰트에서 1(숫자), l(L)과 관련하여 모호성 문제를 가지고 있어서 시각적으로 특이한 편인 j를 사용한다고 한다.

관련 thread Change ‘j’ for imaginary unit into an ‘i’


숫자형을 활용하기 위한 연산자#

  • 사칙연산
    • 기본적인 사칙연산(+, -, *, /)은 계산기처럼 바로 작성해서 사용하면 된다.
a + b

a - b

a * b

a / b
  • x의 y제곱을 나타내는 ** 연산자
    • x의 y제곱($x^y$)값을 돌려준다.
x ** y
  • 나눗셈 //, % 연산자
# 나눗셈 후 나머지를 반환
a % b

# 나눗셈 후 몫을 반환
7 / 4 # 1.75

7 // 4 # 1

2. Sequence#


  • DataType - List
    • 임의의 객체를 순서대로 저장하는 집합
    • index를 이용해서 위치 지정이 가능하고 0부터 시작한다.
    • Literal 표현 : [ ] (대괄호)
a = [] # Literal형 empty list
a = list() # Function형 empty list -> 제일 일반적으로 사용함

a = [1, 2, 3] # Numpy ndarray와 구분 주의! [1 2 3]
a = [1, 3.14, '홍길동', True] # int, float, String, bool
a = [1, 3.14, ['Hello',5], True] # 중첩리스트를 허용함 2차원배열은 아님 이 부분은 Numpy 부분에서 나올 것
  • DataType - Tuple
    • list와 상당히 유사함
    • list와 다른점은 tuple은 Read Only
    • Literal 표현 : ( )
a = () # 요소가 없는 tuple
a = (1, 2, 3)

# 원래 연산자 우선수행 소괄호와의 문제 ex.(1 + 3) * 4
# 연산자 우선수행 소괄호와 구분하기 위해 요소가 1개인 tuple의 리터럴 표현은 ,를 추가한다.
a = (1,) 
print(type(a)) # <class 'tuple'>
a = (1) 
print(type(a)) # <class 'int'>

# tuple은 ()를 생략할 수 있다
a = 1, 2, 3
print(type(a)) # <class 'tuple'>

# tuple 안에 다양한 형태의 요소들이 들어갈 수 있다.
a = 1, 2, (3, 4), [5, 6], 7

# 변경하는 객체에는 그 객체의 속성이 적용됨
# tuple 안에 있는 list의 요소 변경 가능
a[3][0] = 100
print(a[3][0]) # 100
# 아래 예시처럼 tuple안에 있는 요소는 변경이 불가
# a[3] = 100

# list와 tuple간 형변환은 자유롭다
a = (1, 2, 3)
b = 4, 5, 6
print(a + b) # (1, 2, 3, 4, 5, 6)

a = [1, 2, 3]
b = tuple(a)
print(b) # (1, 2, 3)

a = (4, 5, 6)
result = list(a)
print(result) # [4, 5, 6]
  • DataType - Range
    • for등의 반복문에서 주로 사용
    • list에 비해서 작은 메모리 공간으로 큰 데이터 표현이 가능하여 효율이 좋다.
    • 보통 추가 연산자인 in을 같이 사용하는 경우가 많다.
# range(처음, 끝, 증감)
a = range(1, 10, 1) # 1부터 9까지 1씩 증가하는 range
print(a) # range(1, 10)
# range 함수 형태로 표현되며 증감 값이 1이면 보통 생략해서 출력된다.

# 초기값과 증감이 빠진 경우 둘 다 내부적으로 최소 시작값인 0과 1로 정해서 사용된다
a = range(10)
print(a) # range(0, 10)

# indexing slicing
print(a[0]) # 0
print(a[:3]) # range(0, 3)

a = range(3, 100, 10)
print(a[1]) # 13

# range와 많이 사용되는 추가 연산자 in
# 특정 요소가 연속형 자료형 안에 포함 여부를 판별한다.
print(7 in range(10)) # True
print(100 in range(10)) # False
# indexing slicing
print(range(1, 20, 3)[-1]) # 19

Indexing & Slicing 기법#


인덱싱(Indexing)이란 무언가를 가리킨다는 의미고 슬라이싱(Slicing)은 무언가를 잘라낸다는 의미이다.

  • indexing
# indexing 기법
# 숫자 index는 시작이 0부터 시작함
a = [1, 3.14, ['Hello',5], True]

print(a[0])    
print(a[2])
print(a[2][0])
a[3] = 200
print(a)

print(a[-2]) # ['Hello', 5]
print(a[-2][1]) # 5

# output
# 1
# ['Hello', 5]
# Hello
# [1, 3.14, ['Hello', 5], 200]
# ['Hello', 5]
# 5
  • slicing
# slicing => slicing의 결과는 원래 데이터 타입과 동일하다.
a = [1, 3.14, ['Hello',5], True]

print(a[0:2]) # 0부터 2개 slicing(앞은 inclusive 뒤는 exclusive)
              # 앞은 포함, 뒤는 불포함한다.
print(a[0:1]) # 주의 [1]과 1은 다르다 
print(a[2:])  # 2부터 끝까지 slicing
print(a[:2])  # 처음부터 2개 slicing
print(a[:])   # 그대로 slicing

# output
# [1, 3.14, ['Hello', 5], 200]
# [1, 3.14]
# [1]
# [['Hello', 5], 200]
# [1, 3.14]
# [1, 3.14, ['Hello', 5], 200]

Sequence와 함께 사용하는 Method#

  • append()
    • List 마지막에 요소를 추가하는 함수
    • 2가지 형태로 사용이 되는데 원본이 바뀌는 경우와 결과 값이 return되는 경우가 있음
    • append()는 원본이 바뀌는 경우로 return값이 없다. 즉, 원본만 바뀌기 때문에 위의 문장처럼 결과 값을 받는 경우에 값이 들어가지 않기 때문
a = [1, 2, 3]
result = a.append(4) # 틀린 형태 (의미없는 형태)
print(result) # None 

a.append([4, 5, 6]) # append 함수는 입력받은 값을 '그대로' 삽입한다.
print(a) # [1, 2, 3, [4, 5, 6]]
  • extended()
    • append()와 다르게 리스트를 확장시키는 개념
a = [1, 2, 3]
a.extend([4, 5, 6]) 
print(a) # [1, 2, 3, 4, 5, 6]
  • sort()
    • 정렬
    • 기본적으로 오름차순으로 정렬함
a = [3, 7, 10, 1, 2, 8, 4]
a.sort()
print(a) # [1, 2, 3, 4, 7, 8, 10]
  • reverce()
    • List 뒤집기
    • sort()와 함께 사용하면 내림차순으로 정렬이 가능하다.
a.reverse()
print(a) # [10, 8, 7, 4, 3, 2, 1]

3. Text Sequence#


  • 우리가 흔히 다른언어에서 String이라 부르는 것들을 Python에서 Text Sequence DataType이라 한다.

  • str class를 사용한다.

  • 다른 언어(javac++등) 문자(character)와 문자열(String)을 구분하나('a', "a") Python은 구분하지 않고 모두 문자열로 취급한다.

  • 표현 역시 구분하지 않기에 '', "" 두 표현 모두 사용이 가능하다.

  • list안에 각 요소가 문자로 구성되어있다.

  • 문자열 handling은 주의하여 잘 다뤄야 한다.

  • 머신러닝 모델을 만들기 위해서는 Low Data 가공할 때 정확하지 않다면 GIGO(Garbage In Garbage Out)의 결과가 나올 수 있다.

a = 'Hello'
b = 'world'
print(a + b) # Helloworld

# indexing slicing
a = "This is a Sample Text"
print(a[5]) # i
print(type(a)) # <class 'str'>
print(a[3:9]) # s is a

# 문자열은 제어하기 위한 정말 많은 함수가 제공되어있음
# upper() 대문자화
# 원본의 변화가 아닌 결과값에 적용되는 함수임
print(a.upper()) # THIS IS A SAMPLE TEXT
print(a) # This is a Sample Text


# 문자열 끼워넣기

apple = 5
banana = 7

# naive한 방법
print('철수는 사과를 ' + str(apple) + '개 가지고 있고 영희는 바나나를 ' + str(banana) + '개 가지고 있어요')
# 철수는 사과를 5개 가지고 있고 영희는 바나나를 7개 가지고 있어요

# format()
# formating 기호 추가
# 완성되지 않은 문장을 추가함 즉, 나중에 추가될 부분을 표기하고 지정해둠
text = '철수는 사과를 {}개 가지고 있고 영희는 바나나를 {}개 가지고 있어요'
print(text.format(apple, banana))
# 철수는 사과를 5개 가지고 있고 영희는 바나나를 7개 가지고 있어요
print('포도를 {}송이 주세요!'.format(100)) # 많이 쓰는 형태
# 포도를 100송이 주세요!

# len() 
# 변수의 길이를 출력함
a = 'cocacola'
print(len(a)) # 8

# index()
# 받은 인자 값이 있는 첫 index를 return
print(a.index('a')) # 3

# split()
# 문자열을 공백 혹은 지정한 특정 기준으로 분할해서 각각 list에 넣어서 return
a = 'this is a sample text'
result = a.split()
print(result) # ['this', 'is', 'a', 'sample', 'text']

a = 'a,b,c,d,e'
result = a.split(',')
print(result) # ['a', 'b', 'c', 'd', 'e']

4. Dictionary#


  • 사람은 누그든지 이름 = 홍길동, 생일 = xx월 xx일 등으로 구별할 수 있다.
  • 이러한 대응 관계를 연관 배열(Associative array) 또는 해시(Hash)라고 한다. Python에서는 딕셔너리(Dictionary)라고 한다.
  • Dictionary는 list나 tuple처럼 순차적으로(sequential) 해당 요솟값을 구하지 않고 Key를 통해 Value를 얻는다. 다만 최근에는 순서가 있는게 편하다는 의견이 많아 최신 파이썬에서는 순서가 있다.
  • 표현은 중괄호를 통해 표현한다. {key : value}
a = {'용돈' : '10000', '월급' : '10000000000'}
print(type(a))

# indexing slicing
print(a['용돈'])
# 순서가 없기때문에 slicing은 적용이 되지 않는다
# print(a[:1])
a['용돈'] = 20000
print(a['용돈'])

# 다른 언어와 다르게 특이하게 새로 추가하는것도 가능
a['연봉'] = '9999999999999'
print(a)

# 잘못된 사용 방식이지만, python이 중복 키값을 인식해서 이전 키를 지우고 덮어씌움 당연히 사용하면 안좋음
a = {'용돈': 20000, '월급': '10000000000', '연봉': '9999999999999', '용돈': 40000}
print(a)

# 키값은 반드시 수정이 안되는 값으로 사용되어야함
# 키값에 List 사용 안됨
'''
a = { [10, 20] : 'Hello'}
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-73-6dc4d823cf2a> in <module>
     28 # 키값은 반드시 수정이 안되는 값으로 사용되어야함
     29 # 키값에 List 사용 안됨
---> 30 a = { [10, 20] : 'Hello'}

TypeError: unhashable type: 'list'

'''
# 수정이 불가하게 Read Only인 tuple은 사용 가능하나 일반적으로 문자열을 키값으로 이용함
a = { (10, 20) : 'Hello'}
print(a)

# dictionary와 관련된 함수 3개
# keys()
# dictionary의 key값만 추출
a = {'용돈': 20000, '월급': '10000000000', '연봉': '9999999999999'}
print(a.keys())
# 출력 값이 dict_keys(['용돈', '월급', '연봉']) 인걸 보고 알수 있듯이 다른list형태의 클래스인 dict_keys 이지만 일반적인 list와 똑같이 사용할 수 있다.

# valuse()
# dictionary의 value값만 추출
print(a.values())

# items()
# disctionary의 하나의 key와 value를 tuple로 묶어 하나의 객체? 요소로 만들어서 listup함
# 사용하는 이유는 sorting을 하여 반복처리가 가능해진다!
print(a.items())

5. Set#


  • 집합 자료형
  • 사용되는 class명도 set
  • 쉽게 표현하면 주머니를 생각하면 됨
  • key와 value의 개념이 없이 Data인 value만 저장함
  • 순서가 없고 중복해서 저장이 안됨
  • 중복 check가 필요할 때 별도의 logic없이 간편하게 사용이 가능하다.
  • dict와 set의 표현 방식은 같으나, key의 입력 여부에 따라 바뀐다.
a = {1, 2, 3}
print(type(a))

a = [1, 2, 1, 2, 3, 3, 5]
result = set(a)
print(result)

# set의 연산
# 집합연산(합집합, 교집합, 차집합 등)
# 보이는 부분만 정렬되서 나옴 실제로는 정렬안댐

a = set([1, 8, 3, 4])
b = set([3, 4, 5, 6])

# Union 합집합
print(a | b)

# Intersection 교집합
print(a & b)

# Difference 차집합
print(a - b)

6. Bool#


  • 논리값인 True & False
  • Python에서는 대문자 구분을 하기에 반드시 대문자로 입력해야함
  • 연산자는 and, or, not 3가지를 사용함
  • 다음의 경우에는 False로 간주함
    • 빈 Text Sequence( ‘', "” )은 논리값으로 False로 간주
    • 빈 List( [] )는 논리값으로 False로 간주
    • 빈 tuple( () )는 논리값으로 False로 간주
    • 빈 dictionary( {} )는 논리값으로 False로 간주
    • Numeric class의 inteser type인 숫자 0은 False로 간주하고 이외의 다른 숫자는 True로 인식
    • 변수 안에 값이 비어서 나오는 return값인 None도 False로 간주
a = True
b = False
print(a)
print(b)
print(a and b)
print(a or b)
print(not a)
print(not b)