[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가지를 주로 많이 사용함
이런 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
를 사용한다고 한다.
숫자형을 활용하기 위한 연산자#
- 사칙연산
- 기본적인 사칙연산(
+, -, *, /
)은 계산기처럼 바로 작성해서 사용하면 된다.
- 기본적인 사칙연산(
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
를 사용한다. -
다른 언어(
java
나c++
등) 문자(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)