파이썬 철학 -> import antigravity
클래스와 함수를 활용
python 클래스
class name: def __init__(self): # 함수 실행 함수 print('name 클래스 선언') self.name = input() self.age = input() def show(self): # self : 클래스 저장할 변수 print('show 실행') a = name() # 'name 클래스 선언' 출력 b.show() # 'show 실행' 출력 # 상속 class name2(name): def __init__(self): # 기존 내용 덮어써서 기존 내용 삭제 super().__init__() #기존내용 그대로 유지하면서 새로운 내용 받기 self.gender = input()
pdb
라이브러리import pdb
pdb.set_trace() # 확인하고 싶은 부분에 작성
# (Pdb) 라는 문구가 뜨고 코드가 멈춤
#python 3.7 이상부터는 `breakpoint` 로 가능
sum = 0
breakpoint()
print(sum)
c
ontinue : 다음 중단점을 찾아 이동l
ist : 주변 11줄 코드 출력s
tep : 다음 문장으로 이동n
ext : 다음 문장으로 이동파이썬의 모든 것은 객체로 이루어져 있다.
반복되어 사용될 수 있는 하나의 연관된 작업을 할 수 있는 코드 블록
def 함수_이름(파라미터):
"함수 문서"
함수 내용
return [표현식]
참조 vs 값
파이썬에서는 인수들이 참조로 함수에 전달
= 객체의 주소값을 전달
참조로 전달되지만 immutable, 변경이 불가한 객체들은 값으로 전달
= int,str등은 값으로 전달, list,dict와 같은 객체들은 참조값으로 전달
class class_name:
class_name = "smth"
__init__
Dunder method
Magic method
double underscore 가 앞뒤로 붙는 경우
@property
def ~~
@변경할함수이름.setter
def ~~
@
어떤 함수에 추가적인 기능을 제공하고 싶을 때 사용
데코레이터 왜 사용?
1. 코드의 재사용 줄이기 위해
2. 대규모 소프트웨어 개발을 위해
def my():
print("first")
print("my 라는 함수입니다.")
만약 `my`라는 함수 이외에
mine, iam이라는 함수도 first를 프린트하고 싶으면 아래처럼 작성
def mine():
print("first")
print("mine 이라는 함수입니다.")
def iam():
print("first")
print("iam 이라는 함수입니다.")
만약 deco를 사용하면?
def first_deco(func): # func 는 실행할 함수입니다.
def first(): # 실행할 함수를 감싸는(wrap) 함수입니다.
print("first")
func()
return first #first 함수를 return합니다
@first_deco
def my():
print("my 라는 함수입니다.")
@first_deco
def mine():
print("mine 이라는 함수입니다.")
@first_deco
def iam():
print("iam 이라는 함수입니다.")
mutable vs immutable
mmutable : 값이 변함, list, dictionary
immutable : 값이 변하지 않음, number, string, tuple
class parent():
def __init__(self):
self.child = 'parent'
def say(self):
print('i am a ' + self.child)
class daughter(parent):
def __init__(self):
self.child = 'daughter'
class son(parent):
def __init__(self,son):
self.child = 'son'
self.name = son
def say(self):
super().say()
print('My name is '+ self.name)
p = parent()
d = daughter()
s = son('spongebob')
p.say() # i am a parent
d.say() # i am a daughter
print(d.child) # daughter
print(p.child) # parent
print(s.child) # son
s.say() # i am a son \n My name is spongebob
getter/setter
class sampleA:
def __init__(self):
self.x = 0
self.__y = 0
@property
def y_func(self):
print('called get method')
return self.__y
@y_func.setter
def y_func(self, value):
print('called set method.')
self.__y = value
@y_func.deleter
def y_func(self):
print('called delete method')
del self.__y
def new_func(self):
return self.__y, self.x
a = sampleA
print(a.y_func)
a.x = 1000
print(a.x) # 1000 -> 마지막 할당이 a.x=1000이기때문
a.__y = 1000
print(a.y_func) #0 -> 숨겨둔 값이기때문에 할당이 안됨
a.y_func = 1000
print(a.y_func) # 1000
if__name__=='__main__': def ~
현재 스크립트 파일이 실행되는 상태를 파악하기 위해 사용됨
__name__ 은 모듈의 이름이 저장되는 변수로 import로 모듈을 가져왔을 때 모듈의 이름이 들어감
→ 파이썬 인터프리터로 스크립트 파일을 직접 실행했을 때는 모듈의 이름이 아니라 '__main__' 이 들어감
크롤링 혹은 스크레이핑
웹 페이지에 있는 데이터를 모으는 작업
<!DOCTYPE html> # doc type 지정
<html>
<head> # 상세내용
<meta charset = "">
<meta name = "" content = >
<title>name</title>
</head> # head 끝
<body> # 사용자에게 보여지는 부분
</body> # body 끝
</html> # html 끝
<p>
문단, <a>
하이퍼링크 html이 한줄로 쭉 있어도 컴퓨터가 이해할 수있다 -> 태그가 있어서 가능 : 시작과 끝을 표시 '/'
.
기호를 활용해 클래스 정의#
기호를 통해 스타일 지정JS
document.querySelectorAll('p')
getElementsbyTagName
: 태그 이름으로 문서의 요소들을 리턴
getElementById
: 'id' 가 일치하는 요소들을 리턴
getElementsByClassName
: '클래스' 가 일치하는 요소들을 리턴
querySelector
: 셀렉터(들)과 일치하는 요소를 리턴
querySelectorAll
: 셀렉터(들)과 일치하는 모든 요소들을 리턴
var
사용웹 크롤링
- 웹을 돌아다니면서 정보를 수집하는 행위
- 주로 인터넷에 있는 사이트들을 인덱싱하는 목적
requests
동적 스크레이핑 = 크롤링 = 스크롤을 내려야 보이는 것들
vs
정적 스크레이핑 = just url로 받아올 수 있는거
Beautifulsoup
'html.parser'
import requests
from bs4 import BeautifulSoup
page = requests.get(url)
# requests를 통해 받은 페이지(requests에서 사용하는 response 객체)
soup = BeautifulSoup(page.content, 'html.parser')
# BeautifulSoup로 파싱한 객체
# dataframe 객체 내의 데이터를 데이터베이스로 저장 메소드
DataFrame.to_sql('name', sql.connection, if_exists = '', index_label = '')
## if_exists{‘fail’, ‘replace’, ‘append’}, default ‘fail’
# How to behave if the table already exists.
# fail: Raise a ValueError.
# replace: Drop the table before inserting new values.
# append: Insert new values to the existing table.
< 예시 >
손님 : app/client
메뉴 : API
웨이터 : API server
주방장 : service server
HTTP Method
HTTP Status Code
Json vs Dictionary
Json 자바스크립트, true, false, "" 만 허용
- json.loads : json(string) -> dict
- json.dumps : dict -> json(string)
Dictionary 파이썬, True, False
XML, JSON
YAML : 사용자가 보기 편하게 되어 있음
SQL 기반의 관계형 DB를 사용하는 케이스
NoSQL 기반의 DB 사용하는 케이스
데이터의 구조가 거의 또는 전혀 없는 대용량의 데이터를 저장하는 경우
NoSQL DB는 저장할 수 있는 데이터 유형에 제한을 설정하지 않음
클라우딩 컴퓨팅 및 저장공간을 최대한 활용하는 경우
클라우드 기반의 DB 저장소를 구축하면 저렴한 비용의 솔루션을 제공받을 수 있음, 소프트웨어에 DB 확장성이 중요한 경우
빠르게 서비스를 구축하고 데이터 구조를 자주 업데이트하는 경우
NoSQL 기반의 DB의 타입
데이터의 형태
- 정형 : 데이터프레임에 바로 들어가도 사용할 수 있는 데이터, ex. csv
- 비정형 : 구조가 정해지지 않은 데이터, ex. 이미지, 영상, 음성, 메일
- 반정형 : 데이터의 형식과 구조가 유연한 데이터 ex. html, json, xml
NoSQL
장점 : 스키마를 작성하지 않아 빠르다
단점 : 스키마가 없어 데이터의 형식을 확인하기 어렵다. ACID(정확도나 보완성이 취약 -> 데이터 유실 가능성, 데이터의 중복가능성)