[파이썬(Python)] 자료형, 문자열
배운 / 이해한 내용 간단히 적어보는 중구난방 정리글
파이썬은 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']
근데 억지로 외우라는건 아니고 쓰다보면 외워진다
-여담-
그리고 코드블럭 쓰는 도중에 알아버려서 첫 공부글이 매우 난잡하다...
차차 정리된 글을 쓰게 되면 발전하는 것도 보이겠지 뭐...