본 포스팅은 노마드코더님의 온라인 강의에 대한 복습을 기록하기 위한 포스팅입니다.
※ 본 포스팅의 내용은 강의를 들은 후 필자의 개인적인 의견을 기재한 것이니, 정답이 아닐 수 있음을 참고하십시오.
강의 소개 : 파이썬으로 웹 스크래퍼 만들기 (2주 완성반)
-. 내용 : 파이썬 기초 (타입, 변수, 함수, 클래스 등 및 웹 스크래퍼 코드 작성법)
-. 비용 : 100% 무료 강의
-. 비고 : 한글 자막 제공 / 강의 100% 완료 시 10% 할인 쿠폰 제공
온라인 강의 : https://nomadcoders.co/ / 풀스택 개발자 로드맵 : https://nomadcoders.co/roadmap
유튜브 채널 : https://www.youtube.com/channel/UCUpJs89fSBXNolQGOYKn0YQ
#3.0 Django is AWESOME & #3.1 *args **kwargs
1) Django 란?
-. 파이썬만을 이용하여 Front End ~ Back End API를 만들 수 있게 해주는 웹 프레임워크입니다.
-. 엄청 큰 커뮤니티를 가지고 있어 문제 해결을 위한 정보가 많고, 미리 완성된 코드를 많이 찾을 수 있습니다.
-. Documents가 잘 작성되어 있고, 한글화도 되어있어 접근이 용이하다.
-. Django를 이용하여 만들어진 사이트들은 아래와 같습니다.
* Instagram, Pinterest, Mozilla, Bitbucket 등 (Wikipedia 참조)
-. 여기까지만 알아두고, 본 강의에서는 Django를 사용하지 않는다는 점 알아두시기 바랍니다.
2) Arguments & Keyword Arguments
-. 파이썬에서는 기본적으로 Argument(이하 인자)의 수를 정해놓고 사용해야 한다.
def plus(a, b):
return a + b
print(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
plus(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
-. 위 코드를 보면 print()의 경우 인자의 수가 제한이 없는 것을 볼 수 있다.
-. 하지만 plus()의 경우 인자를 2개만 받아야하고, 2개보다 적거나 많으면 문제가 발생하는 것을 볼 수있다.
def plus(a, b, *args):
print(args)
return a + b
print(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
plus(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
-. 하지만 위 코드와 같이 *args를 인자로 가질 경우 개수에 상관없이 Tuple 형태로 인자를 받는 것을 볼 수 있다.
def plus(a, b, *args):
print(args)
return a + b
plus(1, 1, 1, 1, 1, aa=True, bb=True, cc=True, dd=True, ee=True, ff=True, gg=True)
-. 위 코드의 경우 plus() 함수가 Keyword Argument를 가지고 있어야 한다는 에러가 발생한다.
def plus(a, b, *args, **kwargs):
print(args)
print(kwargs)
return a + b
plus(1, 1, 1, 1, 1, aa=True, bb=True, cc=True, dd=True, ee=True, ff=True, gg=True)
-. **kwargs를 인자로 가질 경우 Keyword 인자의 개수에 상관없이 Dictionary 형태로 인자를 받는 것을 볼 수 있다.
-. 여기서 Positional Argument와 Keyword Argument의 차이를 알아 두어야 한다.
* Positional Argument : 위치에 의한 인자로 어떤 값이 전달되어도 무조건 순서대로 인자 값이 대입된다.
* Keyword Argument : 위치에 상관없이 Keyword에 의하여 값이 대입된다.
def plus(*args):
result = 0
for number in args:
result += number
return result
def minus(*args):
result = 0
for number in args:
result -= number
return result
p_result = plus(1, 2, 3, 4, 1 ,1, 6, 3, 1, 3, 6, 7, 8, 3, 5, 6 ,7)
m_result = minus(1, 2, 3, 4, 1 ,1, 6, 3, 1, 3, 6, 7, 8, 3, 5, 6 ,7)
print(f"plus : {p_result}, minus : {m_result}")
-. *args를 이용하면 위와 같이 간단한 계산기를 만들 수 있다.
#3.2 Intro to OOP & #3.3 Methods part One
1) 객체지향 프로그래밍(OOP)이란?
-. 객체지향 프로그래밍(Object-Oriented Programming)
* 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위(객체)들의 모임으로 파악하고자 하는 것
* 유연하고 변경이 용이하여 대규모 프로젝트에 많이 사용된다.
* 직관적인 코드 분석이 가능하여 개발/보수가 쉽게 이루어진다.
-. 객체지향 프로그래밍 언어의 종류
* C++, Java, C#, Dart, Swift, Ruby 등등
2) Class란?
-. 객체의 변수, 메서드들의 집합 = 동일한 속성과 행위를 수행하는 객체의 집합
예를 들어 회사 클래스와 회사원 클래스가 있다고 치자,
회사와 회사원은 분명히 다른 일을 수행(메서드)하며, 다른 속성(변수)을 가지고 있다.
그렇기 때문에 회사와 회사원은 다른 클래스라고 볼 수 있다.
그리고 회사와 회사원은 각각 여러 회사와, 여러 회사원이 존재할 것이다.
여기서 각각의 회사들이 동일한 객체라고 할 수 있는가?
동일한 객체이다. 왜냐하면 모든 회사는 "사업자번호, 회사명, 주소"라는 속성과"지급"이라는 행위를 수행한다.
그렇기 때문에 A, B, C 회사들은 회사라는 하나의 객체로 볼 수 있고, 각각의 회사들은 인스턴스라고 볼 수 있다.
클래스 = "설계도", 인스턴스 = "설계도를 보고 만든 물건"라고 생각하며 간단하다 (Nico! Awesome!!)
class Car():
wheels = 4
doors = 4
windows = 6
seats = 2
porche = Car()
print(porche.windows)
-. 위와 같이 Car라는 클래스를 만들어두고, porche라는 인스턴스를 만들어서 사용 할 수 있는데,
-. 이때 porche라는 인스턴스는 Car 클래스의 변수와 메서드를 가지고 태어난다
class Car():
wheels = 4
doors = 4
windows = 6
seats = 2
porche = Car()
porche.color = "Red"
bugati = Car()
print(f"porche Color : {porche.color}")
print(f"bugati Color : {bugati.color}")
-. 또한 인스턴스를 확장할 수도 있는데, 위와 같이 porche 인스턴스에서 color라는 변수를 추가하면,
-. porche 인스턴스에는 color변수가 있지만, bugati 인스턴스에는 color변수가 없으므로 에러가 발생한다.
class Car():
wheels = 4
doors = 4
windows = 6
seats = 2
porche = Car()
porche.color = "Red"
bugati = Car()
bugati.color = "white"
print(f"porche Color : {porche.color}")
print(f"bugati Color : {bugati.color}")
-. 그리고 bugati 인스턴스에 color변수를 지정하면 서로 다른 color를 가지는 것을 볼 수 있다.
3) 메서드(Method)란?
-. function = Method 즉, 어떠한 행위를 실행하는 것들을 메서드라고 한다.
-. 정확하게는 Class안에 있는 Function을 Method라고 한다.
class Car():
wheels = 4
doors = 4
windows = 6
seats = 2
def start():
print("I Started")
porche = Car()
porche.start()
-. 위 코드를 보면 Car() 클래스는 start() 라는 메서드를 가지고 있다.
-. 그리고 porche라는 인스턴스를 만들고, start() 메서드를 실행하였다. 과연, 이 코드는 정상적으로 작동할 것인가?
-. 안타깝게도 에러가 발생한다. 하지만 에러 메시지를 보면 이상한 점이 있다.
-. Car() 클래스의 start() 메서드는 0개의 argument(인자)로 구성되어 있고
-. porche 인스턴스도 0개의 인자로 start()를 호출했다.
-. 하지만 메시지에서는 1개의 인자가 주어져 있다고 한다.
-. 그렇다면 누가 인자를 주었는가? 정답은 파이썬이다.
-. 파이썬은 모든 메서드를 실행할 때 하나의 인자를 함께 사용하는데 그것은 바로 self이다.
-. 그리고 모든 메서드의 첫 번째 인자는self(메서드를 호출하는 인스턴스)이다. (self를 다른 이름으로 해도 된다.)
class Car():
wheels = 4
doors = 4
windows = 6
seats = 2
def start(potato):
print(potato)
print("I Started")
porche = Car()
porche.color = "Red"
porche.start()
-. 위 코드를 보면 start메서드는 potato라는 인자를 갖고 있고, potato와 "I Started"을 출력하는 행위를 한다.
-. 그리고 코드를 실행하면 potato가 "__main__. Car"라는 것을 알 수 있다.
class Car():
wheels = 4
doors = 4
windows = 6
seats = 2
def start(potato):
print(potato.color)
print("I Started")
porche = Car()
porche.color = "Red"
porche.start()
-. 그리고 potato의 color 변수를 출력하면 "Red"가 나온다.
-. 이 것은 potato가 porche라는 인스턴스 자신이라는 말과 같다. 즉, potato = self 인 것이다.
-. 물론 다른 언어에서는 이렇게 작동하지 않는다. 파이썬에서만!! 이렇게 작동한다는 것을 알아두어야 한다.
* 파이썬의 porche.start() 는 다른 언어의 porche.start(porche)와 같은 개념이다.
※ 본 포스팅의 내용은 강의를 들은 후 필자의 개인적인 의견을 기재한 것으로,
정답이 아닐 수 있음을 참고하십시오.
이상으로 Python으로 웹 스크래퍼 만들기 복습 14일 차를 마치겠습니다.