[Week1] (파이썬 프로그래밍) 01. Data Type

jjooki-entist·2022년 8월 24일
0

모든 프로그래밍 언어를 배울 때 가장 기초적인 것이 바로 자료형에 대한 이해다.
언어마다 제공하는 자료형이 조금씩은 다르기 때문에 그것을 잘 익히는 것이 굉장히 중요하다.

그렇다면, 파이썬에는 어떤 자료형들이 있는지 알아보자!

Variable

자료형을 배우기 전에 우선 자료형을 저장하는 '변수'를 먼저 알아야 한다.
Variable이란 한글로 '변수'라고 불리며, 데이터를 저장/관리하고 데이터 대신하여 사용할 수 있는 것이다.

수학시간에 주구장창 배웠던 x,y라고 생각하면 된다.

수학에서의 변수와는 구분되는 파이썬 변수의 특징은 다음과 같다.

  • 변수는 실제 물리적인 메모리 주소공간을 가르키는 일종의 닉네임이다.
    : 컴퓨터에서 임시 저장공간으로 쓰이는 메모리를 활용하는 것이 변수의 특징이다.
    즉, 컴퓨터 끄면 변수는 날라간다. 명심하자!^^

  • 변수에 데이터를 저장할 때 '='이라는 Assignment operater(할당 연산자)를 사용한다. 우리가 아는 등식의 개념보다는 '<-'에 더 가깝다.

    • 오늘의 리빙포인트) 실제 R에서 할당연산자로 '<-'도 쓸 수 있다.
    a = 10 # a라는 변수에 10이라는 숫자를 할당한다.

javascript에서는 자료형을 구분하지 않고 대충 써도 된다.

var a = 5

이렇게 쓰고 var에 아무 자료형이나 가져다 붙인다.
이래서 js가 쉽다고 생각(사실은 착각)하게 되는 것 같다.

숫자형 데이터

숫자형 데이터란, 정수/실수/복소수/2진수/8진수/16진수를 포함하며 가장 많이 사용하는 데이터 타입중에 하나다. 0,1 밖에 알아듣지 못하는 바보같은(?) 컴퓨터가 가장 쉽게 이해하는 데이터다.
파이썬은 숫자의 표현 범위가 무한대에 가깝다.
물론 무한대는 그 끝을 알 수 없기 때문에 진짜 무한대는 아니지겠만 말이다.

숫자 데이터는 우리가 알고 있는 대부분의 연산을 그대로 지원한다. 사칙연산, 나머지 구하기, 몫 구하기, 거듭제곱 등 거의 전부 다 지원한다고 보면 된다.
혼자 만들고 혼자 아는 이상한 새로운 연산법이 있다면 아쉽지만 파이썬은 모를 것이다.

Integer

Integer는 정수형 자료로 우리가 잘 알고 있는 0,1,2,3과 같은 숫자가 바로 정수형이다. 흔히 int로 쓰며 자료형의 비트 사이즈를 조정할 수도 있다. 이건 나중에 필요하게 될 일이 가~끔 있다.

파이썬에서 정수형 표현법은 다음과 같다.

a = 132
b = 1.32E2 # 1.32 * 10^2 = 132

같은 132를 쓰더라도 2가지 표현법이 있으니 잘 알아두면 좋다.

Floating point

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

String

문자열 데이터란, 문자(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이다.

    • (오늘의 리빙포인트) UTF-8에선 a는 1바이트로, '가'는 3바이트로 인식한다. 이를 가변 인코딩 방식이라고 하며, 영어보다 한글이 더 많은 데이터를 필요로 한다.

문자열을 만드는 방법은 여러가지가 있다.

s1 = 'hi'
s2 = "Hi"
s3 = """H
i"""  # 여러 줄의 문자열을 받고 싶을 때 쓴다.

문자열도 더하기, 곱셈 연산이 가능하다.

s1 = "Hello"
s2 = "World"
print(s1 + s2)  # "HelloWorld"
print(s1 * 3)   # "HelloHelloHello"

아쉽게도 곱셈은 문자열과 정수형의 곱의 형태만 가능하다.
문자열에서의 더하기는 Concatenation(이어붙이기)라고 이해하면 더 좋다.
곱셈은 Concat을 곱셈번만큼 하는 것이다.

String Formatting

문자열을 특정 포멧을 지정하고 싶은 경우 사용하는 것이 문자열 포맷팅이다.
파이썬에서는 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

List는 가장 많이 사용되는 연속형 데이터 타입이자, 굉장히 유연한 구조를 가지고 있어 대부분의 데이터를 편하게 다룰 수 있다.

  • 파이썬에서 '[' 와 ']'를 이용하여 표현한다. e.g. [1, 2, 3]

  • 리스트의 원소는 쉼표로 구분되며, 리스트의 원소는 아무 데이터 타입이나 가능하다. 리스트조차 가능하다.

  • 리스트를 이용하면 파이썬에서 다루는 대부분의 데이터는 아무 무리없이 다룰 수 있다. 하지만 수정이 자유롭기 때문에 수정을 하면 안되는 경우에는 사용하면 안된다.

인덱싱(indexing)

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]

가 된다.

이것이 음수인덱싱의 원리다.

슬라이싱(Slicing)

슬라이싱은 말그대로 리스트의 특정부분을 잘라내는 기능이다.
파이썬 기본 리스트에서는 인덱스 기준 슬라이싱만 제공한다.
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하는 방식이므로 출력은 따로 해야한다는 점을 명심하자.

  • append()
    리스트의 맨 뒤에 원소를 추가하는 Last In 방식의 함수다.
L = [1,2,3]
L.append(4)
L  #[1,2,3,4]
  • sort()
    리스트의 원소들을 오름차순으로 정렬하는 함수다.
L = [4,3,16]
L.sort()
L  #[3,4,16]

reverse=True 옵션으로 내림차순 정렬을 할 수도 있다.

L.sort(reverse=True)
L #[16,4,3]
  • reverse()
    리스트를 역순으로 재정렬하는 함수다.
L = [2,6,4,3]
L.reverse()
L  #[3,4,6,2]
  • pop()
    리스트의 맨 뒤에 원소를 제거하는 Last Out 방식의 함수다.
L = [1,2,3]
L.pop()
L  #[1,2]

Tuple

tuple은 list와 거의 같다.
다만, 다른 점은 딱 2가지다.

  1. 리스트는 []를 사용하고, 튜플은 ()를 사용한다.
  2. 리스트는 생성 후에 변경이 가능하고(mutable) 튜플은 생성 후에 변경이 불가능하다.(immutable)**

Mutable : 생성된 이후에 변경(assignment)이 자유롭게 가능한 data type.
e.g. List, dict, set

immutable : 생성된 이후에 변경이 불가능한 data type
e.g. int, float, string, tuple, frozenset

  1. 성능적인 이슈 -> 변경되지는 않는 그 자체로 장점이 생김.
  2. 프로그래밍적인 이슈 -> 데이터 수정 자체를 하지 않는 경우 실수를 방지할 수 있다.
t = (1,3,4)
t[2] = 6

을 치면 에러가 뜬다. 튜플은 immutable 자료형이기 때문이다.

Set

  • 집합 자료형은 정말 말그대로 수학에서 배우는 집합 그 자체이다.
  • 수학에서는 집합을 {}로 표시했지만, 파이썬에서는 안타까운 이유로 {}를 사용하긴 하는데 그냥 사용할 수는 없다. 왜냐면 사전(Dictionary) 자료형도 {}를 사용하기 때문이다. 이에 대해서는 뒤에 자세히 배운다.
  • 공집합을 생성할 때는 반드시 set()으로 생성해야 한다. {}로 생성하면 빈 사전이 생성된다.

    e.g. {1, 2, 3} : 집합, {'a':1, 'b':2} : 사전

  • 집합의 연산자인 교집합, 합집합, 차집합을 모두 지원한다.
  • 집합의 특징이 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)
  • 합집합
    합집합은 두 집합의 모든 원소를 원소로 가지는 집합을 뜻한다. 즉, 중복되는 원소는 1개로 처리된다.
s1 | s2

#또는

s1.union(s2)
s2.union(s1)
  • 차집합
    차집합은 특정 집합에서 다른 집합과의 공통원소를 뺀 집합이다.
s1 - s2

집합관련 함수

  • add()
    원소를 하나씩 추가할 때 쓰는 함수다.
s = set()
s.add(1)
s  #{1}
  • update()
    원소를 여러개 추가할 때 쓰는 함수다.
s = {1,2,3}
s.update({4,5})
s  #{1,2,3,4,5}
  • remove()
    원소를 하나씩 제거할 때 쓰는 함수다.
s = {1,2,3}
s.remove(3)
s  #{1,2}

AI 최신트렌드 Follow-up

tensorflow.blog, pytorch.kr, 각종 오픈톡방을 활용하자!

profile
데이터 사이언티스트를 꿈꾸는 3년차 제품총괄입니다.

0개의 댓글