[References]
http://pythonstudy.xyz
자료형(Data Type)
수치 자료형, 문자 자료형, Tuple, List, Dictionary 등 여러 가지 자료형이 존재
1. type()
객체의 Type을 보여준다.
print(type(33))
# <class 'int'>
print(type(3.14))
# <class 'float'>
print(type(['1', '2', '3']))
# <class 'list'>
print(type(314159231415923141592))
# <class 'int'>
2. 정수 (Integer)
소수점을 갖지 않는 정수를 갖는 Data Type
(1) 정수를 10진수가 아닌 2진수, 8진수, 16진수로 인식하게 하고 싶으면 정수 앞에 각각 '0b', '0o', '0x'를 붙이면 된다.
b는 2진수(binary), o는 8진수(octal), x는 16진수(hexadecimal)를 의미한다.
print(0b10, 0o10, 0x10)
# 2 8 16
(2) 10진수를 각각 2진수, 8진수, 16진수의 형태로 변환하려면 bin, oct, hex 함수를 사용하면 된다.
print(bin(202020))
# '0b110001010100100100'
print(oct(20114))
# '0o47222'
print(hex(401000))
# '0x61e68'
이때, 출력되는 결과는 정수가 아니라 문자열이다. 즉, 'hex(40) - 20'과 같은 연산에서 hex(40)이 내보내는 결과는 문자열(String), 20은 정수(Integer)이므로 Type이 맞지 않아 서로 연산을 하지 못한다.
3. 실수 (Float)
소수점을 갖는 Data Type
(1) Float : 컴퓨터에서 실수를 표현하는 방식으로 부동 소수점(Floating Point)의 약자이다.
부동 소수점 : 정수처럼 소수점이 고정되어 있는 것이 아니라 고정되어 있지 않고 움직인다는 뜻
(2) 사칙연산 시 소수 15자리까지 정밀하게 표현할 수 있다.
(3) 지수 표기법
아래 Code에서 E는 지수(Exponent)라는 의미이며, 소문자 e 역시 대문자 E와 같은 의미로 사용된다.
print(0.231922403E8)
# 23192240.3
print(1465434.553E-10)
# 0.0001465434553
(4) 진법 변환에 따른 오차
아래 예제의 결과는 6.6, 0.3으로 나와야 하지만 실제는 이상한 결과값이 나오는 것을 확인할 수 있다. 이는 진법 변환에 따른 오차로, 10진수를 2진수로 변환시킬 때 10진수의 유한 소수가 2진수에선 무한 소수가 되는 경우가 생길 수 있기 때문이다. 이런 오류없이 정밀한 계산을 하기 위해서는 Module을 사용하면 된다.
print(5.4 + 1.2)
# 6.6000000000000005
print(1.4 - 1.1)
# 0.2999999999999998
4. 복소수
(1) Python은 복소수 Type을 지원하는데, 복소수는 a+bj 와 같이 표현된다.
(수학에서 복소수를 표현할 때 i를 사용하지만 Python에서는 j를 사용한다.)
(2) 실수부의 값을 얻기 위해서는 변수명.real을, 허수부의 값을 얻기 위해선 변수명.imag를 사용한다.
(3) conjugate 함수는 복소수의 켤레 복소수를 되돌려준다.
v = 2 + 3j
print(type(v))
# <class 'complex'>
print(v.real)
# 2.0
print(v.imag)
# 3.0
print(v.conjugate())
# (2-3j)
5. Bool Type
True 또는 False 만을 갖는 Data Type
print(3 > 5)
# False
print(4 < 6)
# True
print('a' == 'b')
# False
print(3.14 != 3.14)
# False
print(bool(1))
# True
print(bool(3.14))
# True
print(bool([]))
# False
print(bool('a'))
# True
6. None
아무 Data를 가지고 있지 않다는 것을 표현하며 타 언어의 Null과 같다.
7. Data Type 변환
Literal Data를 특정 Type으로 변경하기 위하여 int(), float(), bool() 등과 같은 함수를 사용할 수 있다.
print(int(3.5))
# 3
print(2e3)
# 2000.0
print(float("1.6"))
# 1.6
print(float("inf"))
# inf (무한대)
print(float("-inf"))
# -inf (-무한대)
print(bool(0))
# False (숫자에서는 0만 False)
print(bool(-1))
# True
print(bool("False"))
# True ("False"는 문자열이므로)
a = None
print(a is None)
# True (a가 None 이므로 True)
8. 문자열 (String)
문자들의 모임, 문자를 나열한 것
(1) 단일 인용부호(')나 이중 인용부호(")로 감싸주어 표현
(2) 연속된 인용부호(단일 인용부호나 이중 인용부호를 세 번 연속으로 쓴 ''' 그리고 """)를 쓰게 되면 간단하게 여러 줄의 문자열을 변수에 대입하거나 출력할 수 있다.
print("""
ABCDEFGHIJKL
0123456789
!@#$%^&*
""")
# ABCDEFGHIJKL
# 0123456789
# !@#$%^&*
(3) 단일 또는 이중 인용부호의 사용으로 여러 줄의 문자열을 표현하고자 한다면 Escape 문자를 사용하면 된다.
(여러 줄의 문자열을 한 라인으로 표현하고자 할 때 사용)
Escape 문자 : 별도의 기능을 제공하는 특수한 문자, 앞에 역슬래시(\)가 있다.
s = '아리랑\n아리랑\n아라리요'
print(s)
# 아리랑
# 아리랑
# 아라리요
print('AAA\nB\tCDE')
# AAA
# B CDE
print("C:\\ABC.txt")
# C:\ABC.txt
이중 인용부호나 단일 인용부호로 묶은 문자열 안에 이중 인용부호 또는 단일 인용부호를 포함하고 싶은 경우에는 앞에 역슬래시(\)를 붙이거나, 이중 인용부호로 묶은 문자열 내에 단일 인용부호를 사용하거나, 단일 인용부호로 묶은 문자열 내에서 이중 인용부호를 사용하면 된다.
print("\"It's all prepared. All I need to is move forward!\"")
# "It's all prepared. All I need to is move forward!"
print('"Try your best rather than be the best."')
# "Try your best rather than be the best."
print("'I determine my future all by myself.'")
# 'I determine my future all by myself.'
print('\'Think different!\'')
# 'Think different!'
(4) 줄의 마지막에 역슬래시(\)를 사용하면 다음 줄과 현재 줄이 하나로 이어진다.
str = "가장 높은 곳에 올라가려면 \
가장 낮은 곳부터 시작하라"
print(str)
# 가장 높은 곳에 올라가려면 가장 낮은 곳부터 시작하라
(5) 문자열 연산 (String Operating)
+ 연산자 : 문자열을 서로 연결
(값이 고정되어 있는 문자열 상수끼리는 + 연산자를 생략할 수 있다.)
* 연산자 : 문자열을 반복
print("012" "3456789")
# '0123456789'
print("ABC" + "DEFGHI")
# 'ABCDEFGHI'
print("Python!" * 3)
# 'Python!Python!Python!'
(6) Indexing
원하는 위치에 있는 문자를 마음대로 꺼낼 수 있다.
변수 뒤에 가져오려는 문자의 위치를 적고, 그 위치를 대괄호로 감싸면 된다.
'변수[위치]'
대괄호 안에 들어가는 위치를 Index라고 하며 1이 아닌 0부터 시작한다.
var = "Python is very powerful"
print(var[4])
# o
print(var[0])
# p
Index에는 음수가 올 수 있다. 음수는 맨 뒤에서부터 읽어서 문자를 가지고 온다.
Indexing을 통해 문자열의 일부를 수정할 수는 없다.
var = "Python is very powerful"
var[0] = 'p'
# Traceback (most recent call last):
# File "<pyshell#45>", line 1, in <module>
# var[0] = 'p'
# TypeError: 'str' object does not support item assignment
(7) Slicing
원하는 위치에 있는 문자열을 통째로 꺼낼 수 있다.
'변수[시작 위치 : 끝 위치]'
문자열 위치 2~5에 있는 문자열을 가지고 오고 싶다면 변수[2:6]이라고 쓴다. 끝 번호에 해당하는 문자는 포함이 되지 않는다.
var = "Python is very powerful"
print(var[2:6])
# 'thon'
print(var[3:7])
# 'hon '
print(var[0:15])
# 'Python is very '
Indexing과 마찬가지로 시작 위치와 끝 위치에 음수가 들어갈 수 있다. 음수는 문자열을 가장 뒤에서부터 읽는다.
var = "Python is best language"
print(var[-13:-5])
# 'best lan'
print(var[-15:-6])
# 's best la'
print(var[-5:-1])
# 'guag'
끝 위치를 생략하면 처음 위치부터 시작하여 가장 끝 위치까지 문자열을 읽어오고, 시작 위치를 생략하면 가장 처음 위치부터 끝 위치까지 문자열을 읽어오며, 둘 다 생략하면 가장 처음부터 가장 끝까지 읽어오라는 의미이므로 문자열 전체를 가져오게 된다.
var = "0123456789"
print(var[2: ])
# '23456789'
print(var[ :5])
# '01234'
print(var[ : ])
# '0123456789'
Step : 일정 간격의 문자열을 가지고 올 수 있다.
'변수[처음 위치 : 끝 위치 : 간격]'
var = "0123456789"
print(var[ : :3])
# '0369'
print(var[ : :-1])
# '9876543210'
print(var[ : :2])
# '02468'
(8) 문자열의 서식 지정 (Formatting)
Tuple을 이용하는 방법
① 서식 문자 %d : 정수형 Data 지정
② 서식 문자 %s : 문자열 Data 지정
③ 서식 문자 %f : 실수형 Data 지정
%.1f : 소수점 이하 한 자리만 출력 (출력할 자릿수나 정밀도를 표현)
print("제 나이는 %d살이며, 몸무게는 %.1fkg이고, 취미는 %s입니다. " % (19, 62.5, '프로그래밍'))
# 제 나이는 19살이며, 몸무게는 62.5kg이고, 취미는 프로그래밍입니다.
format 함수를 이용하는 방법
',d'와 같이 앞에 쉼표를 붙여주면 천 단위마다 쉼표를 추가할 수 있다.
weight = 62.53
print("몸무게 : ", format(weight, '.1f'))
# 몸무게 : 62.5
print("돈 : ", format(1000000, ',d'))
# 돈 : 1,000,000
format Method를 이용하는 방법
중괄호로 둘러싸인 곳에 Data가 위치하며 순서대로 중괄호 쪽에 Data가 삽입
print('{} {}'.format('홍길동', 34))
# '홍길동 34
print('{0} {1} {2}'.format(12, 34, 56))
# '12 34 56'
print('{2} {2} {1} {0}'.format(12, 34, 56))
# '56 56 34 12'
위 예제를 보면 중괄호 내에 '{0} {1} {2}'와 같이 숫자가 들어간 것을 확인할 수 있다.
{0}은 format Method의 첫 번째 인수가 들어가고, {1}은 두 번째 인수가 들어가게 된다.
순서를 변경할 수 있으며, '{2} {2}'와 같이 여러 번 등장할 수도 있다.
Tuple이나 Format 함수와 같이 Format Method를 통한 방법도 자릿수나 정밀도 등을 지정해 줄 수 있다.
print('{} / {} = {:.2f}'.format(5, 2, 5/2))
# '5 / 2 = 2.50'
print('{0} / {1} = {2:.4f}'.format(13, 3, 13/3))
# '13 / 3 = 4.3333'
List가 인수로 전달될 때, Indexing을 통해서 접근할 수 있다. 즉, 아래의 예제에서 {0[4]}에는 lst[4]의 값이 들어가게 된다. {0}이라고 썼을 경우에는 List가 인수로써 그대로 전달되지만 {0[4]}와 같이 작성했을 경우에는 Indexing으로 전달받은 List의 요소를 꺼내올 수 있다.
lst = [30, 40, 50, 60, 70, 80]
print('lst[4] = {0[4]}'.format(lst))
# 'lst[4] = 70'
print('lst[4] = {0}'.format(lst))
# 'lst[4] = [30, 40, 50, 60, 70, 80]'
print('lst[4] = {0[1]}'.format(lst))
# 'lst[4] = 40'
다음 예제처럼 이름을 통하여 값을 가져올 수도 있다.
print('제 나이는 {age}살이고, 몸무게는 {weight}kg 입니다.'.format(age=19, weight=72.5))
# '제 나이는 19살이고, 몸무게는 72.5kg 입니다.'
다음 예제의 첫 번째 Code를 해석하면 최소 6칸의 자리를 확보하고 나서 문자열인 cat을 출력하라는 뜻이다. 만약 다음 예제에서 'cat'이 아니라 'python'처럼 길이가 6 이상인 문자열을 넘기면 공백없이 출력이 된다. 두 번째 코드도 마찬가지로 최소 5칸의 자리를 확보하고 나서 정수 334를 출력하라는 뜻이다.
print('{0:6s}'.format('cat'))
# 'cat '
print('{0:5d}'.format(334))
# ' 334'
개발자가 임의로 출력 방향을 왼쪽이나 오른쪽으로 지정할 수도 있다. 확보된 공간 내에서 <를 통해 왼쪽 정렬을, >를 통해 오른쪽 정렬을 할 수 있다. 빈 공간을 0으로 채우고 나서 출력할 수도 있다.
print('{0:<6d}'.format(1234))
# '1234 '
print('{0:>6d}'.format(1234))
# ' 1234'
print('{0:07d}'.format(1234))
# '0001234'
8진수나 16진수를 표현할 수도 있다. 8진수라면 #o를 통해 앞에 0o를, 16진수라면 #x를 통해서 앞에 0x를 붙일 수 있다. 소문자 x가 아닌 대문자 X를 사용하면 0X를 앞에 붙일 수도 있다.
print('{0:#o} {0:#x}'.format(123))
# '0o173 0x7b'
f-string을 이용하는 방법 (Python 3.6 버전 이상부터 이용 가능)
중괄호 안에 변수를 집어 넣어 표현
name = 'Joon'
age = 40
print(f'{name}의 나이는 {age} 입니다. ')
# Joon의 나이는 40 입니다.