일상코딩/노트

Python : 데이터타입 (시퀀스 : 숫자형타입, 문자열)

코딩애벌레 2024. 1. 16. 22:52

저번시간까지 a b c 에 대해 배웠다면 이젠 조합을 해봐야하지 않겠는가? 다만 A B C와 a b c 는 다르니 그와 비슷한 Data Type에 대해 먼저 공부를 해야 한다. 보통 apple 혹은 EGG 한개의 표현 방식으로 통일하니까 말이다. cAKe라고 쓰는 사람은 본 적 없지 않는가? 코딩에서도 예시를 들자면, 3 - 1 = 2로 가능하지만 Hello - 1 은 불가하다.

 

Data Types

 

: 값의 종류와 그 값에 적용 가능한 연산과 동작을 결정하는 속성

  • 값들을 구분하고, 어떻게 표현할 수 있는지에 대해 정확히 알 수 있다.
  • 데이터 타입에 따라 적합한 도구를 이용해 요리할 수 있다.
  • 명시적으로 지정하여 해당 코드를 확인하는 사람에게 변수의 의도를 더 확실하게 전달하고 오류를 예방한다.

데이터 타입에 대해 알고 있어야 하는 이유는 헷갈리지 않기 위해서다. 내가 가장 약한 부분중 하나이다. 문자열과 숫자는 잘 구분하지만 이외 다른 데이터 타입에 대해 정확하게 알지 못해 여러번 디버깅을 하기도 했다. 물론 돌리다보면 오류를 읽고 간단하게 고칠 수 있는데, 코딩 테스트를 위해서다. 사실 본적 없어서 문자열과 숫자를 구분해주는지도 잘 모른다 ㅎㅎ;

 

Numeric Types 숫자형 타입

정수 int(integer)

가장 많이 쓰는 자료형 중 하나다. 주로 input 값이 횟수 / 정수 N을 넣을때 기본적으로 문자로 인식 하기 때문에 변수에 할당되는 숫자들과 계산하기 위해서라면 문자열 -> 숫자로 바꾸는 과정을 거치게 된다.

 

실수 float(floating point number = 부동 소수점 수)

실수를 표현하는 자료형. 실제로는 실수에 대한 근삿값 이다. 소수점을 표현할 때 사용하는데, 연산 시 주의할 점이 있다. 이전에 인터프리터(번역기)에 대해 설명하면서 컴퓨터는 0과 1을 사용하는 2진수에 대해서만 입출력 한다고 언급한 적이있다. 하지만 사람은 10진법을 사용하고 이때 10진수 0.1을 2진수로 표현하면 무한대로 반복되는 이진법을 만들어 버린다. 그렇다면 컴퓨터는 고작 0.1을 표현하기 위해 무한대로 저장하면 과연 효율적일까??? 이를 막기위해 근삿값만 표시하게 된다. 앞서 얘기한 0.1은 (3602879701896397 / 2 **55) 으로 저장된다. 실제로 VSCode에서 돌려보면 0.1을 출력한다. 

혹시 아직 앞의 나눗셈을 먼저 하는사람은 없겠지!!

 

유튜브에 부동소수점만 검색해도 동영상으로 쉽게 이해할 수 있다. 가장 흥미롭게 본 것은 유튜버 코딩애플님을 검색하면 나오는 동영상 중에 1.1 + 0.1 == 1.2 # False가 있다. 이론적으로는 위의 예시로 봤지만, 이게 현실적으로 우리에게 와닿지 않았다. 하지만 문제가된 사건이 있었는데, 미국이 갖고있는 요격 미사일 Patriot missile 장비에서 요격에 실패하는 일이 벌어졌다. 사고였을까? 아니다. 프로그래밍의 문제였다. 컴퓨터에 저장되는 시간이 한시간에 0.0034초가 오차가 생기게 되었다. 저정도는 허용 범위아닐까 하지만, 컴퓨터를 재부팅하지 않는한 초기화 되지 않으며 장시간 키게된다면 얘기가 다르다. 약 100시간만 켜놔도 0.34초의 오차인데, 매우빠른 속도를 가지고있는 미사일을 요격하는 장비가 0.34초의 오차를 갖는다? 얼마나 치명적인가. 코딩 시작하시는 분들이 꼭 한번 봤으면 하는 동영상 중 하나이다. https://youtube.com/clip/UgkxuOW3UrcJgJC4qgUFqANmo72uba3rTpKK?si=qYUKnTtBQWX1yj_H

이런 증상을 Floating point rounding error 라고 한다.

 

floating point rounding error를 극복하기 위한 방법

 

사실 둘다 배우기만 했지 정확하게 이해하진 못했다. 지금은 해당 방법들로 극복할 수 있다고만 알고 있으려 한다. 일단 a와 b는 우리가 아는 뇌는 0.1로 동일하지만, 바보컴퓨터는 유사하다고 판단하기 때문에 같다고 생각하지 않는다. 그렇다면 일정 차이는 같다라는 것을 이용하면 된다.

 

# 1 을 보면 'a - b 에 절댓값이 1의 -10제곱보다 작다.' 즉 오차가 0.0000000001보다 작다면 True를 출력해 두수의 차이가 그만큼 작다는 것을 보여준다. (참고로 e의 지수표현은 소수점을 나타낼때 유용하니 꼭 알아두도록 하자)

# 2 는 math 모듈을 활용하는 방법인데, math 모듈 말고 은행에서 사용하는 decimal 모듈 등 여러가지 방법이 있다. 

type함수를 이용하면 해당 데이터의 타입을 알수있다

 

Sequence Types 나열 타입

: 여러 개의 값들을 순서대로 나열하여 저장하는 자료형 (list, tuple, range) 다음 시간에 다룰 예정이다

  • 순서(Sequence) : 값들이 순서대로 저장되며 정렬은 되지 않는다. 

순서 == 정렬 ? False. 순서는 해당 데이터들이 나열되어 있고 해당 아이들이 앞부터 순서(넘버링)이 가능한 것으로 보면 된다. 정렬은 엑셀에서 필터를 걸어 정렬을 시킨 것 처럼 1  2  3  4 처럼 정렬되는 것이다. 

 

  • 인덱싱(Indexing) : 각 값에 고유한 인덱스(번호)

인덱스를 이용하여 특정 값을 선택하거나 수정할 수 있다. 인덱스를 보는 것은 잠시 뒤에 다룰 것이다.

 

  • 슬라이싱(Slicing) : 인덱스 범위를 조절하여 부분적인 값을 추출하는 방식

인덱스 번호를 알고 range 범위를 만들어 중간 부분을 잘라내는 것이라고 보면 된다. 주의해야할 점은 index 0부터 3까지 자른다고 하면 순서 3번째의 앞에 잘리게 된다. 즉 3번 index 데이터는 포함되지 않는 것을 유의한다.

 

  • 길이(Length) : 'len()' 함수를 이용해 저장된 데이터의 길이를 구하는 방식

문자열이라면 len()을 이용하여 문자열의 총 문자 개수를 구할 수 있고, list와 같이 데이터이 나열되어있다면 해당 데이터들의 총 개수를 알 수 있다. 벌써 용어의 혼동이 오기시작한다.

 

  • 반복(Iteration) : 반복문을 사용하여 저장된 값을 반복적으로 처리하는 방식

저장되어있는 여러가지 값을 하나씩 꺼내와서 그 값을 이용한 함수 처리를 반복할 수 있는 것이다. 예를들어 [1, 2, 3]을 가진 리스트가 있다면 각 index가 하나씩 나와서 함수()에 대입하면서 처리할 수 있다. 말은 잘하지만 아직 제대로 다룰줄 모른다. 이론깡패

 

Text Sequence Types

: Str (문자열) 

문자들의 '순서'가 있는 '변경 불가능'한 시퀸스 자료형. 위와 동일하게 Sequence Types이지만 중요한 것은 변경이 불가능하다는 것이다. 

앞서 계속 다뤄왔던 문자열은 단일 문자나 여러 문자의 조합으로 이루어진 것이다. 정의가 참 어렵다. 내 뇌속엔 ' ' 혹은 " " 으로 감싸져 있는 글자들을 문자열이라고 생각한다. 코딩을 가장 먼저 시작하면서 찍어 보았던 print('Hello CodingLarva')와 같다. 또한 타입을 출력해보면 다음과 같다.

벌써 해당 메세지를 찍어본지 2주나 지났다. 시간 참 빠른 것 같다.

 

문자열을 출력할 때 주의할 점이 있다. 이는 ' ' 와 " " 의 혼용이다.

중첩 따옴표만 잘 구분해주면 되고, 어려운 경우에는 역슬래시(Escape sequence)

 

Escape sequence
  • 역슬래시(backslash)를 이용해 바로 뒤에 오는 특정 문자가 특수한 기능을 하게 만들 수 있는 조합
  • 파이썬의 일반적인 문법 규칙을 잠시 탈출할 수 있음
  • 아래 말고도 \r (캐리지 리턴 : 처음으로 이동), \o (널 : Null) 도 있긴하나 아직은 본적 없다.

줄바꿈, 탭, \이 표현된 것을 볼 수 있다

String Interpolation

 

: 문자열 내에 변수나 표현식을 삽입하는 방법이다.

 

f-string

문자열에 f 또는 F 접두어를 붙인 후 표현식을 {expression}로 작성하여 문자열에 파이썬 표현의 값을 삽입할 수 있다. 풀어서 쓰니 굉장히 어려워 보이는데, 다음 예시를 보면 이해하기 쉬울 것이다.

뭐야 위랑 아래랑 똑같잖아요~!

 

나도 처음엔 굳이 f-string을 왜 쓰는가 싶었다. 일단 사용하기도 어려웠고 항상 ' ' 의 위치랑 {}을 넣는 방법에 익숙하지 않아서였다. 그래서 사용안하고 있다가 알고리즘 문제에서 원하는 출력 방식을 위해서는 반드시 사용해야만 했다. 다음 예시를 보자

예시를 만들기도 힘들다..

 

프린트하는 내용을 직관적으로 볼 수 있고, 코드를 줄일 수 있기 때문에 나중엔 필수가 되었다. 또한 별 생각 없이 문자열과 변수를 난무할 때 구분만으로 바로 원하는 출력을 할 수 있다는 장점이 있다.

 

문자열의 시퀀스 특징

 

문자열이 갖고있는 특징을 이용해 스퀀스를 재미있게 표현할 수 있다. 먼저 Coding Larva로 갖고 놀아보자.

길이에서 글자 수라고해서 공백을 제외하면 안된다. 알파벳 갯수가 11개라고해서 11이 아닌 띄어쓰기를 포함한 12임에 명심하자
문자열의 각 요소들의 index를 표현한 것이다. 오른쪽에서부터 표현하려면 음수를 사용하면 된다

 

해당 인덱스 위치를 통해 인덱싱, 슬라이싱을 자유롭게 표현할 수 있다.

문자 뒤집기는 알아두면 유용하게 쓰일 수 있을 것 같다

문자열은 불변 (변경 불가)

 

아까 잠깐 언급하고 지나갔지만, sequence중에서 문자열이 따로 나누어져있는 이유는 불변이기 때문이다. 예를들어 리스트의 경우 [1, 2, 3] 에서 2를 꺼내 4로 바꿀 수 있는 반면 Larva라는 문자열에서 r을 l로 바꿀 수 없다는 뜻이다.

문자열을 바꾸려는 경우 TypeError가 뜨게된다. 나에겐 친숙한 에러...

 

문자열 연산

 

특이하게도 불변인 특성을 가지고 있지만 가능한 연산이 있다. 

요긴하게 쓰이는 Hello CodingLarva

 

 

데이터 타입에 속하는 Numeric Types와 Text Sequence Type에 대해 알아봤는데 다음엔 Sequence Type에 속한 list, tuple, range와 Non-sequence Types에 속한 set, dict 등등 다른 데이터 타입을 다루려 한다.

728x90