[파이썬(Python)] 자료형, 문자열

2022. 10. 11. 16:06파이썬

배운 / 이해한 내용 간단히 적어보는 중구난방 정리글

 

파이썬은 c, java 등과 다르게 변수 자료형 선언이 자동으로 이루어진다.

int a = 1; (X)

a = 1 (O)

 

자료형이란 ? 

 : Data Type, 저장하는 메모리 공간의 구조

즉, 데이터 타입을 선언하는 것은 메모리 공간을 확보하는 것  

-> 확보된 공간을 찾기 위한 주소값 필요

-> 주소값을 기억할 대상이 필요: 변수

 

자료형의 종류?

1) 기본 자료형(stack)

   - 정수형 데이터

      Byte(1 Byte) : -128 ~ 127 (1 Byte = 8 bit = 2^7(0~7 = 8개) = 1000 0000(2) = 128)

      Short(2 Byte): -32768 ~ 32767 (2 Byte = 16 bit = 2^15(0~15 = 16개) = 1000 0000 0000 0000(2) = 32768)

      Int(4 Byte): -21억~ 21억

      Long(8 Byte): 생략

      * Char(문자): 기본 2 Byte  ->  ASCII code (7 bit)

  - 실수형 데이터

      Float(4 Byte): 소수부에서 오차 발생 -> 7번째 자리까지 신뢰 (JAVA의 기본 데이터 타입)

      Double(8 Byte): 소수부에서 오차 발생 ->15번째 자리까지 신뢰 (Python3의 기본 데이터 타입)

   - 논리형 데이터

      Bool(1 Byte): False(0) / True(1)

 

사칙연산(+, -, *, /)

 

// : 몫

% : 나머지

** : 제곱

 

 

2) 참조형 데이터 타입

   - 배열(Array): 데이터구조 (Python에서는 배열을 linked list로 구현) 

   - 문자열(String): 문자열 연산하기는 파이썬 고유기능 

      ex) 파이썬에서는 'a' + 'b' = 'ab' 나, a = 'ginger' a*2 = 'gingerginger' 이런게 가능하지만, 다른데서 이러면 에러난다...

이스케이프시퀀스: \(역슬래시, 키보드의 원(달러 말고 원) 문자) *** 한글이 지원되면 \가 원 표시로 뜨고, 영어만 지원되면 역슬래시로 뜨는데... 티스토리에서는 원표시가 안뜬다? 마크다운 때문인가?

ex) \n : 줄바꿈

       \t: 탭

-> 이스케이프로 안쓰고 출력하고 싶으면 두번 쓰면 출력된다 (print("\\") -> 결과: \ ) -> 경로 출력할때 

 

문자열 인덱싱: 0부터 센다

a = "ginger"

a[0] = 'g'      *가독성을 위해 print() 생략함

a[1] = 'i'

len: 문자열 길이 세는 함수

len(a) == 6

a[0:3] = a[0] ~ a[2] = "gin"

앞 숫자는 포함, 뒷 숫자는 그 이전까지를 의미

 

문자열 슬라이싱: 말그대로 문자열 잘라서 원하는 부분만 가져오는거

a = "gingerbon"

a[1:3] = "in"

a[:3] = "gin"

a[6:]  = "bon"

a[:] = "gingerbon"

 

=> 콜론 좌 or 우 값이 생략될 경우 각 끝을 가리킨다

 

그렇다면, 슬라이싱, 인덱싱에 음수가 들어갈 수 있나? => ㅇㅇ

a[-1] = "n"

뫼비우스의 띠처럼

g i n g e r b o n

0 1 2 3 4 5 6 7 8

9 8 7 6 5 4 3 2 1 (- 생략함)

 

왜 a[-0]은 'n'이 아닌데? -> +0이랑 -0이랑 같게 취급하자... 여기는 우극 좌극 그런거 안쓴다 아직

 

그러면, a[100]? -> 안됨

a[-100]은? -> 안됨

 

: 들어가면 슬라이싱, 없으면 인덱싱... 외울 필요는 없고 걍 적어본다

out of range는 안된다!

 

int() 는 인트형으로 변환해주는 함수

ex) a = '2022' , int(a) = 2022 

a + 1 은 당연히 안되지만, int(a) + 1 은 가능

그러면... a = 'gingerbon' , int(a) -> 되겠냐

 

문자열 데이터 타입의 특성: 순서가 있다 -> 인덱싱 가능

++ 'Immutable' : 불변의 -> 변경이 불가능하다

a = 'gingervon' -> 오타를 수정할 수 있나? a[-3] = 'b' ======> 에러

 

그럼 어떻게 수정해?

 

a = a[:-3] + 'b' + a[-2:]

-> 'ginger' + 'b' + 'on' -> gingerbon

 

input(): 사용자로부터 문자열 입력받는 함수

a = input("입력하세요: ")

실행 결과 -> 입력하세요: 

숫자나 문자를 입력하면 문자열로 저장

 

그러면 숫자로 저장하고 싶으면? -> 위에서 배운 int 써 (당연히 float 이런것도 된다)

 

a = int(input("입력하세요: ")) 

 

문자열 포매팅

 

name = input("your name?: ")

print("your name is: %s" %(name))  *** 포맷 코드의 개수와, 뒤에 %(value) value의 개수가 동일해야함

 

%s 가 뭔가요? 문자열 포맷 코드

%d 는 정수, %s 문자열, %c 문자, %f 소수 ...등등 있는데 쓰면서 자연스레 외워질거다

%name -> name을 불러오는

C나 java에서도 유사하게 사용됨(쉼표 여부 정도만 다르고 포맷 코드는 동일)

 

%s 가 재밌는 점은 뭘 넣어도 문자열로 변환된다는 것

 

%%%소수점 표현하기%%%

0.1234567 을 네번째 자리까지만 나타내고 싶으면?

 

print("%.4f" %0.1234567)

-> 0.1234

올림 버림 기준은 ~5는 버림, 6~은 올림

.4f에서 4는 소숫점 자릿수 f는 포매팅 코드(float)를 의미

10.4f 는 전체 길이 10칸(나머지를 공백으로 채움), 소숫점 4자리까지 출력을 의미

-10은 왼쪽정렬

엥 그러면 1.234를 %1f.3 해주면 어떻게 출력되죠? -> 그냥 공백없이 1.234 출력됨

 

이런게 왜 필요함? 그냥 띄어쓰기 쓰면 안됨? -> 숫자나 문자열같은게 기본적으로 왼쪽정렬인지/오른쪽정렬인지 등이 다름(엑셀에 ginger랑 10 쳐보면 정렬 다르게됨)

 

어 그러면 % 출력하고 싶으면 어떡하지?

->  %% 를 쓰면 된다(이스케이프시퀀스랑 비슷) 근데 포매팅 코드가 없을 때는 %도 문자취급됨

 

format 함수

내가 좋아하는 format 함수, {}랑 .format 만 넣으면 돼서 매우 편하다

print("I eat {} gingers.".format(9))

출력결과는 I eat 9 gingers 다.

{}를 {0}으로도 쓰는데, format 함수 내의 0번 인덱스를 의미한다

 

즉,

print("I like {0} and {1}." .format("ginger", "jelly"))

0에는 ginger, 1에는 jelly가 들어간다고 보면 된다

 

이걸 좋아하는 이유는 데이터타입 알아서 맞춰주기 때문... %d %s 쓸 필요가 없으니까

 

그리고 또 

print("I ate {x} and {y}".format(y = "ginger", x = "jelly"))

이런식으로 {} 사이에 아무 말이나 넣고(단, 변수명으로 사용 가능해야함)

순서도 걍 맘대로 해도 됨

 

인덱스를 섞을 수도 있는데 인덱스 먼저 써줘야함

print("{0} {1} {2} {a} {b}".format(3, 4, 5, a = "ginger", b = "jelly"))

그리고 이것도 있다 f"{}" -> format 안써도 돼서 정말 편하다 대신 선언을 미리 해놓아야 함 

name = "gingerbon"
print(f"내이름은 {name}")​

ㅋㅋㅋㅋㅋ 편하긴 한데 공부를 위해서 포매팅 코드를 사용하자

 

그럼 공백을 다른걸로 채울 수 있을까?

print("{0:!^10}".format("hi"))

!!!!!hi!!!!!

 

^ 는 가운데 정렬 < 왼쪽정렬 > 오른쪽정렬

 

*파이썬은 '나 "나 똑같다. "~~~~" 사이에 따옴표를 넣어주고 싶을 때 '를 사용하면 됨 or \" 이런식으로 이스케이프시퀀스를 사용해도 됨

 

 

-마무리-

중요한건 다 외울 필요 없다는거다.

모든 케이스를 다 써보고 다 외울 수는 없다.

예시로 여러가지 들긴 했지만 

실제로 써보면서 익히고 모르면 구글에 쳐보고 익히면 됨

 

 

하지만 외워야 할 것이 있다면...

 

문자열 내장 함수

 

# >>>: 결과 의미

# count: 문자 개수 세기
a = "gingerbon"
a.count('g')

>>> 2

# find: 위치 찾기(인덱스, 없으면 -1)
a = "gingerbon is jelly"
a.find('i')
>>> 1
a.find('z')
>>> -1

# index: 위치 찾기(인덱스, 없으면 에러)

a = "i am gingerbon"
a.index('a')
>>> 2

# join: 문자열 삽입 (얘 중요)
a = "abcd"
"☆".join(a) 	# 문자 하나하나 사이에 ☆ 삽입
>>> "a☆b☆c☆d" 	#a가 바뀌는게 아님 단순 출력만 이렇게 되는거

# upper: 소문자를 대문자로
a = "gingerbon"
a.upper()
>>> "GINGERBON"

# lower: 대문자를 소문자로
a = "GINGERBON"
a.lower()
>>> "gingerbon"

# lstrip, rstrip, strip: 왼쪽공백, 오른쪽공백, 양쪽공백 지우기
a = "  gingerbon  "
a.lstrip()
>>> "gingerbon  "
a.rstrip()
>>> "  gingerbon"
a.strip()
>>> "gingerbon"

# replace: 문자열 바꾸기
a = "gingerbon is not jelly"
a.replace("not", "delicious")	#not을 delicious로 replace
>>> "gingerbon is delicious jelly"

# split: 문자열 나누기 (얘 중요)

a = "gingerbon is just jelly"

a.split() # 공백을 기준으로 문자열을 나눈다
>>>  ['gingerbon', 'is', 'just', 'jelly']
a.split('j') # 'j'를 기준으로 문자열을 나눈다
>>> ['gingerbon is', 'ust', 'elly']

 

근데 억지로 외우라는건 아니고 쓰다보면 외워진다

 

-여담- 

그리고 코드블럭 쓰는 도중에 알아버려서 첫 공부글이 매우 난잡하다...

 

차차 정리된 글을 쓰게 되면 발전하는 것도 보이겠지 뭐...