문제:
어떤 클래스는 이름 옆에 ()가 있고, 어떤 클래스는 없다. 왜일까?
시도:
괄호를 넣고도 실행해보고 빼고도 실행해보기로 한다.
넣고 해도 정상작동하고
>>> class Circle():
... pi = 3.14
... def area(self, radius):
... return self.pi * radius**2
...
>>> circle = Circle()
>>> pizza_area = circle.area(5)
>>> table_area = circle.area(7)
>>> print(pizza_area, table_area)
78.5 153.86
>>>
빼고해도
정상작동!
>>> class Circle:
... pi = 3.14
... def area(self, radius):
... return self.pi * radius**2
...
>>> circle = Circle()
>>> pizza_area = circle.area(5)
>>> table_area = circle.area(7)
>>> print(pizza_area, table_area)
78.5 153.86
>>>
그럼 있거나 없거나 상관 없다는 얘긴데 왜 붙여놓는거지? 생각이 들어서 튜터님께 쪼르르
해결:
답변주신 결론은, 특별히 인자값을 넣어줄 용도가 없는 한 ()는 있어도 되고 빼도 되는 거라고 하신다.
아 하!
알게된점:
클래스에 인자값이 들어가는 경우가 궁금해졌다. 그런 모습이 보고 싶다. 오늘 심화강의 2회독 더 할 때 그런 문법이 나오는지 지켜봤다가, 어떤 방식으로 인자 값을 받아서 어떻게 메소드에서 쓰는지 유심히 살펴봐야겠다.
방금 괄호의 문제 처럼 한 조각 씩 깊게 생각해보는 건 좋은 것 같다. 왜냐하면 그렇게 자세히 파악하게 된 아이를 기점으로 해서 다른 연결된 아이들에 대한 이해로 생각을 확장해나갈 수 있기 때문이다. 깃발을 하나 꽂아 놓으면 깃발 주변에 대한 이해력에도 도움이 되는 느낌이다. 그러다보면 전 지역을 정복할 수 있겠지!
문제:
공부를 하다보니 아래 a.코드 처럼 문자열 포맷팅을 .format() 형태로 받는 경우가 있고 b.코드처럼 f 스트링으로 받는 경우가 있었다. 그래서 튜터님께 여쭤보니 전자는 python 구버전에서 사용하던 방식이고, 후자는 3.6쯤에 새로 생긴 방식이라는 차이가 있다고 하셨다. 그리고, 현업에서는 레거시코드를 다룰 일도 많아서 전자의 방식과 후자의 방식 모두를 인지해야 한다고 하셨다. 딱 보면, '아 이건 구버전용어고 요즘으로 치면 이거구나' 이 정도의 인지.
기념으로 .format() 으로 쓰인 것을 f 스트링으로 바꿔보자고 생각했다.
a.코드
b.코드
시도:
1트. a. 코드의 모양을 b.코드와 최대한 비슷하게 써 본다.
>>> class Musician:
... grade = "junior"
... def explanation(self):
... print(f"I am a {grade}")
...
>>> drummer = Musician()
>>> print(drummer.explanation())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in explanation
NameError: name 'grade' is not defined
>>>
안된다. 클래스 변수 grade를 읽어오지 못함. 생각해보니 당연하지. grade를 그대로 받아다 쓰려면 굳이 f스트링을 쓸 필요가 없지. grade 자체가 그때그때 필요한대로 입력하면 적용되는 변경값이 되도록 해야한다.
2트.
이렇게 바꾸고, 호출할 때 explanation함수의 인자값으로 6학년이라는 의미에서 6이라고 써봤다.
>>> class Musician():
... def explanation(self, grade):
... print(f"I am a {grade}")
...
>>> drummer = Musician()
>>> print(drummer.explanation(6))
I am a 6
None
>>>
결과는 잘 됨. 그런데 내가 바라는 건 1학년 2학년 6학년 이런 숫자 값이 아니라, junior senior 이런식으로 문자 값이 출력되길 바란다. 3트 고고
3트.
결과
>>> class Musician():
... def explanation(self, grade):
... print(f"I am a {grade}")
...
>>> drummer = Musician()
>>> print(drummer.explanation('junior'))
I am a junior
None
>>>
된당!!!! ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ
근데 이러고 나니 뭔가 또 시험해보고 싶어졌다. 기존 인자에 콤마를 넣고 또 다른 인자를 추가해봐도 될까?
4트.
오오오오!!!! 된다 돼!!
>>> class Musician():
... def explanation(self, grade, num):
... print(f"I am a {grade} and mynumber is {num}")
...
>>> drummer = Musician()
>>> print(drummer.explanation('junior', 6))
I am a junior and mynumber is 6
None
>>>
알게된점:
생각 한 걸 시도해서 성공해보니!! 몬가!! 몬가 클래스와 더 친해진 느낌이다. 몬가 시스템을 알 것 같다. 역시 배운거 직접 해보는 게 중요하구나! ㅎㅎ 다른 것도 직접 실습 + 이것도 될까? 싶은 걸 시도해봐야겠다.
그 외 새로 배운 작은 내용:
_set에 대하여:
오늘 갑자기 set에 대한 궁금증이 생겼는데, 강의로 set을 학습할 때는 list에 담긴 변수들로 학습해서 주로
a = [1, 2, 3, 4, 5] 이런 형태만 보았다.
근데 갑자기, 이런 게 아닌 튜플로 묶인 집합도 set을 걸 수 있는지가 궁금했다.
결과는 매우 가능. set을 걸 때는 소괄호, 중괄호, 대괄호 관계없이 서로서로 섞어 쓰더라도 교집합, 합집합, 차집합 등 모두 연산할 수 있더라.
$ "c:/Users/DONG HYUN LEE/Desktop/study/venv/Scripts/python.exe" "c:/Users/DONG HYUN LEE/Desktop/study/prac.py"
{5}
{1, 2, 3, 4, 5, 6, 7, 8, 9}
{2}
(venv)
궁금증 또 하나 해결!
그러고 나니 추가로 궁금했던 게
사전형 데이터와 리스트형 데이터 사이에도 교집합을 구할 수 있는 지 였다.
당연히 안 될 것 같긴 하지만
요로케 ▼
결과는 역시나 땡!
인공지능에게 이 오류가 뭔지 물어봤다 ㅎㅎ
아, 근데 unhashable이 뭐지...
오... 그럼 내가 넣은 딕셔너리형이나 {} 속의 {} 같은 리스트 데이터를
1. 튜플로 감싸거나
2. frozenset() 으로 감싸면 작동한다는 건가?
한 번 해봐야지
>>>
ㅋㅋㅋㅋㅋㅋㅋ 실패 ㅋㅋㅋ 아 이 뜻이 아니었나... 다시
2트를 하려다가 왠지 느낌적인 느낌으로 간단한 문제가 아닌 것 같아서
다시 인공지능한테 물어봤다.
결과는 역시나 물어보길 잘했다.
보면, 밑에 a_set과 b_set을 정의하는 곳에서 파이썬의 map 문법을 쓴 것을 볼 수 있다.
적용해보니
으앵? iterable은 반복가능한 이라는 뜻이니 뭔가 정수인 객체들이 반복가능하지 않다는 것 같다.
다시 인공지능에 검색.
결과는
>>>
후앵 ㅋㅋㅋ 에러는 안났는데 뭔가 이게 아닌거 같다.
위에 a 와 b에 공통적으로 자연수 1이 들어있으니까 둘 사이 교집합을 구했으면 자연수 1이 증거로 나와야 하는데 안나왔으니...
ㅠㅠ 인내심 고갈 ㅋㅋㅋ 잠깐 화장실 갔다가 이건 팀원들이나 튜터님이랑 도움을 구해봐야겠다.
화장실 갔다 와서 다시 인내심 충전!
한 번만 더 해보고 싶은 게 있다.
밑에 map 자리에 [a] 이렇게 씌우지 말고 위에 리스트 자체에서 integer들을 집합으로 만들어보려고 한다.
물론 이렇게 하면 최초에 integer든, 리스트든, 튜플이든, 딕셔너리든 요소의 종류에 상관없이
set 문으로 교집합 연산처리가 가능한지를 알고 싶었던 나의 목표가 더이상 무의미해지긴 한다.
근데 이미 AI 대화 과정 중 절반은 답을 얻은 것 같다. set에 넣은 list의 eliments들은 type이 각각 중구난방이면 아무리 a셋과 b셋에 같은 공통되는 아이가 있어도 set 고유 연산을 처리할 수 없다.
아무튼 마지막 트라이
역시나
에러는 안나는데, 교집합 연산처리가 안되고 있다.
_별개로 새로 배운 작은 내용
_pip 명령어 두 개 더 배웠다.
실수로 venv를 안 깔은 상태로 패키지를 설치해서 뭔가 용량 잡아먹을까봐 다시 지우고 싶었는데,
그래서 검색 하다가 새로 배운 코드 ㅎㅎ
1. $pip freeze : 현재 위치에 깔려 있는 모든 패키지들을 목록으로 보여준다.
2. $pip uninstall <패키지이름> : <패키지 이름> 자리에 해당하는 패키지를 삭제해준다.
_대박사건 .replace() 문에 인자를 두 개만 받는게 아니었다.
궁금해서 인자 4개 까지 써봤는데 값자기 string 오류가 나는 거??
그래서 앵?? 뭐지 하고 좀 알아봤더니, .replace()문은 인자를 3개까지 받을 수 있다고 함.
각각 인자의 기능은
예를들어 .replace("써있는글자", "새로바꿀글자", "바꿀횟수integer") 라고 함.
내가 실제로 해봤더니 아래와 같다.
위에서 실험대상인 a라는 문자열이 있다. b라는 변수를 선언해서 .replace문을 적용하는데,
a에 있는 여러번의 "삼" 이라는 글자 중 왼쪽부터 2개의 "삼"자 만을 "깡"으로 변경하려고 하는 코드이다.
이걸 프린트 해보면 결과는,
이렇게 나온다.
만약에 리플레이스문의 인테져를 3으로 바꾸면,
이렇게 "삼"자 하나가 더 "깡"자로 바뀌면서 깡겹살이라는 멋진 단어를
화려한 조명이 감싸게 된다.
후후
'About coding > Today I learned' 카테고리의 다른 글
2023년 03월 27일 TIL (0) | 2023.03.27 |
---|---|
2023년 03월 24일 TIL (0) | 2023.03.26 |
2023년 03월 22일 TIL (0) | 2023.03.22 |
2023년 03월 20일 TIL (0) | 2023.03.20 |
2023년 3월 17일 TIL (0) | 2023.03.17 |