-
SKN Family AI 15기 5월 4주차 회고(1)기록../SKN Family AI 15기 2025. 5. 20. 17:06
✍️5월 20일 학습 내용
- 환경 설정(miniconda, jupyternotebook 환경에서 진행)
- 파이썬의 변수명
- 문자(a~Z) 또는 언더바(_)로 시작함
- 숫자로 시작할 수 없음
- 특수 문자가 들어가지 말아야 함
- 한 번 만들어진 변수엔 재할당 할 수 있음
- 파이썬은 인터프리터 언어로 변수 선언 시에 자료형을 정해주지 않아도 OK.
- 동적 타이핑(Duck Typing)
파이썬 자료형
- 숫자형(int, float, double)
- 숫자의 공학적 표기로 매우 크거나 매우 작은 숫자를 편하게 표현할 수 있다. (e5/e-6)
- 시퀀스형(문자열, 리스트, 튜플, 딕셔너리)
- 시퀀스형은 인덱스를 통해 접근 가능한 데이터이다.
- 불리언형(True/False)
- 비교 연산자 ( == / != / > / < / >= / <=)
- 논리연산자(and/or/not)
- 식별 연산자(int/not in/is/ is not)
- 비교 연산자와 다르게 동일한 객체(메모리주소)인가를 확인함
문자열과 메서드
- format함수 : 문자열의 동적인 할당
- 문자열 안에서 동적으로 글자를 할당하고 싶을 때 사용
text = "hello {}!" text.format("korea") # {} 부분에 korea 라는 단어가 들어가게 됨 new_str = "hello {}! Nice to meet {}." text.format("Korea", "You") # {}에 순차적으로 단어가 들어가게 됨 print (f"string {x}") # {} 자리에 지정한 변수가 들어가게 됨
List 자료형과 시퀀스 순회(for 문을 활용!)
- 시퀀스 자료형
- 다른 자료형을 여러개 포함할 수 있음.
- 리스트 슬라이싱
- [n:m] → n부터 m-1까지 출력
- [n:] / [:m] n부터 끝까지 / 0부터 m-1까지 출
- [n:m:s] n부터 m-1까지 s칸씩 띄어서 출력
- 음의 인덱스의 이해 : index[len-1]=index[-1]
- 스텝을 음의 경우로 나타낼 경우 역순으로 출력함
- in을 사용하여 해당하는 객체가 리스트 안에 들어있는지 확인할 수 있음
price_1 = 5000 minute_1 = 20 price_2 = 100 minute = 1 for name in korea: if name in ["김ㅇㅇ","박ㅁㅁ","이ㅇㅇ"]: print(f"\\n 김미영 팀장입니다. {name}님 께서는 {price_2}억원까지 {minute}분이내 통장입금 가능합니다. \\n") else: print(f"김미영 팀장입니다. {name}님 께서는 {price_1}만원까지 {minute_1}분이내 통장입금 가능합니다.") #korea 리스트를 돌면서 이름이 "김ㅇㅇ","박ㅁㅁ","이ㅇㅇ"인 사람들은 다른 문장을 출력함.- 파이썬의 연산자
- 덧셈 (+)
- 뺄셈 (-)
- 곱셈 (*)
- 나눗셈 (/)
- 정수 나눗셈 (몫) (//)
- 나머지 (%)
- 거듭제곱 (*)
for x in range(0,20): if x % 2 == 0: print(x) #짝수만 출력하기- 이중 반복문
for x in range (2,4): for y in range(1,5): print(f"{x} * {y} = {x*y}") 2 * 1 = 2 2 * 2 = 4 2 * 3 = 6 2 * 4 = 8 3 * 1 = 3 3 * 2 = 6 3 * 3 = 9 3 * 4 = 12- 주요 리스트 메서드
메서드 주요 기능 / 주의점
append(item) 끝에 단일 요소 추가 insert(index, item) 지정 위치에 단일 요소 삽입 extend(iterable) 끝에 iterable의 모든 요소 추가 remove(value) 첫 번째 값 제거 (ValueError) pop(index=-1) 지정 위치 요소 제거 및 반환 (IndexError) clear() 모든 요소 제거 index(value, ...) 값이 없으면 ValueError count(value) 없으면 0 반환 sort(key=.., rev=..) 리스트 제자리 정렬 (TypeError) reverse() 리스트 순서 제자리 뒤집기 copy() 원본과 독립적인 복사본 생성 (내부 객체 공유) - 리스트 컴프리헨션
- 리스트를 축약하여 표현할 수 있음
- 간단하고 알아보기 쉬운 Python 식의 표현
tmp_2 = [ x for x in range(10) ] #리스트 컴프리헨션 tmp_2 결과 : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # 축약하여서 리스트를 추가할 수 있다. temp3 = [ x for x in range(10) if x%2 == 0] temp3 결과 : [0, 2, 4, 6, 8]
✍️5월 21일 학습 내용
request를 통해 웹 자료 다루기
import requests url = "<https://www.starbucks.co.kr/store/getStore.do?r=86N465IIB2>" payload = {"in_biz_cds": "0", "in_scodes": "0", "ins_lat": "37.4745", "ins_lng": "126.8918", "search_text": "", "p_sido_cd": "01", "p_gugun_cd": "", "in_distance": "0", "in_biz_cd": "", "isError": "true", "searchType": "C", "set_date": "", "all_store": "0", "T03": "0", "T01": "0", "T27": "0", "T12": "0", "T09": "0", "T30": "0", "T05": "0", "T22": "0", "T21": "0", "T36": "0", "T43": "0", "Z9999": "0", "T64": "0", "T66": "0", "P02": "0", "P10": "0", "P50": "0", "P20": "0", "P60": "0", "P30": "0", "P70": "0", "P40": "0", "P80": "0", "whcroad_yn": "0", "P90": "0", "P01": "0", "new_bool": "0", "iend": "1000", "rndCod": "XW4W0LA4X8",} r = requests.post(url, data=payload) star = r.json() #서울시 스타벅스 매장 정보를 딕셔너리로 받아올 수 있다.star=star['list'] star #매장 정보를 출력함. (주피터 lab에서 실행시 렉 주의!!)for name in star: #star = star['list']를 잊지 말아야 합니다 if name['s_name'][-1] == "R": print(name['s_name']) #각 매장 이름의 패턴을 이용하여 원하는 매장 이름만 출력할 수도 있다.딕셔너리 - 키와 값
- 딕셔너리는 키와 값을 가지는 자료형. {}로 표기한다.
- JSON과 같은 양식을 가지고 있음
temp = {} for x in "abcdeaae": if x in temp: temp[x] = temp[x]+ 1 #키는 중복으로 있을 수 없기 때문에, 다음의 코드는 중복의 키를 만나면 키에 값이 있다고 판단하고 그 값을 1 더해줌. else: temp[x] = 1 # abcdeaae를 키로 두고고, 각 키에 1이라는 값을 할당함.실행 결과 {'a': 3, 'b': 1, 'c': 1, 'd': 1, 'e': 2}😆응용
각 구군 별로 몇 개의 스타벅스 매장이 있는지 조사해보자!
gugun_list = {} #각 구군 별 매장 개수를 저장할 딕셔너리를 정의합니다. for x in star:#리스트화 시킨 star을 순회하면서 검색합니다. if x['gugun_name'] in gugun_list: gugun_list[x['gugun_name']] +=1 #중복되는 키가 있다면, 그 키에 대한 값을 +1 시켜줍니다. else: gugun_list[x['gugun_name']]=1 #만약 검색한 이름이 현재 딕셔너리에 없다면 새로운 키로 만들어주고, 그 값을 1로 설정합니다.출력 결과
{'강남구': 96, '강북구': 7, '강서구': 32, '관악구': 13, '광진구': 19, '금천구': 14, '노원구': 15, '도봉구': 7, '동작구': 13, '마포구': 37, '서대문구': 21, '서초구': 52, '성북구': 17, '송파구': 37, '양천구': 17, '영등포구': 41, '은평구': 16, '종로구': 40, '중구': 50, '강동구': 20, '구로구': 14, '동대문구': 14, '성동구': 15, '용산구': 25, '중랑구': 9} #강남구에 이렇게 많은 스벅 매장이...문자열 메서드
- 주요 문자열 메서드
- split(): 문자열을 리스트로 분리.
- join(): 문자열 리스트를 하나의 문자열로 결합.
- replace(): 부분 문자열을 찾아 다른 문자열로 교체.
- find() : 해당 문자열이 시작되는 인덱스 값을 검색.
- index(): 부분 문자열의 위치 검색.
- upper() / lower(): 대소문자 변환.
- strip() / lstrip() / rstrip(): 양쪽 또는 한쪽 끝의 특정 문자 제거.
- count(): 부분 문자열의 출현 횟수 계산.
- startswith() / endswith(): 문자열의 시작 또는 끝 패턴 확인.
😆응용
split() 함수를 이용하여 가사에서 가장 많이 쓰인 단어가 무엇인지 출력해보자.
- 조건 : 한 음절의 단어는 제외!
lyrics = """따사로운 햇살 속에서 종소리가 울려 퍼지네 뺨을 매만지는 바람 한숨만은 깊어져만 가고 저 멀리서 핑 도는 눈물 이름을 붙여준 내일 포개어지는 미래 빛 라인 천진난만한 이런 기분도 신이 나서 날아갈 정도로 웃었던 날도 사랑스럽고 소중하게 키울 수 있도록 어렵고 힘들었던 시간을 넘어서 아주 많은 처음을 주었잖아 이어져 가서는 닿기를 천진난만한 이런 기분도 신이 나서 날아갈 정도로 웃었던 날도 사랑스럽고 소중하게 키울 수 있도록 어렵고 힘들었던 시간을 넘어서 아주 많은 처음을 주었잖아 이어져 가서는 천진난만한 이런 기분도 신이 나서 날아갈 정도로 웃었던 날도 사랑스럽고 소중하게 키울 수 있도록 어렵고 힘들었던 시간을 넘어서 아주 많은 처음을 주었잖아 이어져 가서는 이어져 가서는 닿기를""" #여러 줄의 문자열을 표현하기 splited_lyrics = lyrics.split()phrase = {} for x in splited_lyrics: if len(x) <=1: pass else: if x in phrase: phrase[x]+=1 else: phrase[x]=1 phrase_list = **sorted**(phrase.items(),key=lambda x: x[1], reverse=True) print(phrase_list[:10]) [('이어져', 4), ('가서는', 4), ('천진난만한', 3), ('이런', 3), ('기분도', 3), ('신이', 3), ('나서', 3), ('날아갈', 3), ('정도로', 3), ('웃었던', 3)]- sorted() : 리스트 내용물을 오름차순으로 정렬함.
- key=lambda x: x[1] : 이것을 사용하면 값을 기준으로 정렬하게 됩니다.
find() 함수를 사용하여 가산시에 있는 스타벅스 지점을 알아보자!
for addr in star: if addr['addr'].find("가산")>-1: #find()함수는 부재할 경우 -1을 반환합니다. print(addr['addr'], addr['addr']) ''' 혹은 이런 방법도 있다. if '가산' in addr['addr'] '''사용자 함수 정의하기
- 사용자 함수를 정의하기 위해서는 def라는 키워드를 사용한다.
def get_starbucks(dong): #함수 기능 for addr in star: if addr['addr'].find(dong)>-1: print(addr['addr'], addr['addr']) #동 이름을 매개변수로 받아 해당 지역의 스타벅스 지점을 출력한다.- 안에서 처리한 결과는 보통 return을 통해 반환한다.
- return을 만나면 함수는 더 진행되지 않기 때문에, return 아래 구문은 실행되지 않는다.
- 전달해야하는 파라미터 개수가 맞지 않으면, 에러가 발생하기 때문에 주의.
def multi(x,y): return x*y result = multi(3,4) print(result) #결과 : 12😆BMI 지수를 계산하는 함수를 만들어보자
#BMI 계산법: 몸무게(kg) / (키(h)*키(h)) def BMI_calculator(height, weight): height *= 0.01 #키가 cm 단위로 들어오기 때문에, m로 변환! BMI= weight / height**2 return BMIBMI_calculator(158,52)import로 모듈 불러오기
import로 datetime 모듈을 불러와 사용하기
import datetime for day in range(100,1001, 100): #오늘로부터 100일, 200일, 300일... 1000일 뒤의 날짜를 출력해주는 프로그램 print(datetime.datetime.today() + datetime.timedelta(days=day), end=" --> ") #해당 날의 요일을 출력 (0:월~ 6:일) print((datetime.datetime.today() + datetime.timedelta(days=day)).weekday())datetime.datetime.strptime(x['open_dt'], "%Y%m%d").weekday() # 오픈 날짜의 요일을 출력하는 코드응용!
datetime을 이용해서 어느 요일에 가장 자주 오픈했는지 확인하기
#나의 코드 weekday_list = {} week_name = ['월','화','수','목','금','토','일'] for w in star_list: open_date = datetime.datetime.strptime(w['open_dt'], "%Y%m%d") week_day = week_name[open_date.weekday()] if week_day in weekday_list: weekday_list[week_day]+=1 else: weekday_list[week_day]=1- 강사님 코드(참고)
weekday_list = {} week_name = ['월','화','수','목','금','토','일'] for w in star_list: week_name = dict(zip(range(0,7), "월화수목금토일"))[datetime.datetime.strptime(w['open_dt'], "%Y%m%d").weekday()] if week_name in weekday_list: weekday_list[week_name]+=1 else: weekday_list[week_name]=1경로
절대경로와 상대경로
'c:\\User\\Myname\\workspace\\a.txt' #절대경로 '.\\a.txt' #상대경로 내가 현재 탐색하고 있는 위치에서 상대적으로 표현한 것이 상대경로임.Pickle
파이썬에서 제공하는 객체 저장 모듈
- pickle은 데이터를 직렬 형식으로 저장하는 형식: 파이썬 객체를 그대로 저장할 수 있다.
- 확장자명은 .pkl
- pickle 파일을 불러오는 코드
import pickle with open("C:\\\\Users\\\\Playdata\\\\workspace\\\\data\\\\kbo_2024.pkl","rb") as f: kbo = pickle.load(f) #절대경로 방식 with open("./data/pkl","rb") as f: kbo = pickle.load(f) #상대경로 방식 #\\는 기본적으로 이스케이프 문자이다. 그러나 윈도우는 파일 주소체계로 백슬래시를 사용한다. # 이경우 백슬래쉬를 두 번 작성하나 주소 앞에 r을 붙여서 이스케이프 문자가 아닌라는 것을 상기시켜주면 좋다. kbo #파일을 확인해보면 리스트 객체가 리스트 형태로 저장되어 있음을 확인할 수 있다.- 현재 작업중인 경로 확인하기
pwcd import os os.getcwd()- 상위 폴더로 이동하기
with open("../Download/kbo.pkl", "r", encoding = "utf-8") as f: #상위 폴더로 이동하여 Download폴더로 이동하는 코드- CSV 파일 열기
with open(r"C:\\Users\\Playdata\\workspace\\data\\kbo.csv", "r", encoding = "utf-8") as f: kbo = f.read() #utf-8: 이 파일은 한글로 작성되었다. kbo응용! zip() 이용해서 선수 프로필 딕셔너리로 만들기
col =kbo.split("\\n")[0].split(",") ''' 한 행씩 분리한 다음,첫번째 행(=head)만 추출하여 다시 그 한 행을 쉼표(속성)를 기준으로 분리한다 ''' kbo_list = [] for x in kbo.split("\\n")[1:-1]: kbo_list.append(dict(zip(col, x.split(",")))) #zip을 활용하여 선수별 프로필을 딕셔너리 형태로 완성한다.응용! 선수들의 신장/체중 데이터로 bmi 계산하기
col =kbo.split("\\n")[0].split(",") #첫줄 = 속성 kbo_list2 = [dict(zip(col, x.split(","))) for x in kbo.split("\\n")[1:-1]] for player in kbo_list2: height, weight = player['신장/체중'].split("/") #신장/체중 key를 각각 split 하여 각각 다른 키로 만든다. height = height.replace("cm", "")#뒤에 있는 단위를 지운다. weight = weight.replace("kg", "") try: player['weight'] = int(weight) player['height'] = int(height)#int로 형변환 except: player['weight'] = '' #데이터가 없거나 int로 바꿀 수 없는 경우, 데이터 내용을 아예 삭제. player['height'] = '' bmi_list = [] for player in kbo_list2: try: h = player['height'] w = player['weight'] bmi = BMI_calculator(h,w) name = player['선수명'] print(f"{name} 선수 의 BMI 지수는 {bmi} 입니다.") except: pass'기록.. > SKN Family AI 15기' 카테고리의 다른 글
SKN Family AI 15기 6월 3주차 회고 (0) 2025.06.24 SKN Family AI 15기 6월 2주차 단위 프로젝트 회고 (0) 2025.06.15 SKN Family AI 15기 6월 1주차 회고 (1) 2025.06.08 SKN Family AI 15기 5월 5주차 회고 (0) 2025.05.27 SKN Family AI 15기 5월 4주차 회고(2) (0) 2025.05.23