모든 프로그래밍 언어를 배울 때 가장 기초적인 것이 바로 자료형에 대한 이해다.
언어마다 제공하는 자료형이 조금씩은 다르기 때문에 그것을 잘 익히는 것이 굉장히 중요하다.
그렇다면, 파이썬에는 어떤 자료형들이 있는지 알아보자!
자료형을 배우기 전에 우선 자료형을 저장하는 '변수'를 먼저 알아야 한다.
Variable이란 한글로 '변수'라고 불리며, 데이터를 저장/관리하고 데이터 대신하여 사용할 수 있는 것이다.
수학시간에 주구장창 배웠던 x,y라고 생각하면 된다.
수학에서의 변수와는 구분되는 파이썬 변수의 특징은 다음과 같다.
변수는 실제 물리적인 메모리 주소공간을 가르키는 일종의 닉네임이다.
: 컴퓨터에서 임시 저장공간으로 쓰이는 메모리를 활용하는 것이 변수의 특징이다.
즉, 컴퓨터 끄면 변수는 날라간다. 명심하자!^^
변수에 데이터를 저장할 때 '='이라는 Assignment operater(할당 연산자)를 사용한다. 우리가 아는 등식의 개념보다는 '<-'에 더 가깝다.
a = 10 # a라는 변수에 10이라는 숫자를 할당한다.
javascript에서는 자료형을 구분하지 않고 대충 써도 된다.
var a = 5
이렇게 쓰고 var에 아무 자료형이나 가져다 붙인다.
이래서 js가 쉽다고 생각(사실은 착각)하게 되는 것 같다.
숫자형 데이터란, 정수/실수/복소수/2진수/8진수/16진수를 포함하며 가장 많이 사용하는 데이터 타입중에 하나다. 0,1 밖에 알아듣지 못하는 바보같은(?) 컴퓨터가 가장 쉽게 이해하는 데이터다.
파이썬은 숫자의 표현 범위가 무한대에 가깝다.
물론 무한대는 그 끝을 알 수 없기 때문에 진짜 무한대는 아니지겠만 말이다.
숫자 데이터는 우리가 알고 있는 대부분의 연산을 그대로 지원한다. 사칙연산, 나머지 구하기, 몫 구하기, 거듭제곱 등 거의 전부 다 지원한다고 보면 된다.
혼자 만들고 혼자 아는 이상한 새로운 연산법이 있다면 아쉽지만 파이썬은 모를 것이다.
Integer는 정수형 자료로 우리가 잘 알고 있는 0,1,2,3과 같은 숫자가 바로 정수형이다. 흔히 int로 쓰며 자료형의 비트 사이즈를 조정할 수도 있다. 이건 나중에 필요하게 될 일이 가~끔 있다.
파이썬에서 정수형 표현법은 다음과 같다.
a = 132
b = 1.32E2 # 1.32 * 10^2 = 132
같은 132를 쓰더라도 2가지 표현법이 있으니 잘 알아두면 좋다.
Floating point(부동소수점)는 영어만 봤을 때 처음 뭐지? 싶었던 자료형이다.
놀랍게도 다름 아닌 실수형 자료다.
실수를 표현할 때 1.3232 * 10^-3 과 같이 소수점의 위치를 고정시켜 놓는다는 의미다.
파이썬에서 실수형 표현법은 다음과 같다.
a = 132.3
b = 1.323E2 # 1.323 * 10^2 = 132.3
사칙연산은 두 숫자형 자료간의 연산으로 다음과 같이 표현할 수 있다.
a = 7 ; b = 14
a + b # 더하기, 21
a - b # 빼기, -7
a * b # 곱하기, 98
a / b # 나누기, 0.5
문자열 데이터란, 문자(character)의 나열을 의미한다.(e.g. "Hello world!")
string == Character Sequence(or List)
파이썬에 다룰 수 있는 문자열의 크기도 제한이 없다.
파이썬에선 '와 " 두 가지의 기호를 통해 문자열을 나타낸다. 즉 ' 부터 ' 까지 또는 " 부터 " 까지 하나의 문자열이다.(e.g. 'Hello', "World")
컴퓨터는 문자(character)를 encoding하여 숫자로 표현한다. 알려진 예로 ASCII, utf-8, cp949가 있다.
컴퓨터는 문자를 숫자로 인식한다.(e.g. ASCII 코드로 변환하면 A->65, a->97)
현재 전세계적으로 웹에서 사용되는 국제 표준은 UTF-8이다.
문자열을 만드는 방법은 여러가지가 있다.
s1 = 'hi'
s2 = "Hi"
s3 = """H
i""" # 여러 줄의 문자열을 받고 싶을 때 쓴다.
문자열도 더하기, 곱셈 연산이 가능하다.
s1 = "Hello"
s2 = "World"
print(s1 + s2) # "HelloWorld"
print(s1 * 3) # "HelloHelloHello"
아쉽게도 곱셈은 문자열과 정수형의 곱의 형태만 가능하다.
문자열에서의 더하기는 Concatenation(이어붙이기)라고 이해하면 더 좋다.
곱셈은 Concat을 곱셈번만큼 하는 것이다.
문자열을 특정 포멧을 지정하고 싶은 경우 사용하는 것이 문자열 포맷팅이다.
파이썬에서는 3가지 형태를 지원한다.
fruit = "사과"; count = 4
위 변수를 이용하여
"사과이(가) 4개 있다." 라는 문장을 만들어보자.
1. print formatting
print("%s이(가) %d개 있다." % (fruit, count))
2. str.format
sentence = "{}이(가) {}개 있다.".format(fruit, count)
print(sentence)
3. f-string
sentence = f"{fruit}이(가) {count}개 있다."
print(sentence)
위 3가지 모두 같은 결과값을 출력한다.
포맷팅은 실무에서도 정말 많이 쓰이므로 꼭 기억하자!
List는 가장 많이 사용되는 연속형 데이터 타입이자, 굉장히 유연한 구조를 가지고 있어 대부분의 데이터를 편하게 다룰 수 있다.
파이썬에서 '[' 와 ']'를 이용하여 표현한다. e.g. [1, 2, 3]
리스트의 원소는 쉼표로 구분되며, 리스트의 원소는 아무 데이터 타입이나 가능하다. 리스트조차 가능하다.
리스트를 이용하면 파이썬에서 다루는 대부분의 데이터는 아무 무리없이 다룰 수 있다. 하지만 수정이 자유롭기 때문에 수정을 하면 안되는 경우에는 사용하면 안된다.
python의 주요 기능 : negative indexing
뒤에서 부터 찾는 기능도 제공
positive 예시 : L[3] -> 4번째 원소 찾기
negative 예시 : L[-2] -> 뒤에서 2번째 원소 찾기
모든 프로그래밍 언어는 indexing을 0부터 시작한다.
즉, L[0]이 1번째 원소를 찾는다는 뜻이다.
인덱싱할때 주의할 점은 리스트의 원소의 개수와 같거나 큰 수를 넣으면 IndexError 를 띄우며 작동하지 않는다는 점이다!
negative indexing의 원리
n개의 원소를 가진 list에서 뒤에서 k번째 원소를 찾는다고 하면, 앞에서는 n+1-k번째에 있을 것이다.
따라서, 일반적인 indexing으로는
L[n-k]
을 입력하면 된다.
이때, len(L)이 n이므로
L[n-k] == L[len(L)-k]
가 된다.
따라서, 파이썬에서는 음수 인덱싱이 들어올 때
L[-k] => L[len(L)-k] == L[n-k]
로 인식하게 하여 결국
L[-k] == L[n-k]
가 된다.
이것이 음수인덱싱의 원리다.
슬라이싱은 말그대로 리스트의 특정부분을 잘라내는 기능이다.
파이썬 기본 리스트에서는 인덱스 기준 슬라이싱만 제공한다.
1번째부터 3번째 원소까지 뽑아내고 싶으면,
L[0:3]
#또는
L[:3]
을 치면 된다. 파이썬은 독특한 것이 슬라이싱할때 뒤에 인덱스는 포함되지 않는다는 점이다.
5번째부터 끝까지 슬라이싱하려면,
L[4:len(L)]
#또는
L[4:]
을 치면 된다. 뒤에 인덱스를 포함하지 않는 이유는 아마 공백을 활용할 수 있게끔 하려는 파이썬의 배려(?)지 않을까 싶다.
간격을 조정하고 싶으면, L[start:end:step] 을 활용하면 된다.
즉 1~5번째 원소를 2칸씩 띄워서 슬라이싱하고 싶으면,
L[:5:2]
을 치면 된다.
여기서 독특한 표현법은 step에 음수를 넣으면 뒤에서부터 불러온다는 것이다.
L = [1,2,3,4,5,6,7,8,9,10]
print(L[::-1])
의 결과는 [10,9,8,7,6,5,4,3,2,1] 이 된다.
L = [1,2,3]
L2 = [4,5]
L + L2 # [1,2,3,4,5]
L2 + L # [4,5,1,2,3]
리스트 더하기는 concatenation으로 단순히 이어붙이기로 이해하면 된다.
L = [1,2,3]
L * 3 # [1,2,3,1,2,3,1,2,3]
이런 식으로 리스트와 정수의 곱셈만 가능하다.
L = [1,2,3]
L[1] = 10
L # [1,10,3]
리스트의 특정 인덱스에 위치한 원소값을 변경하고 싶을 때 쓰는 방법이다.
수정하면 항상 Overwrite된다는 점을 명심하자!
리스트 관련 함수들은 리턴값을 주는 것이 아닌 리스트 자체에 overwrite하는 방식이므로 출력은 따로 해야한다는 점을 명심하자.
L = [1,2,3]
L.append(4)
L #[1,2,3,4]
L = [4,3,16]
L.sort()
L #[3,4,16]
reverse=True 옵션으로 내림차순 정렬을 할 수도 있다.
L.sort(reverse=True)
L #[16,4,3]
L = [2,6,4,3]
L.reverse()
L #[3,4,6,2]
L = [1,2,3]
L.pop()
L #[1,2]
tuple은 list와 거의 같다.
다만, 다른 점은 딱 2가지다.
Mutable : 생성된 이후에 변경(assignment)이 자유롭게 가능한 data type.
e.g. List, dict, set
immutable : 생성된 이후에 변경이 불가능한 data type
e.g. int, float, string, tuple, frozenset
t = (1,3,4)
t[2] = 6
을 치면 에러가 뜬다. 튜플은 immutable 자료형이기 때문이다.
e.g. {1, 2, 3} : 집합, {'a':1, 'b':2} : 사전
1) 집합은 원소의 중복을 허용하지 않는다. 즉, 원소의 종류를 나타내기 좋다.
s = {1,1,2,2,3}
s #{1,2,3}
이렇게 중복되는 원소는 1개로 통일된다.
2) 집합은 원소의 순서가 존재하지 않는다. 즉, 원소의 index가 없다.
s[1]
을 치면 TypeError가 발생한다. 이유는 집합에서 인덱싱은 불가하기 때문이다.
s1 = {1, 2, 3, 4, 5}
s2 = {3, 4, 5, 6, 7}
s1 & s2
#또는
s1.intersection(s2)
s2.intersection(s1)
s1 | s2
#또는
s1.union(s2)
s2.union(s1)
s1 - s2
s = set()
s.add(1)
s #{1}
s = {1,2,3}
s.update({4,5})
s #{1,2,3,4,5}
s = {1,2,3}
s.remove(3)
s #{1,2}
tensorflow.blog, pytorch.kr, 각종 오픈톡방을 활용하자!