어제의 컨디션을 회복하고 오늘은 새로운 느낌으로 파이썬 심화를 복습해봅시다!
vscode는 무료 소프트웨어이며 개발에 기본적인 프로그램이다.
venv 가상환경 설정
먼저 venv 파일을 생성해 주어야 하는데
-m venv venv(마지막은 아무렇게 해 주어도 되는데 웬만하면 venv)
파이썬에서 가상환경을 구성해 줄 때 문제가 되었던 점이 강의에서는
venv\Scirpts\activate를 터미널에 입력을 하라고 했지만
내가 사용하는 환경에는 source venv/Scripts/activate라고 입력해 주어야 가상환경이 실행이 되었습니다.
이제 필요한 도구들을 받아올 때에는 pip install (도구명)을 입력해 주면 실행이 됩니다!
코드 컨밴션!
이거는 저번에 문법에 맞추는 원고지를 생각해 주자
내가 마음대로 적어도 되지만 사람들이 공동적으로 적는 방법에 맞추어 적으면 알아보기 쉽기 때문이다.
파이썬에서는 pep8이 대표적인 방식이며
그리고 네이밍 컨밴션! 이름에서도 적는 방식이 다 있는 법
pascal, snake, camel표기 법 다기억을 하고 있는가!
pascal은 클래스에서!
snake는 변수 함수에서!
상수는 전부 대문자로!
PIE=3.14 같이 변하지 않을 값들은 전부 대문자로 표기하자
지역번수와 전역변수 위치에 따라서 적용이 가능한 변수를 잘 알아두어야 합니다.
문자열 합치고 나누기
먼저 나누기는 split을 이용
/을 기준으로 나눈다고 하면
변수.split("/")
이렇게 입력을 해주면 나뉜 값들은 리스트로 만들어진다.
합치기는 join을 이용
스플릿과는 반대로 붙여주는데 붙일 때 사이에 들어갈 내용(풀 같은 느낌으로?)을 적어주어야 한다.
형식도 스플릿과 반대로 하며! 를 사이에 두고 붙여준다는 가정에
"!". join(리스트형식 변수)
즉 일반 문자를 리스트로 리스트를 문자열로 만드는 것이라고 생각을 하면 된다!
문자내용 바꾸기
이거는 replace를 이용하면 되는데 어떻게 쓰는지 까먹을 까봐 다시 적어보면?
문자변수. replace("바꿀문자", "바뀔 문자")
이렇게 입력을 해준다.
날짜를 문자로 문자를 날짜로
datetime.strptime(바꿀 문자열, "% y/%m% d % H:%M")
strptime으로 문자를 날짜데이터 형식으로 변환할 수 있다
반대로 날짜를 문자데이터 형식으로 변화시킬 때에는
datetime.strftime(바꿀 날짜데이터, "% y/%m% d % H:%M")
둘 다 생긴 거는 비슷하게 생겼지만 str다음으로 오는 p 냐 f를 잘 보고 확인을 해야 합니다.
timedelta는 날짜 데이터를 더하거나 뺄 때 사용하는 방법이며
datetime.now() + timedelta(days=3)
현재시간 + 날짜형식 3일 계산해 주게 된다
일반적으로 그냥 3을 더하면 안 되나 하겠지만 데이터형식은 데이터 형식으로 맞추어서
계산을 해주어야 하기 때문에 timedelta를 이용하여 날짜데이터화 시켜 계산할 수 있다.
조건문
"값" in (리스트형 데이터)
이면 특정값이 리스트안에 존재를 하면 값이 Ture로 나오고 없으면 False로 출력이 된다는 것을 알아두자
나중에 if나 반복문에 햇갈릴 수 있으므로 잘 기억을 해두어야 한다.
and 와 or도 기존에 알고있는 것이지만 햇갈리지 않도록 하자.
이렇게 많아지면 햇깔리기 시작한단 말이다..
if not이면 조건이 반대가 된다 거짓일때 실행해라로 생각하자.
비어있는 글자와 비어있는 리스트는 False에 해당한다는 것도 잊지말자.
이 조건문을 만들때 유요한 것이 bool()이다.
if에서 조건문을 잔뜩만들었는데 실행이 안될때에는 그 조건문을 bool(조건)을 넣어서 어떤 결과가 나오는지
확인을 해보면 좋을 것 같다.
all과 any도 사용 방법을 자주봐서 익숙해지도록 하자.
*args와 **kwargs
이친구들은 패킹과 언패킹의 사용이 되는 애들이다.
우리가 함수를 호출할 때 끝없이 많은 자료들을 받을 때 인자들을 일일히 설정하기 귀찮으니
한번에 받아오겠다는 설정을 하는 것이다.
*args는 여러가지의 데이터들을 튜플(tuple)의 형식으로 만들어서 함수안에서 사용을 하는 것으로 생각을
해야하며 우리가 리스트형식의 데이터를 넣어줄때 그냥 리스트 채로 넣으면
예시로
list = [1,2,3,4]
print(sum(list,1,2,3)으로 넣게 되면 생각으로는 리스트는 알아서 풀어져서
(1,2,3,4,1,2,3)으로 만들어 질 것 같지만
([1,2,3,4],1,2,3)이렇게 한 칸에 그냥 리스트가 들어가 버리기 때문에 내가 생각하던 방향과 다르게 갈 수 있다.
그렇기에 리스트를 풀어서 넣어야 하는데 방법으로 *list를 입력을 해준다면
(1,2,3,4,1,2,3) 으로 알맞게 들어가게 된다.
자! 이제 리스트가 끝이 났으니 딕셔너리로 가보자
딕셔너리는 **kwargs라고 하는데 args옆에 keyword가 붙었다고 생각하면 외우기가 쉬워진다.
앞에 설명했던 리스트의 내용과 비슷하게 딕셔너리도 작용을 한다.
**kwargs는 딕셔너리의 형태로 저장을 하기 때문에 key : value의 형식을 입력해주어야 하는데
list의 경우에는 함수호출시 *붙이지 않으면 리스트 째로 입력이 되어도 실행이 되긴 했지만
딕셔너리의 경우에는 형식이 다르다며 오류가 발생하게 되므로 **를 잘 붙여 주도록 하자.
아무튼 패킹과 언패킹은 리스트와 딕셔너리의 무한한 인자를 받아들이는 용도로 사용을 하고
함수내에서 내가 원하는 방식을 마음대로 만들면 된다.
※ 추가로 만들면서 배운것
여기서 profile이라는 빈 딕셔너리를 만들어주고
그 딕셔너리에 새로운 key의 값을 만들어주는데 이름을 name이라고 하고
value의 값을 kwargs의 있는 딕셔너리의 값들을 넣어주어야 하는데
get()을 이용하면 name에 해당하는 value의 값을 넣어주라 만약에 값이 없다면 "-"을 대신 입력해라고 해줄 수 있다.
전 딕셔너리의 값이 name이였다고 바꿀 key 값을 꼭 name으로 맞출 필요는 없다.
이렇게 값을 그대로 가져오고 key값은 변경이 가능하다.
그리고 phone의 값은 기존에 없었으니 -으로 표기가 된다는 것을 볼 수 있다.
하나더 영상을 보면서 배운것
딕셔너리를 풀어서 적으면
"key" : "value"의 형식은
key = "value"의 형식으로 나뉘어진다는 것을 알았다.
즉 각각 변수가 설정이 된다는 것이다.
클래스와 인스턴스 메소드
__inti__에 대해서 다시 한번 자세히 알아보는 시간을 가져 보자.
일단은 클래스를 설정해주고 거기에 내 태그를 부탁시켜서 클래스안에 함수들을 사용할 때 내가 기록했던 데이터만 사용 할 수 있도록 하는 것이 였는데. 지금 만들어진 것을 보니
cookie1 = CookieFrame()과
cookie2 = CookieFrame("cookie2")를 보면
클래스를 호출할 때 괄호 안에 인자를 넣어서 바로 __init__으로 들어가게 되는데 init에서 원하는 결과를 만들어주기
위해서는 하나의 데이터가 필요로 하기 때문에 cookie1과 같이 빈칸으로 클래스를 호출 하면 오류가 발생을 합니다.
그리고 하나 알아낸것 중 하나가 클래스는 return 을 쓰지 않아도 cookie2.name에 클래스 안에서 실행했던
self.name이라는 변수의 값이 들어가게 됩니다.
여기서 cookie2.name = self.name 같은 변수라는 것을 기억해야합니다.
여러가지를 만들면서 느낀것이 클래스를 만들고 인스턴스를 생성할 때 인자들을 여러가지를 한번에 넣어줄 수 있으며
self.id = id를 넣어줄때
self.id는 그냥 변수라고 생각을 하면 될 것 같다. =다음에 오는것이 id라고 꼭 self.id라고 할 필요없이
password처럼 클래스 안에 사용하는 pw와 다른 이름으로 해도 상관없이 사용을 할 수 있으며
클래스 밖에서 값을 출력할 때에는 클래스에서 선언한 변수의 이름인 cookie1(태그명).password(클래스안에 변수명)으로 호출을 해주면 된다!
그래서 만들면서 느껴지는 것이 인스턴스를 잘만들어야 하고 거기에 들어가는 클래스 변수도 잘 설정을 해주어야지
햇깔리지 않고 만들 수 있을 것 같다.
그래서 이것 저것 여러가지를 만들어 보았고
이것 처럼 기본값을 넣어주어서 값이 없는 상황에 값을 넣어주는 것도 만들어 보았습니다.
※ 추가로 궁금하게 생겼는데
이거 앞에 왜 띄어지는지 궁금해서 chat GPT에게 물어보니
파이썬에서 print() 함수는 기본적으로 각 인자들을 공백으로 구분하여 출력하고, 마지막에는 개행문자(\n)를 출력합니다. 따라서 print(a,"\n",b)는 "a", 개행문자, 그리고 "b"를 차례대로 출력하는 것입니다.
그러나 여기서 주의해야 할 점은 기본적으로 print() 함수는 출력할 때 각 인자들 사이에 공백을 삽입합니다. 따라서 "a"와 개행문자 사이에도 공백이 삽입되어 "a"와 "b" 사이에도 한 칸의 공백이 존재하게 됩니다.
이를 해결하려면 print() 함수의 sep 매개변수를 사용하여 공백 대신 다른 문자열을 지정할 수 있습니다. 예를 들어, 다음과 같이 sep 매개변수를 사용하여 공백을 없앨 수 있습니다.
print(a, "\n", b, sep="")
이걸 사용하면 된다는 것을 알게 되었습니다.
상속 받은 클래스
상속을 배우면서 내가 직접 만들어보면서 찾게 된것
이 클래스를 만들고 사용 할 때 주의 깊게 봐야 할 것이 흐름이 어떻게 흘러가는 것인지를 정확하게 알고 사용하는것이
중요하다는 것을 알았다.
상속클래스를 만들때 받아오는 변수명을 전주 hp로 통일을 해야하는가 했는데 상속에서 사용하는 변수는 그안에서
변수의 이름이 같으면 사용하는 것에는 문제가 없다는 것을 알게 되었고
저기 super().__init__(d)라는 부분을 이해 하는 건 내가 상속 클래스를 만들었다고 그냥 사용하는게 아니라
연결이 되어 있다는 느낌이라 부모의 클래스에 있는 메소드를 구동한다는 개념??으로
super().__init__(d) 이것을 사용한다. 내가 적은 100의 값은 처음에 DongMonster클래스의 __init__메소드로
들어가서 그안에 있는 super().__init__(d)의 d 값에 100을 넣어주고 Monster클래스의 __init__메소드에
100의 값을 넣고 실행을 시킨것이라는 것을 이해 하게 되었습니다.
그리고
def status_check(self):
self.hp += 10
# return super().status_check()
이 구분도 주석이 된 부분은 풀었다가 다시 걸었다를 반복하다보니 알게 된것인데.
그냥 return super().status_check()이렇게 만 적으면
return 필요없이 그냥 super().status_check()로 적은거랑 다를게 없다고
생각이들어 튜터님에게 질문을 했습니다.
⭐튜터님에 답변⭐
답변을 받은 후에 정확하게 이해를 할 수 있었는데.
우리가 지금 호출하는 status_check 메서드는 어떻게 보면 실행만 해주는 명령문이기 때문에
따로 값을 내 보내줄 필요가 없기 때문이다.
그림을 보면 status라는 변수에 dong_monster.status_check()를 실행한 값을 넣어준다고 했지만
메서드를 보면 print()밖에 없으므로 결국 status에 들어갈 값이 나와 있지 않다는 것이다.
그래서 print(status)를 해보면 none이 나오게 되는것이다.
한 마디로 변수명에 값을 넣어주는 함수를 실행 할 때에 return을 써주면 그 값이 들어가는 것이라도 보면된다.
그래서 주로 계산을 하는 함수를 실행할 때에 많이 사용이 될 것으로 예상이 됩니다.
정규표현식
정규표현식을 보면서 이해가 안가던 부분이 있는데.
if not all([x in alphabet + number + special_char for x in username]):
바로 이부분이다.
괄호안에 뭔가 많이 적혀있는데 콤마도 하나도 없이 저렇게 적혀있는데 어떻게 이해를 해야 하는지
몰랐는데 인터넷에서 찾아본 결과 리스트 컴프리헨션이라는 방법이라고 한다
반복되는 리스트를 만들때 깔끔하고 간단하게 만드는 방법이라고 한다.
[Python의 꽃] 리스트 컴프리헨션(List Comprehension) (tistory.com)
나는 이블로그에서 좋은 지식을 얻었습니다.
내가 이해를 한것으로는
[i for i in 범위] 가 기본틀이며 범위가 문자면 한글자씩 range면 0부터 해당 숫자까지를 나타내며
name이라는 변수를 범위로 넣으면
[n,a,m,e]이라는 리스트가 만들어 지는 것이다.
그런데 이것이 다가 아니다!
이 리스트 컴프리헨션에는 특별한 기능이 있는데 for을 중심으로
i for i
빨간색 i는 범위에서 가져왔을 때의 값이고 파란색은 내보내줄 값이라고 생각을 하자
그러면 [i*2 for i in range(5)]를 하면 결과로
[2,4,6,8,10]이라는 값이 나온다.
그래서 이 짧은 한줄에 리스트 생성부터 변화까지 가능하다.
추가로 if문을 이용해서 조건에 맞는 값만 가져오는 것도 가능하다.여기서도 앞에 방법과 동일하게
i if (조건) for i in (범위) if (조건)
이렇게 볼수 있는데 보다시피 if가 어디에 있냐에 따라서 조건이 다르게 적용이 된다.
파란색 if는 나온결과를 바탕으로 조건 필터링을 하고 빨간 if는 범위에서 가져왔을 때를 기준으로 필터링을 한다.
그렇기에 어디에 필터링이 되는지를 잘 확인 할 필요가 있어보인다.
정규표현식
문자내에서 \n은 줄 넘김 \t은 탭하기 같은 기능을 가진 특수문자인데
정말 드물겠지만 이걸 진짜 글자로 표기를 하고 싶다면??
r"\n" , r"\t"처럼 r을 붙여주면 글자 그대로 출력하는 것이 가능합니다.
특강 수업
학습법! 특강 수업!
TIL, WIL을 왜 해야하는가?
내가 코딩을 배우면서 틀리고 모르고 했던 것들을 기록하는게 아주 중요하다.
내가 마주친 문제를 기록하고 해결하는 방법을 적어두면
다음에 동일한 문제가 발생했을때 같은 문제를 빠르게 해결 할 수 있습니다.
신입을 뽑을 때 중요하게 보는 것중 하나는 문제 해결 능력을 잘 볼려고 한다!
문제 인식 및 문제 해결을 위해서 어떤 모습을 보여주는 지가 중요하다.
프로젝트!
나의 능력을 결과적으로 증명을 할 수 있는 가장을 좋은 방법!
코더가 아닌 개발자가 되어야 한다!!
좋은 개발자는 협업과 소통이 가능한 사람들이다!
문제해결에 대한 경험과 능력이 중요하다!
질문 많이 하기 공유도 많이 하기!!
집중코딩시간에는 문제에 대해서 직접 고민하고 알아보는 과정을 가져보는 것!
나만의 학습계획을 만들어보고 실천을 해보는 것도 좋다.
'코딩 교육 TIL' 카테고리의 다른 글
2024-02-26 AI 코딩 TIL (1) | 2024.02.26 |
---|---|
2024-02-23 AI 코딩 TIL (0) | 2024.02.23 |
2024-02-21 AI 코딩 TIL (1) | 2024.02.21 |
2024-02-20 AI 코딩 TI (0) | 2024.02.20 |
2024-02-19 AI 코딩 TIL (0) | 2024.02.19 |