[WEEK_03] 학습일지03. Python기초

ardor924·2023년 7월 31일
0
post-thumbnail

해당 게시글은 패스트캠퍼스에서 진행하는 AI 부트캠프에서 학습한내용과 교육과정을 토대로 작성했습니다.

AI 부트캠프 3주차 학습일지

학습내용 리마인드

이번 3주차도 파이썬 기초문법을 학습했다.
그중에서도 조건반복문의 삼항연산자, 리스트 컴프리헨션,
함수파트의 키워드 인자 (kargs), lambda 표현식과 map, filter, reduce
등을 복습했고 추가 심화 과정으로 크롤링 및 API활용하는 학습을 진행했다.
이번주도 역시 리마인드 차원에서 특별히 남겨보고 싶은 몇가지만 정리해 보려고 한다.

01. 리스트컴프리헨션

1-1 숫자맞추기 게임
import random

def guess_the_number():
    # 1부터 100 사이의 랜덤한 숫자 리스트 생성
    secret_number = random.randint(1, 100+1)
    number_list = [num for num in range(1, 100+1)]
    
    max_attempts = 10  # 최대 시도 횟수 설정
    attempts = 0       # 사용자 시도 횟수 초기화
    
    print("1부터 100 사이의 숫자를 맞추어보세요.")
    
    while attempts < max_attempts:
        user_guess = int(input(f"시도 {attempts + 1}/{max_attempts}: "))
        attempts += 1
        
        # 사용자가 맞췄을 때
        if user_guess == secret_number:
            print(f"축하합니다! {attempts}번 만에 정답을 맞췄습니다.")
            break
        
        # 사용자가 입력한 숫자와 정답을 비교하여 힌트 제공
        if user_guess < secret_number:
            print("추측한 숫자가 작습니다.")
        else:
            print("추측한 숫자가 큽니다.")
    else:
        print(f"아쉽지만 정답은 {secret_number}였습니다. 다시 도전해보세요!")

if __name__ == "__main__":
    guess_the_number()
1-2 과일의 당도측정
과일중 당도가 1 이상 2 이하 인 과일의 이름 을 출력하시오

# 표본
fruits = [
            {'id' : 1 , 'name' : '사과', '설명' : {'당도' : 1.5 , '가격' : 35000 }},
            {'id' : 2 , 'name' : '파인애플', '설명' : {'당도' : 1.3 , '가격' : 12000 }},
            {'id' : 3 , 'name' : '체리', '설명' : {'당도' : 1.4 , '가격' : 40000 }},
            {'id' : 4 , 'name' : '토마토', '설명' : {'당도' : 0.8 , '가격' : 8000 }},
            {'id' : 5 , 'name' : '멜론', '설명' : {'당도' : 1.4 , '가격' : 60000 }},
            {'id' : 6 , 'name' : '바나나', '설명' : {'당도' : 1.7 , '가격' : 6000 }},
            {'id' : 7 , 'name' : '망고', '설명' : {'당도' : 2.3 , '가격' : 30000 }},
            {'id' : 8 , 'name' : '수박', '설명' : {'당도' : 1.7 , '가격' : 32000 }},
            {'id' : 9 , 'name' : '복숭아', '설명' : {'당도' : 1.3 , '가격' : 35000 }}
         ]

# 기준점
criteria_min = 1.0
criteria_max = 2.0

# 필터링
filtered_fruits = [
                     fruit['name'] for fruit in fruits 
                     if criteria_min <= fruit['설명']['당도'] <= criteria_max
                  ] 

# 출력
for filtered_fruit in  filtered_fruits :
   print(f'과일이름 : {filtered_fruit}')
   

02. 람다함수

2-1 제일비싼 과일, 제일싼 과일 이름 출력
# 표본
fruits = [
            {'id': 1, 'name': '사과', '설명': {'당도': 1.5, '가격': 35000}},
            {'id': 2, 'name': '파인애플', '설명': {'당도': 1.3, '가격': 12000}},
            {'id': 3, 'name': '체리', '설명': {'당도': 1.4, '가격': 40000}},
            {'id': 4, 'name': '토마토', '설명': {'당도': 0.8, '가격': 8000}},
            {'id': 5, 'name': '멜론', '설명': {'당도': 1.4, '가격': 60000}},
            {'id': 6, 'name': '바나나', '설명': {'당도': 1.7, '가격': 6000}},
            {'id': 7, 'name': '망고', '설명': {'당도': 2.3, '가격': 30000}},
            {'id': 8, 'name': '수박', '설명': {'당도': 1.7, '가격': 32000}},
            {'id': 9, 'name': '복숭아', '설명': {'당도': 1.3, '가격': 35000}}
         ]

# 표본추출
filtered_fruits = [
                    fruit for fruit in fruits
                    if '가격' in fruit['설명']
                  ]

# 필터링
most_expensive_fruit = max(filtered_fruits, key=lambda x: x['설명']['가격'])['name']
cheapest_fruit = min(filtered_fruits, key=lambda x: x['설명']['가격'])['name']

# 출력
print(f'제일 비싼 과일: {most_expensive_fruit}')
print(f'제일 싼 과일: {cheapest_fruit}')
2-2 문자열 길이로 리스트 순서정렬

# 표본
target = ['  cat ', ' tiger ','    giraffe     ',' alligator    ', 'penguin','    dog', 'snake   ']


# 공백제거
filtered_target = [t.strip() for t in target]



# 정렬
sorted_target = sorted(filtered_target, key=lambda str : len(str.strip()))


# 출력
print(f'문자길이 정렬결과 : {sorted_target}')

03. 멜론 인기차트 크롤링

3-1 셀레니움 사용
import time
from selenium.webdriver.common.by import By
from selenium import webdriver
from bs4 import BeautifulSoup




# 드라이버 로딩
driver = webdriver.Chrome()

# 크롤링 주소지정
driver.get('https://www.melon.com/chart/month/index.htm')


# 브라우저 종료 전에 5초 동안 잠시 대기
time.sleep(1)

# 태그 가져와서 클릭()
selector = driver.find_element(By.CSS_SELECTOR,'#conts > div.calendar_prid > div > button')
selector.click()

# 실제로 글자를 입력하기 위해 잠시멈춤
time.sleep(1)

# 1월버튼
for i in range(1,6+1) :

    month = driver.find_element(By.CSS_SELECTOR,f'#conts > div.calendar_prid > div > div > dl > dd.month_calendar > ul > li:nth-child({i}) > a')
    month.click()

    # 로딩용 멈춤
    time.sleep(1)

    # 2,3 절차진행
    html = driver.page_source# 바뀐 html가져오기
    # 파싱하기
    soup = BeautifulSoup(html,'html.parser')
    #  원하는 정보 선택하기
    titles = soup.select('.lst50 .rank01 a')
    artists = soup.select('.lst50 .rank02 > a')

    for j in range(50) :
        # print(titles[i].text)
        # print(artists[i].text)
        print(f'{titles[j].text} - {artists[j].text}')

# 브라우저 종료
driver.quit()
3-2 리퀘스트와 뷰티풀 수프사용
import requests
import csv
from bs4 import BeautifulSoup

# 지난시간에 했던 크롤링
def crawl_melones():
    # 1. requests 모듈로 웹 주소에 요청을 보내고 응답으로 HTML을 받아옴
    headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'}

    response = requests.get('https://www.melon.com/chart/month/index.htm?classCd=GN0000&moved=Y&rankMonth=202306')


# 2. 응답 (문자열) - > html 구조로 변환
    soup = BeautifulSoup(response.text , 'html.parser')


    # 3. 변환한 데이터에서 .select 써서 원하는 태그 추출
    tags = soup.select('.lst50 td')

    # 4.add()
    result = [['순위','노래제목','가수']]
    for tag in tags :
        print(tag)

        rank = tag.select('.rank')[0].text
        title = tag.select('a title')[0].text.strip()
        artist = tag.select('.writing')[0].text.strip()
        
        result.append([rank,title,artist])
        
        # 5. csv 로 저장하는 작업
        with open('melon_chart.csv','a',encoding='utf-8-sig',newline='') as f :
            writer = csv.writer(f)
            writer.writerows(result) # melon_chart.csv에다가...
            
crawl_melones()            

04. 파이썬 API활용

미세먼지API이용하여 데이터 수집(수업내용 수정하여 적용)
import requests
import csv
import json


search_city =input("도시를 입력하세요 :\n")

params = {
	'serviceKey': 'v6PZedo0OjiH84tKhGwXk8GpKTqVAbkYOrvk0crJjrGW7mJALzmAw0YQKf4csjvmkJcYhdAo0RtTLPrIBF66qQ==', ##디코딩키
	'returnType': 'json',
	'numOfRows': '100',
	'pageNo': '1',
	f'sidoName': {search_city},
	'ver': '1.0',
}

try:
    response = requests.get('http://apis.data.go.kr/B552584/ArpltnInforInqireSvc/getCtprvnRltmMesureDnsty', params=params)
    data = json.loads(response.text)  # 문자열

    airinfo_list = data['response']['body']['items']

    result = [['측정소명', '시/도명', '미세먼지 수치']]
    for airinfo in airinfo_list:
        result.append([airinfo['stationName'], airinfo['sidoName'], airinfo['pm25Value']])

    # 저장작업CSV
    with open('airinfo.csv', 'w', encoding='utf-8-sig', newline='') as f:
        writer = csv.writer(f)
        writer.writerows(result)
        print(result)
        print('파일쓰기완료')

except Exception as e:
    print('파일쓰기실패:', str(e))


📜한주를 마치며

3주차도 열심히 파이썬 복습과 실습을 했다.
이번주는 파이썬 기초를 활용한 수업이 많아서 단순 복습보다는 더 흥미롭게 진행하였다.
크롤링 부분까지는 아직 괜찮은것 같은데 앞으로 가져온 데이터를 분석하고 활용하는 단계로 넘어가야할 지점에서 어떤 스탠스를 취해야 할지가 걱정이다.
어떻게든 확률통계 수학지식을 다져야하는데 생각보다 진행이 빨리 안되는것이 조금 답답하다.
어찌되었건, 다음주는 첫번째 프로젝트기간이다.
2주간 학습&복습 한 내용을 토대로 프로젝트를 잘 진행하기 위해서는 다시한번 배운 내용들을 복습하고 프로그램 짜보는 시간이 필요할것같다.

profile
오늘도 꾸준히 무언가를 개발하는중...

0개의 댓글

관련 채용 정보