2024. 10. 14. 22:01ㆍpython/을 처음부터
오늘도 좋은 하루!
python을 좀 배워보겠다.
왜냐면... 모르니까...
하지만 아마 기초적인 부분을 따로 기술하진 않을 것 같다.본인은 jump to python의 종이책을 샀다. 그런데 저자가 직접 운영하는 wikidocs에서 본인의 책을 무료로 공개해두었더라.
하하. 아무튼 나는 wikidocs에 기여했다. viva la libre.
python의 특징이라고 한다면?
python의 특징으로 말하자면 역시 무거운 것? 하하. 시덥잖은 농담이다.
python은 {}가 없다는 점? 문법이 간결하다는 것? main이 없다는 것?
생각해보니까 이런거 나열하는 건 별로 의미 없어보인다.
정말 중요한 거 하나는 공백이 {}의 role을 수행하기 때문에 들여쓰기에 대해 제법 신경써야 할 것이다.
내게는 고통스러운 일이다.
python의 자료형
1. 숫자형에 대한 소개와, 타 언어에 존재하는 자료형끼리의 비교
python의 data-type을 좀 구경해볼까 한다.
뭐 자료형이야 int, float 이런건 똑같지.
하나 알아 둘 점은 python은 자료형을 알아서 골라준다는 점이다.
알아서 골라준다는 표현보다는... 적합한 자료형을 선정해준다는 느낌?
가령 42라고 한다면 역시 정수이다. 타 언어들은 int i = 42;라고 할것이다.
python은 말한다. '42는 당연히 정수 아니야? 그냥 i = 42만 써놔.'
int i = 42;
float f = 4.2;
String str = "forty-two"
to
i = 42
f = 4.2
str = "forty-two"
저 뒤에 semi-colon도 안붙인다. 개인적으로는 마음엔 안든다.
우리가 모를 수도 있는 연산자 몇 개만 보고 넘어가자.
제곱도 조금 다르다. 타 언어에선 거의 함수를 사용했던 기억이다. function이든, method든 아무튼.
가령 java는 math library에서 가져온 pow를 사용한다. Math.pow(4, 2);
같은 모양새로.
python은 4 ** 2
제곱 연산을 할 수 있다고 한다. 미 친.
div도 조금 특별한 점이 있는데 '/'와 '//'가 있다. '/'는 몫을 반환하는 연산자였지?
그럼 '//' 👈이놈은 뭔데?
'//' 는 정수 몫만을 반환하는 연산자이다. 하지만 그런게 왜 있는데?
상기했듯, python은 자료형이 동적이다.
동적이라는 말은? dynamic하단 말이다. 사전엔 '역동적인'이라고 기술되어있다만, 여기선 대충 '유동적인'이라고 생각하면 좋다.
타 언어에선 정수끼리 나누면, 소숫점 이하는 버려지고 정수 값만 도출된다.
python은 정수끼리 나눠도 '어? 이거 정수가 아니라 실수로 써야겠는데?'하면서 동적으로, dynamic하게 실수형 자료로써 우리에게 돌려준다.
'//'를 사용해 나눗셈하면 결과값을 정수형으로 돌려준다. 굿.
문자열
여러분도 아시다시피. 정보처리기사에 나오는 python은 거의 문자열을 가지고 뭔가 하는 문제이다. slicing하고 관련 function들 활용하고...
python한테는 String str = "a mulato an albino a mosquito my libido";
라고 명시적으로 선언할 수 없다. type hint라는게 있다고 하는데, 이것조차도 그냥 '이건 이거에용.' 하면서 인간 눈에 보기 좋은거지 실제로 string으로 선언한 건 아니라는 의미이다.
그럼 이놈한테 뭐라고 알려줘야 할까? 네 가지 방법이 있다.
각각 "mulato", 'albino' , """mosquito""", '''libido'''
따옴표들 안에 넣기만 하면 상기한 것과 같이 python이 알아서 '이건 문자열이군' -하면서 처리한다.
"이건 다른 곳에서도 string이고", '이건 char로 사용했는데'.
"""그럼 이건 뭔가요?""", '''왜케 잡스러움?'''.
삼단 따옴표는 여러 줄의 문자열에 사용된다.
str = "a mulato \n an albino \n a mosquito \n my libido"
to
str = """
a mulato
an albino
a mosquito
my libido
"""
/*
이 주석이 떠오르는 사용법이다.
이건 java에만 있었던가?
*/
문자열의 연산
맙소사. 나는 어지럼이 나는 지경이다.
사실 이건 본인이 먹고 있는 약의 부작용이다...
아무튼 이미 c스럽지 않은 것들 때문에 힘든데, 문자열을 연산한다니.
간단한 건 재빨리 치우자.
- 문자열의 +
이것은 문자열 변수를 연결할 때 사용한다.
a = "a mulato "
b = "an albino "
c = "a mosquito "
d = "my libido "
e = "I'm a "
f = "creep "
g = "weirdo "
h = "you're my "
i = "wonderwall "
여긴 직관적이다.
a + b + c +d 👉 a mulato an albino a mosquito my libedo
e + f + e +g 👉 i'm a creep i'm a weirdo
h + g 👉 you're my weirdo
- 문자열의 *
아시다시피 * 연산자는 곱하기 이다.
d * 2 👉 my libido my libido
jump to python 가라사대, cli에서 구분선 짓기에도 좋다고 하셨다.
문자열의 indexing
index 자체는 다른 언어와 다를 점이 없다.
조금 신경써야할 것 하나가 있다면 python에선 음수 index가 있다는 점이다.
str = "sed libera nos a malo"
str[0]이라고 하면 무엇일까? 물론 's'겠지.
str[-1]이라고 하면? 미지의 공간에 존재하는 쓰레기 값이 출력될까?
추측했다시피 'o'가 출력된다. 완전히 under flow같은 꼴이다.
아무튼 뒤로부터 지시하게 된다.
slicing도 index를 사용하니 여기서 해버리자
문자열을 slice. 말 그대로일까?
slicing은 index로 하나하나 꺼내는 것이 아니라 지정한 범위를 사용할 수 있다.
사용법은 sliced = str[ index x : index y ] 이다.
str[ : ]처럼 공란으로 두었을 경우에는 default로 문자열 전체를 할당한다.
그러니까... 공란으로 둔 변은 가장자리로 간주한다는 말이다.
주의 할 점은 시작 index 부터 끝 index의 한 칸 앞까지라는 점이다.
lib = str[4:10] 👉 libera
sin = str[17: ] 👉 malo
guilt = str[-4:] 👉 malo
당연히 이것들을 변수처럼 사용할 수 있다.
lib + sin + guilt 👉 liberamalomalo
formatting
c를 사용해본 사람은 익숙할만한 모양새이다.
printf("%d", &i);
우우우. 몰라도 좋다. 적어도 여기선
괴상한 예제를 써보자.
"I have an iphone %d." %14
~ I have an iphone 14.
문자열의 %d가 무엇인지 눈치챘을 것이다.
삽입할 자료형이다. 지금같은 경우는 정수이다.
만약 문자열을 넣고 싶다면? 아마 예상했을 것이다. %s이다.
참고로 다른 자료형도 문자열 취급으로 삽입 할 수 있다.
"I have an iphone %s." %14 👈 여기서 이 14는 정수 14가 아닌 14라는 글자 그 자체이다.
~ I have an iphone 14.
"I have an %s." %"ipad"
~ I have an ipad.
나쁜 소식이다. malloc과 비슷한 개념이 나올 것이다. 사실 비슷한건 아닌데, 아무튼 뭔가 비슷한 vibe가 있다.
did you get my mood?
$ 기본적으로 할당된 공간의 뒤를 채운다.
"sed libera nos %10s malo" %"a"
~ sed libera nos a malo
$ 여러 방법으로 정렬 위치를 이동시킬 수 있다.
"sed libera nos %-10s malo" %"a"
~ sed libera nos a malo
char* arr = (char*)malloc(10 * sizeof(char));
or
char a[10] = {'a'}
내가 malloc과 비슷하다고 한 저의는, 이 행위가 저 숫자 만큼의 공간을 할당하는 모습이 닮았다는 의미였다.
하지만 정말 역설적이게도 malloc은 동적이지만, 이것은 마치 array를 사용하듯, 정적으로 사용하게 된다.
어차피 문자열은 array고, char의 나열이니깐...
용법을 알았으니 어느 것이 어떤 자료형에 대응하는지 알아보자.
%s for string
%c for char
%d for int
%f for float
%o for octal
%x for hexa
%% for %
{
%%는 다른 것들을, %d로 이미 정수 값을 삽입했다던지 그런 상황에서 %를 %자체로 사용하기 위한 %%이다.
이 상황에서 %는 특수문자를 특수문자로 사용할 때 \ 를 escape로 사용하 것을 생각하면 좋다.
가령 \를 출력하기 위해서도 \\ 로 사용해야한다.
}
이어서 format 함수
용법은 비슷하다고 생각한다. 그런데 data type을 신경 쓸 필요없다. 정말이지 python스럽다.
"sed {0} {1} a malo".format("libera", "nos") "i have an iphone {0}.".format(14) var = "leaning python" "bro is {0} 😭😭😭.".format(var)
%d니 %s니 할 것 없이 잡아넣을 위치에 맞는 순서에 선언하듯 매개변수로 보내면 된다.
당연하겠지만 변수를 사용해도 좋다.
아래에는 명시적으로 사용하는 예 이다. 이 또한 변수를 선언하듯 사용하면 좋다. 명확해서 좋다.
"sed {a} {b} a malo".format(a = "libera", b = "nos") what_iphone_do_you_have = 14 "i have an iphone {c}.".format(c = what_iphone_do_you_have) "bro is {d} 😭😭😭.".format(d = "learning python")
상기 했던 것과 같이, format 함수에도 공간을 할당 하는 것이 있다.
"sed libera nos {0:< ^ >10} malo".format("a")
~ sed libera nos a a a malo" %a
{순서:정렬방향할당크기}
화살표는 게을러서 하나에 다 해놨다...
빈 공간을 채울 수도 있다.
"sed libera nos {0:@<^>10} malo".format("a")
~sed libera nos a@@@@a@@@@a malo" %a
정렬방향 지시자 앞에 무엇을 채워 넣을지 정의하면 된다. a heart that's full up like a landfill...
f-string formatting이란 것도 있다고 한다.
js에도 비슷한 기능이 있다. 아무튼 한 번 써보자.
but = "sed"
deliver = "libera"
us = "nos"
fr0m = "a"
evil = "malo"
#변수 이름을 바로 대입한다.
#문자열 시작 전에 f가 있어야한다.
f"sed libera {us} a malo"
~ sed libera nos a malo
f"{but} {deliver} {us} {fr0m} {evil}"
~ sed libera nos a malo
문자열을 다루는 내장함수
휴. 여기까지만 하고 다른 자료형은 다른데 써야지.
external은 뭐가 있는지 아직 모르겠다.
사용법은 상기 format 함수와 동일하다. java에서 instance를 사용하는 모습과도 유사하다.
string.function(args)
str = "sed libera nos a malo"
를 사용해 함수들을 실행해보겠다.
- count() 👉 해당 문자열에서 인수로 보낸 문자의 갯수를 세어준다.
str.count("s")
라고 한다면 해당 함수는 2를 반환한다.
- find() 👉 해당 문자열에서 인자로 받은 문자와 동일한 값이 발견된 첫 위치를 반환한다. 문자열의 경우에는 첫 index.
str.find("d")
는 2를 반환할 것이다. 0, 1, 2에 있으니깐.
문자열에서 인자와 같은 값을 발견하지 못한다면 -1 을 반환한다.
- index() 👉 이 또한 인자값의 위치를 반환한다.
find()와의 차이점은 인자와 같은 값을 발견하지 못할 시에 오류가 발생한다.
우리가 따로 예외처리를 해줘야한다.
'그럼 왜 써요? 귀찮게.' -라고 한다면; 이것이 시사하는 바를 '이거 무조건 있어야해!!!!!!!!' 정도로 생각하면 좋을 것이다.
- join() 👉 문자열 삽입. 여기서는 삽입되는 요소가 앞에 위치하고 피삽입 당하는 대상 인수값이된다.
str = "sed libera nos a malo"
print('$'.join(str))
~ s$e$d$ $l$i$b$e$r$a$ $n$o$s$ $a$ $m$a$l$o
대충 저런 꼴로 작동된다. join을 보고 생각한건데, db 관련 글도 적어야 할 것 같다.
- lower()와 uppper() 👉 진짜 누가 봐도 소문자로 , 대문자로 라고 외쳐대는 함수명이다.
- lstrip(), strip(), rstrip() 👉 각 좌측, 좌우측 모두, 우측 의 연속된 공백을 지운다.
- replace() 👉 지정된 부분을 정의한 것으로 교체한다.
shell의 tr 명령어와 비슷하다. 하하. 전혀 도움이 되는 예시가 아니다.
용법은 str.replace(old, new)
이다. str에서 old를 new로 대체한다.
(malo, sin)이라고 인수를 입력하면 sed libera nos a sin이 반환될 것이다.
- split() 👉 인수로 보낸 값을 기준으로 삼아 나눈다. 그리고 그 값을 list에 저장한다. default는 공백문자.
shell의 grep과 어느정도 비슷하다. 하하. 전혀 도움이 되는 예시가 아니다.
str = "cortado. 2oz of hot milk with espresso doppio,
or double espresso shots.
or 60ml of espresso. you shouldn't use steamed milk."
str.split() # 은 여기서 공백문자를 기준으로 문장을 쪼개 하나하나 list에 할당할 것이다.
str.split(",") # 은 cortado ... doppio까지 한 뭉치. or double부터 steamed milk까지 한 뭉치.
문자열을 받고, 그것을 분해해서 답을 내야하는 PS에서 아주 편할 것 같다.
dasvidaniya!
이상으로 python의 원시형 자료(?)들과 연산자, jump to python에 있는 string을 다루는 대표적인 내장 함수들을 간단하게 공부해보았다.
다음 글에는 복합 자료형을 공부해볼까 한다. 복합자료형이 진짜 미쳤다. 정말 python스럽다. 엄청 좋아보이긴 한데... 좀 혼란스럽긴하다...
그나저나 대체 왜 tistory는 기본 편집기에 in-line code도 없고, dark mode도 없는건지 모르겠다. 생각해보면 kakao talk도 pc에서 dark mode가 없다. 맙소사.
'python > 을 처음부터' 카테고리의 다른 글
python을 처음부터-2 (0) | 2024.10.15 |
---|