[TIL] FC AI 부트캠프 6기 Week3 회고

김재민·2023년 8월 6일
0

TIL

목록 보기
3/7
post-thumbnail

시작하기에 앞서 나는 블로그를 작성하는 것이 익숙해지기 전까지 TIL을 "Today I Learned"가 아닌 "This week I Learned"로 정의하고 매주 최소 한 번씩 기록해보려고 한다.

함수 (Function)

위치 인자 (positional argument)

  • *args : 인자의 개수가 정해지지 않았을 경우 사용
  • 튜플(Tuple) 형태로 데이터가 넘어옴
def sum(*nums) :
	result = 0
    for num in nums :
    	result += num
    return result
    
sum(1, 2, 3, 4, 5)

키워드 인자 (keyword argument)

  • **kwargs : 인자의 개수에 제한이 없으며 인자마다 이름을 정해 넘겨주며 순서 또한 상관 없이 사용 가능
  • 딕셔너리(Dictionary) 형태로 데이터가 넘어옴
def show_user(**user) :
	for key, value in user.items() :
    	print(f"{key}는 {value}입니다.")
        
show_user(name="Kim", age = 20)

람다 표현식

  • 이름을 지을 필요도 없는 간단한 형태의 함수
lambda 매개변수 : 결과

# 정의
lambda a : a-1
# 호출
(lambda a : a-1)(10)
# 정의 with if문
lambda a : True if a > 0 else False

# 람다함수 with 리스트 컴프리헨션
result = lambda x : [x * i for i in range(1,10)])(2)
print(result) # 2의 배수가 출력됨

map

  • 함수와 반복 가능 객체(리스트 등)를 인자로 받고, 요소에 각 함수를 적용시킨 후 반환해주는 함수
map(함수, 반복가능객체)

# 각 요소에 10 더하기
my_list = [1, 2, 3]
new_list = map(lambda x : x + 10, my_list)

filter

  • 함수와 반복 가능 객체(리스트 등)를 인자로 받고, 조건에 만족하는 요소들만 반환해주는 함수
filter(조건으로 쓰고자 하는 함수, 반복가능객체)

# 2 이상 5 이하 숫자만 남김
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
new_list = filter(lambda x : 2 <= x <= 5, my_list)

reduce

  • 함수와 반복 가능 객체(리스트 등)를 인자로 받고, 함수가 적용된 각 인자의 값을 쌓아서 반환하는 함수 (누적 연산)
reduce(함수, 반복가능객체, x의 초기값)

# 모든 요소의 합
from functools import reduce

my_list = [1, 2, 3, 4, 5]
result = reduce(lambda : x, y : x + y, my_list)

# 모든 요소의 곱
my_list = [2, 4, 6]
result = reduce(lambda : x, y : x * y, my_list)

Pickle

  • 데이터 객체 자체를 저장하는 모듈
import pickle
data = {
	"목표1" : "아침에 일어나 물 한잔 마시기",
    "목표2" : "매일 코딩 공부 1시간"
}

# 파일 쓰기
file = open("data.pickle", "wb")
pickle.dump(data, file)

# 파일 읽기
file = open("data.pickle", "rb")
data = pickle.load(file)

file.close

CSV

  • csv : 데이터가 콤마로 구분된 텍스트 파일 형식
import csv 

data = [
	["이름", "반", "번호"],
    ["재석", 1, 20],
    ["홍철", 3, 8]
]

# 파일 쓰기
with open("student.csv", "w", newline="") as f :
	writer = csv.writer(file)
    writer.writerows(data)
    
# 파일 읽기
with open("student.csv", "ㄱ", newline="") as f :
	reader = csv.reader(file)
    for d in reader :
    	print(d)

크롤링 (Crawling)

Request

import requests

# 접근이 거부될 경우 header를 포함해서 우회 후 접근 가능
res = request.get(주소)

# 데이터 부분 출력
print(res.text)

BeautifulSoup

  • HTML 문서(문자열)을 데이터 구조(리스트, 딕셔너리)로 파싱해주는 패키지
from hs4 import BeautifulSoup

# 파싱
soup = BeautifulSoup(html, 'html.parser')

# 원하는 정보 추출, .text(문자열 추출)와 .strip()이 자주 같이 쓰인다
soup.select('태그명')
soup.select('.클래스명')
soup.select('#아이디')
soup.select('상위태그 하위태그')

Selenium

  • url이 크롤링 되는 정보의 일부를 담고있지 않은 경우 Selenium을 이용해 직접 상호작용을 일으켜 크롤링할 수 있음
    - chrome 네트워크를 분석하여 기존의 request를 사용해 더 빠르고 간결하게 크롤링이 가능하다.
from selenium import webdriver
from selenium.webdriver.common.by import By

# 요소 하나찾기 
driver.find_element(By.CSS_SELECTOR, '태그, 선택자')
# 요소 여러개 찾기 
driver.find_elements(By.CSS_SELECTOR, '태그, 선택자')
#글자 입력하기
요소.send_keys('단어')
# 요소 클릭하기
요소.click()
#현재 페이지의 HTML 다 가져오기
driver.page_source

driver.quit()

느낀점 및 다짐

이번주에도 파이썬 기초 문법 필수 강의 외에 다양한 실습을 해볼 수 있는 선택 강의들도 추가로 들으며 공부하였다.

"크롤링"을 처음 배워보았는데 기존에 알고있던 HTML 지식들도 적용해가며 배우니 많이 어렵지는 않았고 오히려 생각보다 너무 재밌었다. 작년에 크롤링을 이용하여 프로젝트를 해볼까 했다가 너무 막막해 포기했었던 기억이 나며 다시 한번 도전해 보고 싶다는 생각이 들었다.

당장 내일로 다가온 파이썬 프로젝트 시작 날. 마지막으로 열심히 2주간 배웠던 내용 복습해서 프로젝트의 모든 개발 사항을 빠짐없이 구현하며 완벽하게 끝내고싶다.

1개의 댓글

comment-user-thumbnail
2023년 8월 6일

개발자로서 배울 점이 많은 글이었습니다. 감사합니다.

답글 달기