πŸ‘¦ 내일배움캠프/TIL(Today I Learned)

TIL_220419_2

  • -

μ˜€ν›„ 2μ°¨μ „ 볡슡..

 

ν•˜λ£¨ 일지 λͺ°μ•„μ“°λŠ” κΈ°λΆ„μ΄μ§€λ§Œ..

 

μœ κ°μŠ€λŸ½κ²Œλ„ ν•˜λ£¨ λ³΅μŠ΅ν•œ 양이라고 λ³Ό 수 μžˆκ² λ‹€..

 

μ˜€ν›„λ„ ν™”μ΄νŒ…..!!

 


 

무엇을 λŠκ²ΌλŠ”κ°€.

 

μ½”λ”©μ˜ κ²½μ΄λ‘œμ›€μ„ λŠλ‚€μ§€ 2일차 λ˜λŠ” λ‚ .

λ‚˜λŠ” κ°λ™μ˜ μ—°μ†μ˜ 마음으둜 λ³΅μŠ΅μ— μž„ν•˜κ³  μžˆλ‹€.

일단 μ–΄λ–€ 감동이냐, λ‚΄κ°€ 이 μ½”λ“œμ˜ 흐름을 μ΄ν•΄ν•˜κ³  μžˆλ‹€λŠ” 것이닀.

코딩을 κ³΅λΆ€ν•œ 지 4κ°œμ›” μ •λ„μ˜ 기간이 μ§€λ‚¬λŠ”λ°, 처음 코딩을 μž…λ¬Έν•΄μ„œ 버벅 거리던 λ‚˜μ˜ λͺ¨μŠ΅μ€ μ˜¨λ° 간데가 μ—†κ³ , μ΄ν•΄ν•˜λ©΄μ„œ 'μ•„~ μ΄κ±°μ˜€μ§€~ μ΄λ ‡κ²Œ ν•΄μ„œ λ˜λŠ” κ±°μ˜€κ΅¬λ‚˜!!' 라며 κ°νƒ„ν•˜λŠ” μžμ‹ μ΄ μžˆμ—ˆλ‹€.

 

λ°°μ›€μ˜ 끝은 μ—†κ³  κ·Έμ € μ΄ν•΄ν•˜λŠ” μ†λ„μ˜ 차이일 뿐 λ‚˜λŠ” 무엇을 λ¬΄μ„œμ›Œ ν–ˆμœΌλ©°, λΉ„μ „κ³΅μžλΌλŠ” 이유둜 λ‹€λ₯Έ 이듀과 차별을 두렀고 ν–ˆμ—ˆμ„κΉŒ μƒκ°ν•œλ‹€.

λ¬Όλ‘  μ°¨μ΄λŠ” μžˆκ² μ§€λ§Œ, λ‚˜λ„ 따라 갈 수 μžˆλ‹€λŠ” 것에 λ„ˆλ¬΄λ‚˜λ„ 큰 힘이 되고, μœ„λ‘œκ°€ λ˜μ—ˆλ‹€.

λ‚˜λŠ” λΉ„μ „κ³΅μžμ΄λ‹€. μ•žμœΌλ‘œ λˆ„κ΅¬λ³΄λ‹€ 더 λ§Žμ€ 곡뢀λ₯Ό ν•΄μ•Όν•  μˆ˜λ„ μžˆμ§€λ§Œ, ν•˜λŠ” 것에 μ•žμ„œ μœ„μΆ•λ  것이 μ•„λ‹ˆλΌ ν¬κΈ°ν•˜μ§€ μ•Šκ³  λ‚˜μ•„κ°€κΈ°λ₯Ό λ°”λž€λ‹€.

λ‚˜ μžμ‹ μ—κ²Œ.


 

[였늘 ν•˜λ£¨ 필기식 배운 λ‚΄μš© κΈ°λ‘ν•˜κΈ°]

 

Python 기초 곡뢀

 

λ³€μˆ˜ & κΈ°λ³Έ μ—°μ‚°

더보기
a = 3      # 3을 a에 λ„£λŠ”λ‹€
b = a      # aλ₯Ό b에 λ„£λŠ”λ‹€
a = a + 1  # a+1을 λ‹€μ‹œ a에 λ„£λŠ”λ‹€

num1 = a*b # a*b의 값을 num1μ΄λΌλŠ” λ³€μˆ˜μ— λ„£λŠ”λ‹€
num2 = 99 # 99의 값을 num2μ΄λΌλŠ” λ³€μˆ˜μ— λ„£λŠ”λ‹€

 

좜처 : 슀파λ₯΄νƒ€μ½”λ”©ν΄λŸ½

 

μžλ£Œν˜•

- 숫자, λ¬Έμžν˜•

더보기
name = 'bob' # λ³€μˆ˜μ—λŠ” λ¬Έμžμ—΄μ΄ λ“€μ–΄κ°ˆ μˆ˜λ„ 있고,
num = 12 # μˆ«μžκ°€ λ“€μ–΄κ°ˆ μˆ˜λ„ 있고,

is_number = True # True λ˜λŠ” False -> "Boolean"ν˜•μ΄ λ“€μ–΄κ°ˆ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

 

좜처 : 슀파λ₯΄νƒ€μ½”λ”©ν΄λŸ½

- λ¦¬μŠ€νŠΈν˜•

더보기
a_list = []
a_list.append(1)     # λ¦¬μŠ€νŠΈμ— 값을 λ„£λŠ”λ‹€
a_list.append([2,3]) # λ¦¬μŠ€νŠΈμ— [2,3]μ΄λΌλŠ” 리슀트λ₯Ό λ‹€μ‹œ λ„£λŠ”λ‹€

# a_list의 값은? [1,[2,3]]
# a_list[0]의 값은? 1
# a_list[1]의 값은? [2,3]
# a_list[1][0]의 값은? 2

 

좜처 : 슀파λ₯΄νƒ€μ½”λ”©ν΄λŸ½

- Dictionary ν˜• (Javascript의 dictionaryν˜•κ³Ό 동일)

더보기
a_dict = {}
a_dict = {'name':'bob','age':21}
a_dict['height'] = 178

# a_dict의 값은? {'name':'bob','age':21, 'height':178}
# a_dict['name']의 값은? 'bob'
# a_dict['age']의 값은? 21
# a_dict['height']의 값은? 178

- Dictionary ν˜•κ³Ό Listν˜•μ˜ μ‘°ν•©

더보기
people = [{'name':'bob','age':20},{'name':'carry','age':38}]

# people[0]['name']의 값은? 'bob'
# people[1]['name']의 값은? 'carry'

person = {'name':'john','age':7}
people.append(person)

# people의 값은? [{'name':'bob','age':20},{'name':'carry','age':38},{'name':'john','age':7}]
# people[2]['name']의 값은? 'john'

 

좜처 : 슀파λ₯΄νƒ€μ½”λ”©ν΄λŸ½

 

ν•¨μˆ˜

- ν•¨μˆ˜μ˜ μ •μ˜

더보기
# μˆ˜ν•™λ¬Έμ œμ—μ„œ
f(x) = 2*x+3
y = f(2)
y의 값은? 7

# μ°Έκ³ : μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ”
function f(x) {
	return 2*x+3
	}

# νŒŒμ΄μ¬μ—μ„œ
def f(x):
	return 2*x+3

y = f(2)
y의 값은? 7

 

좜처 : 슀파λ₯΄νƒ€μ½”λ”©ν΄λŸ½

- ν•¨μˆ˜μ˜ μ‘μš©

더보기
def sum_all(a,b,c):
	return a+b+c

def mul(a,b):
	return a*b

result = sum_all(1,2,3) + mul(10,10)

# resultλΌλŠ” λ³€μˆ˜μ˜ 값은?

 

좜처 : 슀파λ₯΄νƒ€μ½”λ”©ν΄λŸ½

 

쑰건문

if / else 둜 ꡬ성!

더보기
def oddeven(num):  # oddevenμ΄λΌλŠ” μ΄λ¦„μ˜ ν•¨μˆ˜λ₯Ό μ •μ˜ν•œλ‹€. num을 λ³€μˆ˜λ‘œ λ°›λŠ”λ‹€.
    if num % 2 == 0: # num을 2둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€κ°€ 0이면
     return True   # True (μ°Έ)을 λ°˜ν™˜ν•œλ‹€.
    else:            # μ•„λ‹ˆλ©΄,
     return False  # False (거짓)을 λ°˜ν™˜ν•œλ‹€.

result = oddeven(20)
# result의 값은 λ¬΄μ—‡μΌκΉŒμš”?

def is_adult(age):
    if age > 20:
    print('μ„±μΈμž…λ‹ˆλ‹€')    # 쑰건이 참이면 μ„±μΈμž…λ‹ˆλ‹€λ₯Ό 좜λ ₯
    else:
    print('μ²­μ†Œλ…„μ΄μ—μš”')  # 쑰건이 거짓이면 μ²­μ†Œλ…„μ΄μ—μš”λ₯Ό 좜λ ₯

is_adult(30)
# 무엇이 좜λ ₯λ κΉŒμš”?

 

좜처 : 슀파λ₯΄νƒ€μ½”λ”©ν΄λŸ½

 

반볡문

- 4즉, 무쑰건 λ¦¬μŠ€νŠΈμ™€ ν•¨κ»˜ μ“°μž…λ‹ˆλ‹€!

더보기
fruits = ['사과','λ°°','감','κ·€']

for fruit in fruits:
    print(fruit)

# 사과, λ°°, 감, κ·€ ν•˜λ‚˜μ”© κΊΌλ‚΄μ–΄ μ°νž™λ‹ˆλ‹€.

 

좜처 : 슀파λ₯΄νƒ€μ½”λ”©ν΄λŸ½

- 살짝 μ‘μš©ν•΄λ³ΌκΉŒμš”? - 과일 갯수 μ„ΈκΈ° ν•¨μˆ˜

더보기
fruits = ['사과','λ°°','λ°°','감','μˆ˜λ°•','κ·€','λ”ΈκΈ°','사과','λ°°','μˆ˜λ°•']

count = 0
for fruit in fruits:
    if fruit == '사과':
    count += 1

print(count)

# μ‚¬κ³Όμ˜ 갯수λ₯Ό μ„Έμ–΄ λ³΄μ—¬μ€λ‹ˆλ‹€.

-- 리슀트 예제

def count_fruits(target):
	count = 0
	for fruit in fruits:
		if fruit == target:
			count += 1
	return count

subak_count = count_fruits('μˆ˜λ°•')
print(subak_count) #μˆ˜λ°•μ˜ 갯수

gam_count = count_fruits('감')
print(gam_count) #감의 갯수

 

-- λ”•μ…”λ„ˆλ¦¬ 예제

people = [{'name': 'bob', 'age': 20}, 
          {'name': 'carry', 'age': 38},
          {'name': 'john', 'age': 7},
          {'name': 'smith', 'age': 17},
          {'name': 'ben', 'age': 27}]

# λͺ¨λ“  μ‚¬λžŒμ˜ 이름과 λ‚˜μ΄λ₯Ό 좜λ ₯ν•΄λ΄…μ‹œλ‹€.
for person in people:
    print(person['name'], person['age'])


# μ΄λ²ˆμ—”, 반볡문과 쑰건문을 μ‘μš©ν•œ ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄λ΄…μ‹œλ‹€.
# 이름을 λ°›μœΌλ©΄, ageλ₯Ό λ¦¬ν„΄ν•΄μ£ΌλŠ” ν•¨μˆ˜
def get_age(myname):
    for person in people:
        if person['name'] == myname:
            return person['age']
    return 'ν•΄λ‹Ήν•˜λŠ” 이름이 μ—†μŠ΅λ‹ˆλ‹€'


print(get_age('bob'))
print(get_age('kay'))

 

좜처 : 슀파λ₯΄νƒ€μ½”λ”©ν΄λŸ½

 

리슀트 μΆ”κ°€

Javascript : .push(κ°’)

python : .append(κ°’)

 

Python package

Python μ—μ„œ νŒ¨ν‚€μ§€λŠ” λͺ¨λ“ˆ(μΌμ’…μ˜ κΈ°λŠ₯λ“€ 묢음)을 λͺ¨μ•„ 놓은 λ‹¨μœ„. 이런 νŒ¨ν‚€μ§€ 의 λ¬ΆμŒμ„ 라이브러리. μ§€κΈˆ μ—¬κΈ°μ„œλŠ” μ™ΈλΆ€ 라이브러리λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œ νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜.

νŒ¨ν‚€μ§€ μ„€μΉ˜ = μ™ΈλΆ€ 라이브러리 μ„€μΉ˜!

 

- 가상 ν™˜κ²½(virtual environment) = venvμ΄λž€?

ν”„λ‘œμ νŠΈλ³„λ‘œ νŒ¨ν‚€μ§€λ“€μ„ 담을 곡ꡬ함

같은 μ‹œμŠ€ν…œμ—μ„œ μ‹€ν–‰λ˜λŠ” λ‹€λ₯Έ 파이썬 μ‘μš© ν”„λ‘œκ·Έλž¨λ“€μ˜ λ™μž‘μ— 영ν–₯을 주지 μ•ŠκΈ° μœ„ν•΄, 파이썬 배포 νŒ¨ν‚€μ§€λ“€μ„ μ„€μΉ˜ν•˜κ±°λ‚˜ μ—…κ·Έλ ˆμ΄λ“œν•˜λŠ” 것을 κ°€λŠ₯ν•˜κ²Œ ν•˜λŠ” 격리된 μ‹€ν–‰ ν™˜κ²½

 

requests : ajax 의 역할을 ν•˜λŠ” 라이브러리

더보기

-- 사전 μ€€λΉ„

import requests # requests 라이브러리 μ„€μΉ˜ ν•„μš”

r = requests.get('http://spartacodingclub.shop/sparta_api/seoulair')
rjson = r.json()

BeautifulSoup : HTML μ •λ³΄λ‘œ λΆ€ν„° μ›ν•˜λŠ” 데이터λ₯Ό κ°€μ Έμ˜€κΈ° μ‰½κ²Œ, λΉ„μŠ·ν•œ λΆ„λ₯˜μ˜ λ°μ΄ν„°λ³„λ‘œ λ‚˜λˆ„μ–΄μ£ΌλŠ”(parsing) 파이썬 라이브러리

더보기

-- 사전 μ€€λΉ„

import requests
from bs4 import BeautifulSoup

headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('HTML 링크 μ£Όμ†Œ',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

- μ‘μš©

더보기
import requests
from bs4 import BeautifulSoup

headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

#old_content > table > tbody > tr:nth-child(3) > td.title > div > a # 각각 λ‹€λ₯Έ μ˜ν™” 경둜
#old_content > table > tbody > tr:nth-child(4) > td.title > div > a

# 찾고자 ν•˜λŠ” 리슀트 곡톡 λ²”μœ„ 지정 (<tr></tr>)
movies = soup.select('#old_content > table > tbody > tr')

for movie in movies: # 반볡문 ꡬ성
    a = movie.select_one('td.title > div > a') # 뢈러였고자 ν•˜λŠ” κ°’μ˜ 경둜 지정
    if a is not None: # aκ°€ None 이 아닐 λ•Œ (is not) None 을 μ œμ™Έ
        print(a.text) # .text 둜 μ΄λ¦„λ§Œ λΆˆλŸ¬μ˜¨λ‹€

 

크둀링(crawling)

μ›Ή 상에 μ‘΄μž¬ν•˜λŠ” 컨텐츠λ₯Ό μˆ˜μ§‘ν•˜λŠ” μž‘μ—…

- HTML νŽ˜μ΄μ§€μ— μžˆλŠ” (HTML/CSS) 등을 νŒŒμ‹±ν•˜κ³ , λ°μ΄ν„°λ§Œ μΆ”μΆœ

- Open API(Rest API) λ₯Ό μ œκ³΅ν•˜λŠ” μ„œλΉ„μŠ€μ— Open API λ₯Ό ν˜ΈμΆœν•΄μ„œ, 받은 데이터 쀑 ν•„μš”ν•œ λ°μ΄ν„°λ§Œ μΆ”μΆœ

- Selenium λ“± λΈŒλΌμš°μ €λ₯Ό ν”„λ‘œκ·Έλž˜λ°μœΌλ‘œ μ‘°μž‘ν•΄μ„œ, ν•„μš”ν•œ λ°μ΄ν„°λ§Œ μΆ”μΆœ

- λŒ€ν‘œμ μΈ μ΄ˆκ°„λ‹¨ 예제 BeautifulSoup

더보기
import requests
from bs4 import BeautifulSoup

headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20210829',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

movies = soup.select('#old_content > table > tbody > tr')

for movie in movies:
    a = movie.select_one('td.title > div > a')
    if a is not None:
        title = movie.select_one('td.title > div > a')
        rank = movie.select_one('td:nth-child(1) > img')['alt']
        star = movie.select_one('td.point')

        print(rank, title.text, star.text)

μœ„μ™€ 같이 ν•„μš”ν•œ λ°μ΄ν„°λ§Œ κ³¨λΌμ„œ ν˜ΈμΆœν•  수 μžˆλ‹€.

 

DBκ°œκ΄„

잘 μŒ“κ³  잘 κΊΌλ‚΄μ“°κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€.

 

DB의 두 가지 μ’…λ₯˜

- RDBMS(SQL)

ν–‰/μ—΄μ˜ μƒκΉ€μƒˆκ°€ 정해진 엑셀에 데이터λ₯Ό μ €μž₯ν•˜λŠ” 것과 μœ μ‚¬. 데이터 50만 κ°œκ°€ 적재된 μƒνƒœμ—μ„œ, κ°‘μžκΈ° 쀑간에 열을 ν•˜λ‚˜ λ”ν•˜κΈ°λŠ” 어렀움. κ·ΈλŸ¬λ‚˜, μ •ν˜•ν™”λ˜μ–΄ μžˆλŠ” 만큼, λ°μ΄ν„°μ˜ μΌκ΄€μ„±μ΄λ‚˜ / 뢄석에 용이.

ex) MS-SQL, My-SQL λ“±

 

- No-SQL

λ”•μ…”λ„ˆλ¦¬ ν˜•νƒœλ‘œ 데이터λ₯Ό μ €μž₯ν•΄λ‘λŠ” DB. 고둜 데이터 ν•˜λ‚˜ ν•˜λ‚˜ λ§ˆλ‹€ 같은 값듀을 κ°€μ§ˆ ν•„μš”κ°€ μ—†μŒ. 자유둜운 ν˜•νƒœμ˜ 데이터 μ μž¬μ— μœ λ¦¬ν•œ λŒ€μ‹ , 일관성이 λΆ€μ‘±.

ex) MongoDB

 

mongoDB μ—°κ²°

- pymongo : mongoDB λΌλŠ” ν”„λ‘œκ·Έλž¨μ„ μ‘°μž‘ν•˜κΈ° μœ„ν•œ 라이브러리

dnspython 은 덀으둜 μ„€μΉ˜

더보기

-- 사전 μ€€λΉ„

from pymongo import MongoClient
client = MongoClient('여기에 URL μž…λ ₯')
db = client.dbsparta

- pymongo(find)

더보기
# λͺ¨λ“  데이터 뽑아보기
all_users = list(db.users.find({쑰건 : 비ꡐ값},{'_id':False}))

print(all_users[0])         # 0번째 결과값을 보기
print(all_users[0]['name']) # 0번째 κ²°κ³Όκ°’μ˜ 'name'을 보기

for user in all_users:      # λ°˜λ³΅λ¬Έμ„ 돌며 λͺ¨λ“  결과값을 보기
    print(user)

- pymongo(find_one)

더보기
user = db.users.find_one({'name':'bobby'})
print(user)
user = db.users.find_one({'name':'bobby'})
print(user['age'])

- pymongo(update_one)

더보기
db.users.update_one({'name':'bobby'},{'$set':{'age':19}})

user = db.users.find_one({'name':'bobby'})
print(user)
age : 27 > 19 update

- pymongo(delete_one)

더보기
db.users.delete_one({'name':'bobby'})

user = db.users.find_one({'name':'bobby'})
print(user)

거의 μ•ˆμ”€ μ‚­μ œ!

 

Contents

ν¬μŠ€νŒ… μ£Όμ†Œλ₯Ό λ³΅μ‚¬ν–ˆμŠ΅λ‹ˆλ‹€

이 글이 도움이 λ˜μ—ˆλ‹€λ©΄ 곡감 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.