728x90
반응형
지난 시간 리뷰 문제

(Pandas를 활용한 데이터 분석 문제)
목표: 공공데이터 포털에서 '따릉이' 데이터를 다운로드하여 Pandas를 사용해 데이터를 분석하고, 특정 조건에 맞는 정보를 추출하는 퀴즈 수행 

   데이터소스:
   1. 공공데이터 포털에 접속
   2. 검색창에 따릉이 검색
   3. 검색 결과에서 첫번째로 나오는 엑셀파일 다운로드
   4. df = pd.read_csv('bicycle.csv', encoding = 'cp949')
   주요 작업:
   1. Pandas를 사용하여 다운로드한 '따릉이' 데이터를 읽어들임
   2. 다음과 같은 데이터 처리를 진행:
     - 대여소명에서 숫자를 제거하여 새로운 열에 저장 
     - 대여시간대를 '새벽' '아침' '점심' '저녁' '밤'으로 분류하여 새로운 열에 저장. (apply 함수 활용)
   3. 생성된 새로운 열들을 이용하여 각 대여소명별로 가장 많은 대여가 일어난 시간대를 집계 (groupby와 value_counts 활용)
   4. 신촌동의 [점심] 자전거 대여 수를 파이그래프로 나타내기

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('bicycle.csv',encoding = 'cp949')
# print(df)
#            기준_날짜 집계_기준  기준_시간대 시작_대여소_ID  ...     종료_대여소명 전체_건수 전체_이용_분  전체_이용_거리
# 0       20240119  출발시간       0   ST-1035  ...   구산동_062_1     1      10      1182
# 1       20240119  출발시간       0   ST-1036  ...   역촌동_068_1     1       4       641
# 2       20240119  출발시간       0   ST-1085  ...  문정2동_032_1     1       0         0
# 3       20240119  출발시간       0   ST-1085  ...  가락본동_025_2     1      10      2090
# 4       20240119  출발시간       0   ST-1092  ...  성내1동_007_1     1       6      1130
# ...          ...   ...     ...       ...  ...         ...   ...     ...       ...
def dong(row):
    if row['시작_대여소명']:
        row['시작_대여소명'].split('_')[0]

df['가공된_대여소명'] = df.apply(dong,axis=1)
# print(df)
#            기준_날짜 집계_기준  기준_시간대 시작_대여소_ID  ... 전체_건수 전체_이용_분 전체_이용_거리  가공된_대여소명
# 0       20240119  출발시간       0   ST-1035  ...     1      10     1182      None
# 1       20240119  출발시간       0   ST-1036  ...     1       4      641      None
# 2       20240119  출발시간       0   ST-1085  ...     1       0        0      None
# 3       20240119  출발시간       0   ST-1085  ...     1      10     2090      None
# 4       20240119  출발시간       0   ST-1092  ...     1       6     1130      None
# ...          ...   ...     ...       ...  ...   ...     ...      ...       ...

def changeTime(row):
    if row['기준_시간대'] == 0 :
        time = row['기준_시간대']
        if 0 <= time and time < 500:
            return "새벽"
        elif 500 <= time and time < 1000:
            return "아침"
        elif 1000 <= time and time < 1600:
            return "점심"
        elif 1600 <= time and time < 2000:
            return "저녁"
        else:
            return "밤"
df['가공된_대여소명'] = df.apply(dong,axis=1)
df['가공된_시간'] = df.apply(changeTime,axis=1)

print(df)
#            기준_날짜 집계_기준  기준_시간대 시작_대여소_ID  ... 전체_이용_분 전체_이용_거리 가공된_대여소명  가공된_시간
# 0       20240119  출발시간       0   ST-1035  ...      10     1182     None    None
# 1       20240119  출발시간       0   ST-1036  ...       4      641     None    None
# 2       20240119  출발시간       0   ST-1085  ...       0        0     None    None
# 3       20240119  출발시간       0   ST-1085  ...      10     2090     None    None
# 4       20240119  출발시간       0   ST-1092  ...       6     1130     None    None
# ...          ...   ...     ...       ...  ...     ...      ...      ...     ...

times_groupby_places = df.groupby('가공된_대여소명')['가공된_시간'].value_counts()
print(times_groupby_places)
sinchon_data = times_groupby_places['신촌동']

plt.rcParams['font.family'] = 'Malgun Gothic'
sinchon_data.plot(kind='pie',autopct='%1.1f%%')

 

Day 19

웹크롤링이란?

인터넷에 있는 웹페이지를 자동으로 탐색하고 정보를 수집하는 과정.
이를 수행하는 소프트웨어를 Crawler, 또는 Spider라고 함.

웹크롤링이 왜 필요한가?
- 대량의 유용한 데이터 수집이 가능하고
- 웹사이트의 컨텐츠를 검색엔진에 인덱싱하여 최적화 가능
- 웹사이트 분석, 고객 리뷰 수집 등 시장조사에 활용 가능




HTML 태그 (Tags)
 - 웹 페이지의 기본 구성 요소
 - <태그이름> 형식으로 작성되며, 대부분의 태그는 시작태그 와 종료 태그 로 구성됨
 - 예)

는 단락 (paragraph)을 나타내는 태그



id 속성
 - HTML 요소에 고유한 식별자를 제공
 - 페이지 내에서 유일해야 하며, 주로 JAVASCRIPT나 CSS에서 요소를 식별할 때 사용됨
 - 예)



class속성
 - HTML요소에 하나 이상의 클래스를 지정
 - 같은 스타일을 공유하는 여러 요소에 사용되며, CSS에서 스타일을 적용하거나 JAVASCRIPT에서 요소를 선택할 때 유용함
 - 예) 는 "HIGHLIGHT" 클래스를 가진 span 요소로 나타냄


가장 많이 쓰이는 웹크롤링용 파이썬_라이브러리는 beautiufulsoup4

 

beautifulsoup4 사용법 

from bs4 import BeautifulSoup
import requests

url = "https://finance.naver.com/sise/"
response = requests.get(url)
response.encoding = 'cp949'
print(response.text)
html = response.text
soup = BeautifulSoup(html,'html.parser')

itemList = soup.find(id = "popularItemList")
li_list = itemList.find_all('li')

stockList=[]
for i in li_list :
    stockList.append({'company':i.find('a').text,'price':i.find('span').text})
print(stockList)

주요 메소드

1. find(): 특정 태그를 찾는 데 사용됨. 첫 번째로 발견된 해당 태그의 내용을 반환
2. find_all(): 특정태그를 모두 찾는 데 사용됨, 해당 태그가 여러개 있을 때 모든 결과를 리스트 형태로 반환함
3. get_text(): 태그 안의 텍스트 내용만을 추출
4. get(): 특정 속성의 값을 추출. 주로 링크나 이미지의 url을 가져오는 데 사용됨 

반응형
728x90
반응형
Day 18
판다스 (Pandas) Groupby 함수

판다스에서의 GroupBy 쉽게 이해하기
: 그룹화는 데이터를 쉽게 이해하기 위해 비슷한 특성을 가진 것들을 모으는 것 (ex. 학교에서 학생들을 '좋아하는 과목'에 따라 그룹으로 나눠 볼 수 있음) 
판다스에서도 이런 그룹화가 가능하며, 만약 학생들의 데이터가 있고, '이름' '학년' '좋아하는 과목' 열이 있다면, '좋아하는 과목'을 기준으로 그룹화 할 수 있음. 
이렇게 그룹화를 하면, 각 과목을 좋아하는 학생들의 평균 성적이나, 각 학년별로 어떤 과목이 인기 있는지 알아볼 수 있으며, 이런 분석을 통해 데이터에 숨겨진 패턴을 발견할 수 있음

(GroupBy 예시)

import pandas as pd
import random
from faker import Faker
faker = Faker ('ko_KR') #한글이름 랜덤 불러오기

# name, ages, genders, movies, payment methods, snacks, drinks, times

ageList = [20,30,40,50,60] #연령대 설정
agePercent = [30,30,20,15,5]  #연령대 비율 설정
genderList = ['m','f']
movieList = ['웡카','시민덕희','도그맨','너의 이름은','외계인']
moviePercent = [40,10,5,5,40]  #영화 시청률 설정
paymentsList = ['현금','체크카드','신용카드','카카오페이','네이버페이']
paymentsPercent = [5,30,35,20,10]
snackList = ['선택안함','일반','캬라멜','나초','오징어','맛밤']
snackPercent = [40,10,20,15,10,5]
drinkList = ['선택안함','콜라','제로콜라','물','에이드','스프라이트','오렌지주스']
drinkPercent = [30,10,20,10,10,15,5]
timeList = ['조조','일반','심야']
timePercent = [20,70,10]

data = {
    'name': [faker.name() for i in range (500)],
    # faker에서 이름을 500개 만들기
    'ages':[random.choices(ageList, weights=agePercent, k=1) for i in range (500)],
    # ageList에서 500개 랜덤 초이스 & agePercent가중치 적용하기, k=1은 결과의 첫번째를 뽑는걸로 설정
    'genders': [genderList[random.randint(0,1)] for i in range(500)],
    'movies': [random.choices(movieList, weights=moviePercent, k=1) for i in range (500)],
    'payments': [random.choices(paymentsList, weights=paymentsPercent, k=1) for i in range (500)],
    'snacks': [random.choices(snackList, weights=snackPercent, k=1) for i in range (500)],
    'drinks': [random.choices(drinkList, weights=drinkPercent, k=1) for i in range (500)],
    'times': [random.choices(timeList, weights=timePercent, k=1) for i in range (500)],
}

df = pd.DataFrame(data)

pd.read_csv('cgv.csv')
print(df.shape) #행과 열의 수
print(df.index) #행 정보
print(df.columns) #열 정보
print(df.values)  #데이터
print(df.head(20)) #위에서 20개 가져오기
print(df.tail(20)) #뒤에서 20개 가져오기
print(df.describe()) #전체 데이터 요약본
    #       name  ages genders movies payments  snacks  drinks times
    #count   500   500     500    500      500     500     500   500
    #unique  408     5       2      5        5       6       7     3
    #top     김진호  [30]       f   [웡카]   [신용카드]  [선택안함]  [선택안함]  [일반]
    #freq      5   160     260    205      169     190     161   359

#--------------------------
# group_by:  기준 잡기
#
group_by_movies = df.groupby('movies') # 영화별로 그룹핑
ages_group_by_movies = group_by_movies['ages'].value_counts()
print(ages_group_by_movies)
group_by_times = df.groupby('times')
print(group_by_times.value_counts())
drinks_group_by_times = group_by_times['drinks'].value_counts()
print(drinks_group_by_times)

#나이대별로 지불 그룹핑
group_by_ages = df.groupby('ages')
payments_group_by_ages = group_by_ages['payments'].value_counts()
print(payments_group_by_ages)
#영화별로 스낵 그룹핑
group_by_movies = df.groupby('movies')
snacks_group_by_movies = group_by_movies['snacks'].value_counts()
print(snacks_group_by_movies)
#시간대별로 영화 그룹핑
group_by_times = df.groupby('times')
movies_group_by_times = group_by_times['movies'].value_counts()
print(movies_group_by_times)

 

판다스 (Pandas) Apply 함수

판다스에서의 Apply 함수 쉽게 이해하기
: 판다스의 DataFrame에서 'apply'함수를 사용하면, 사용자가 정의한 함수를 각 행이나 열에 적용할 수 있음. 예를 들어, 학생들의 성적 데이터가 있고 '수학' '영어' '과학' 열이 있다면, 각 학생의 평균 성적을 계산하기 위해 apply 함수를 사용할 수 있음. 
이렇게 apply 함수를 활용하면, 데이터셋의 각 행이나 열에 복잡한 연산을 쉽고 빠르게 적용할 수 있음. 또한, 이를 통해 데이터를 더 깊이 분석하고 의미있는 인사이트를 얻을 수 있음. 이러한 분석은 데이터를 더 효과적으로 이해하고 활용하는 데 도움이 됨. 

(Apply함수 예시)

import pandas as pd
# apply : 새로운 열 만들기

df = pd.read_csv('cgv.csv')
def recommendPopcornForSenior(row):
    if row['ages']==50 and row['snacks']=='일반':
        return '할인 대상'
    else:
        return '할인 없음'

#    name  ages genders      movies  ...    snacks     drinks   times 50대 할인 이벤트
#0    이예은  [30]       f     ['외계인']  ...   ['캬라멜']   ['제로콜라']  ['일반']      할인 없음
#1    김영식  [30]       f    ['시민덕희']  ...    ['일반']   ['선택안함']  ['조조']      할인 없음
#2    박도현  [50]       m     ['외계인']  ...  ['선택안함']  ['스프라이트']  ['일반']      할인 없음
#3    배지훈  [30]       m     ['외계인']  ...    ['나초']   ['선택안함']  ['일반']      할인 없음
#4    이명숙  [60]       m  ['너의 이름은']  ...  ['선택안함']   ['선택안함']  ['일반']      할인 없음
#..   ...   ...     ...         ...  ...       ...        ...     ...        ...

#조조이고 체크카드를 사용하면 조조이벤트 해당됨, 해당안됨
def morningEvent(row):
    if row['times']=='조조' and row ['payments'] == '체크카드':
        return '해당됨'
    else:
        return '해당안됨'

def comboEvent(row):
    if row['snacks']=='일반' and row ['drinks'] == '제로콜라':
        return '제로콤보 세트'
    else:
        return '해당없음'

df['제로이벤트'] = df.apply(comboEvent,axis=1)
df['50대 할인 이벤트'] = df.apply(recommendPopcornForSenior,axis=1)
df['조조이벤트'] = df.apply(morningEvent,axis=1)

print(df)
#    name  ages genders      movies  ...   times 제로이벤트 50대 할인 이벤트 조조이벤트
#0    이예은  [30]       f     ['외계인']  ...  ['일반']  해당없음      할인 없음  해당안됨
#1    김영식  [30]       f    ['시민덕희']  ...  ['조조']  해당없음      할인 없음  해당안됨
#2    박도현  [50]       m     ['외계인']  ...  ['일반']  해당없음      할인 없음  해당안됨
#3    배지훈  [30]       m     ['외계인']  ...  ['일반']  해당없음      할인 없음  해당안됨
#4    이명숙  [60]       m  ['너의 이름은']  ...  ['일반']  해당없음      할인 없음  해당안됨
#
판다스 (Pandas) 데이터 시각화

  • Matplotlib 라이브러리
  • 데이터 범주형
  • 일변량 그래프
  • 이변량 그래프
  • 다변량 그래프

(일변량그래프 예시)

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('cgv.csv')
snacks_by_times = df.groupby('times')['snacks'].value_counts()
morning_time_snack = snacks_by_times['조조']

plt.rcParams['font.family'] = 'Malgun Gothic' #폰트 설정
morning_time_snack.plot.pie(autopct = '%1.1f%%') # plot.pie() 파이그래프, autopct = 소수점자리 설정
plt.show() # 보여주기

 

(이변량그래프 예시)

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.read_csv('cgv.csv')

# 1. 시간과 음료 그룹핑
# 2. 크기 계산하기 size()
# 3. 피벗 테이블화
table = df.groupby(['times','drinks']).size().unstack(fill_value=0)
print(table)
#drinks  ['물']  ['선택안함']  ['스프라이트']  ['에이드']  ['오렌지주스']  ['제로콜라']  ['콜라']
#times
#['심야']      2        18          8        4          3        16       3
#['일반']     46        98         51       32         20        76      36
#['조조']      7        19         19        7          7        19       9

plt.rcParams['font.family'] = 'Malgun Gothic'
sns.heatmap(table, cmap='coolwarm') #cmap 은 색상설정
plt.show()

반응형
728x90
반응형
지난 시간 리뷰

(REVIEW 1) 주어진 배열에 포함된 각 문자열의 길이를 카운트하고, 각 길이가 배열 내에서 몇 번 나타나는지를 계산하는 함수 작성하기. 함수는 배열을 입력으로 받고, 각 문자열 길이를 키로하고 해당 길이가 나타나는 횟수를 값으로 하는 딕셔너리를 반환해야 함.
입력 : {"apple","banana","cherry","date"}
출력: {5:2, 6:1, 4:1}

추가 지시사항: 
1. 함수의 이름은 solution으로 한다
2. 입력 배열은 문자열만 포함한다고 가정한다
3. 배열 내에 중복된 문자열이 있어도 된다

words = ["apple","banana","cherry","date"]

def solution(arr):
    # {5:2, 6:1, 4:1}
    result = {}
    for i in arr:
        length = len(i)
        if length in result:
            result[length] += 1
        else:
            result[length] = 1
    return result

a = solution(words)
print(a)  #{5: 1, 6: 2, 4: 1}

 

Day 17

어제 만든 데이터프레임 형식을 활용한 다양한 값도출 방법

df= pd.DataFrame(Data)

# shape 행과 열의 수를 돌려줌
print(df.shape)
# column 열
print(df.columns)
# values 데이터
print(df.values)
# 해당 열 뽑기
print(df.[['age','name']])
# 해당 열 뽑기 (+조건)
print(df[df['age']>30])
print(df[df['gender']=='f'])   # 여성 sort
print(df[df['gender']=='f'][df['age']==40]) # 여성 & 40세

# 행뽑기
print(df.loc[0])  #첫번째 행
print(df.loc[0],'name')  #첫번째 행, name 값

 

데이터 시각화하기

matplotlib 를 활용한 데이터 그래프화

import pandas as pd
#matplotlib 인스톨
import matplotlib.pyplot as plt
#pyplot 은 그래프화 도구모음

x = [1,2,3,4,5]
y = [20,25,30,35,40]

plt.plot(x,y)
plt.show()

 

반응형
728x90
반응형

Day 16

파이참에서 외부 라이브러리 사용하기

1. 라이브러리란 : 라이브러리는 특정 기능을 수행하는 함수나 클래스들의 모음임.
이들을 사용함으로써 개발 시간을 단축하고, 오류를 줄일 수 있음.

2. 파이참에서 라이브러리 설치하기 : 파이참에서는 프로젝트 설정을 통해 쉽게 라이브러리를 추가할 수 있음
( File > Settings > Project : [프로젝트이름] > Python Interpreter ) 로 이동하여
필요한 라이브러리를 검색하고 설치할 수 있음

3. 라이브러리 사용 : 라이브러리를 설치한 후에는 import 구문을 사용하여
코드 내에서 해당 라이브러리를 호출하고, 그 기능을 사용할 수 있음. 


초보자를 위한 추천 파이썬 라이브러리 10가지

파이썬을 활용한 QR 코드 만들기!

import qrcode

url = 'https://www.instagram.com/riize_official/'
img = qrcode.make(url)
img.save('./riize.png')

위 코드 실행하면, 왼편 폴더 아래에 파일이 저장됨!

 

파이썬을 활용한 글 읽어주기 프로그램 만들기!
from gtts import gTTS

text = "차번호 19 마 1234 차주님 제발 카운터로 와주셈"
tts = gTTS(text,lang='ko')
tts.save('result.mp3')

왼편의 파일을 바탕화면으로 옮긴 후 실행하면, mp3 파일이 바탕화면에 저장됨!

 

Pandas 배워보기


패키지 -> 인스톨
# 엑셀을 파이썬화
# 판다스 데이터 타입: series, dataframe 이 있다.
# series: 엑셀에서 하나의 열
# dataframe: 엑셀 그 자체 (스프레드시트)

(Pandas 예시 1)

import pandas as pd

numList = [5,12,24,13,17]
series = pd.Series(numList)
print(series)
# 0 5
# 1 12
# 2 24
# 3 13
# 4 17
print(series.mean())

coffee = ['아아','라떼','디카페인','바닐라','모카']
c_series = pd.Series(coffee)
print(c_series)
# 0 아아
# 1 라떼
# 2 디카페인
# 3 바닐라
# 4 모카

(Pandas 예시2)

import pandas as pd

coffeeData = {
    "menu" : ['americano','latte','mocha','vanila','mint'],
    "price" : [2500,3000,3500,3500,4000],
    "caffeine": [120,100,80,100,50]
}

df = pd.DataFrame(coffeeData)
print(df)
df.to_csv('coffee',index=False) # 엑셀로 저장! #index False 로 0 1 2 3 없애기

결과 화면

(Pandas 예시 3 - 가명 불러오기 Faker와 함께) 

import pandas as pd
from faker import Faker

fake = Faker('ko_KR')
print(fake.name())

carData = {
    'carName' : ['k5','k7','avante','k3','tesla'],
    'owner' : [fake.name() for i in range(5)]
}
print(carData)
#{'carName': ['k5', 'k7', 'avante', 'k3', 'tesla'], 'owner': ['나정호', '최현지', '김지우', '김유진', '이경수']}

df = pd.DataFrame(carData)
df.to_csv('car.csv',index=False)

결과 화면

(Pandas 예시 4)

import pandas as pd
import random
from datetime import *
from  faker import Faker

fake = Faker('ko_KR')

movieList = ['웡카','시민덕희','도그맨','너의 이름은','라라랜드','상견니','외계인']
snackList = ['일반팝콘','캬라멜팝콘','치즈팝콘','구운오징어','나초','프레즐','핫도그']
drinkList = ['콜라','제로콜라','스프라이트','환타','에이드','물']

cgvData = {
    'customers' : [fake.name() for i in range (500)],
    'movies' : [random.choice(movieList) for i in range (500)],
    'snack': [random.choice(snackList) for i in range(500)],
    'drink': [random.choice(drinkList) for i in range(500)]
    }

cgv_df = pd.DataFrame(cgvData) #위 cgv 데이터를 데이터프레임화 시키기
now = datetime.now()
cgv_df.to_csv(f"cgv.csv",index=False) #제목에 {now}가 안되서 그냥 cgv.
반응형
728x90
반응형
지난 시간 리뷰

def solution(phone_number):
    newNumber = ""
    for index,item in enumerate(phone_number):
        if len(phone_number)-4 > index:
            newNumber += "*"

        else:
            newNumber += item
    return newNumber
a = solution("01012345678")
print(a)    #*******5678

 

 

Day 15

프로그래밍에는 3대 에러가 있음

1. 컴파일 에러: 문법 오류
2. 런타임 에러: 실행중 오류
3. 컨텍스트 에러: 사람만 알 수 있는 오류 (테스터가 있는 경우)

예외 처리의 정의 (Exception)

Exception은 프로그램 실행 중에 발생하는 예기치 않은 상황이나 오류를 의미함.
Exception Handling 은 이러한 예외 상황을 감지하고, 프로그램을 안전하게 종료하거나 문제를 해결하기 위해 정의된 방식으로 처리하는 기술임. 

(try ~ except 파이썬 문법)

try 예외가 발생할 가능성이 있는 구문
except 예외가 발생하면 실행 되는 구문
else 예외가 실행되지 않으면 실행 되는 구문
finally 예외가 발생하던 발생하지 않던 무조건 실행되는 구문 

(에러가 발생 할 수 있는 경우!)

ValueError 함수가 올바른 유형의 값을 받았지만, 그 값이 올바르지 않은 경우 발생
IndexError 리스트,튜플,문자열 등의 시퀀스에서 인덱스가 범위를 벗어난 경우 발생
KeyError 딕셔너리에서 존재하지 않는 키를 검색할 때 발생
AttributeError 객체에 존재하지 않는 속성이나 메서드를 접근하려고 할 때 발생
ZeroDivisionError 숫자를 0으로 나누려고 할 때 발생
TypeError 연산이나 함수가 적절하지 않은 유형의 객체에 적용될 때 발생

(try ~ except 예시)

try:   #try는 에러가 날 것 같은 구문을 적는 곳!
    num = int(input("숫자 입력:"))
    result = 10 / num
    print(f'결과는 {result}')
except Exception:
    print('에러가 있습니다.')
try:   #try는 에러가 날 것 같은 구문을 적는 곳!
    num = int(input("숫자 입력:"))
    result = 10 / num
    print(f'결과는 {result}')
except ValueError:
    print('제발 숫자를 입력하세요.')
except ZeroDivisionError:
    print("0으로 못나눕니다.")
else:
    print('에러없습니다')
finally:
    print('상관없으니 보여주라')

 

소프트웨어 Hierarchy

컴포넌트 -> 모듈 -> 패키지 -> 라이브러리 -> 프레임워크 -> 어플리케이션

컴포넌트 : 재사용 가능한 독립적인 단위
모듈: 하나 이상의 컴포넌트를 포함하며, 상호 관련된 코드 그룹 
패키지 : 하나 이상의 모듈을 포함하며, 기능 단위로 그룹화
라이브러리 : 다른 프로그램이나 프로젝트에 호출 되는 단위 ex) Pandas, Numpy
프레임워크 : 특정 개발 작업을 위한 기본 구조 제공 ex) Flask

(import sheet)

#첫번째 예시
import my_math as mm
result = mm.add(10,10)
print(result)  #20
#두번째 예시
from my_math import add   # add function만 가져옴
result2= add(10,20)
print(result2)  #30
#세번째 예시
from my_math import *  # *는 다~가져오겠음
result3= add(1,3)
print(result3)  #4

 

(라이브러리에서 yfinance를 인스톨)
(설정 > 프로젝트 인터프리터 > 패키지 검색 & 인스톨)

import yfinance


apple = yfinance.Ticker("AAPL")
current_price = apple.info['currentPrice']
print(f"애플주식의 현재 가격: {current_price}")
# 애플주식의 현재 가격: 193.89

ms = yfinance.Ticker("MS")
current_price = ms.info['currentPrice']
print(f"마이크로소프트의 현재 가격: {current_price}")
# 애플주식의 현재 가격: 193.89
#마이크로소프트의 현재 가격: 85.73

 

반응형
728x90
반응형
지난 시간 리뷰

(class 퀵복습 - 강아지 문)

class dog:
    def __init__(self,n):
        self.name = n
    def intro(self):
        print(f"저는 {self.name}입니다.")

a = dog('킹율')
a.intro() # 저는 킹율입니다.
b = dog('흰둥이')
b.intro() # 저는 흰둥이입니다.

(class 예제 - Bank Account 문제)

class BankAccount:
    def __init__(self,account_number,owner_name):
        self.account_number = account_number
        self.owner_name = owner_name
        self.balance = 0

    def deposit(self,amount):
        if amount > 0:
            self.balance += amount
            return True
        else:
            print("금액을 잘못 입력 하였습니다. (-)불가")
            return False

    def withdraw(self,amount):
        if amount > 0 and amount < self.balance:
            self.balance -= amount
            return True
        else:
            print("금액을 잘못 입력 하였습니다.")
            return False

    def get_balance(self):
        return self.balance

    def get_account(self):
        return (f"Account: {self.account_number}, "
                f"Owner: {self.owner_name}, "
                f"Balance: {self.balance}")

def bankSystem():

    globalAccount={}

    while True:
        print("은행 계좌 시스템")
        print("1. 계좌 개설")
        print("2. 입금")
        print("3. 출금")
        print("4. 잔액 조회")
        print("5. 종료")
        systemNumber = input("선택:")

        if systemNumber == "1":
            account_number = input("계좌 번호: ")
            owner_name = input("소유자 이름: ")
            globalAccount[account_number] = BankAccount(account_number,owner_name)
            print("계좌 개설이 완료 되었습니다!")

        elif systemNumber == "2":
            account_number = input("계좌 번호: ")
            amount = int(input("입금액: "))
            if account_number in globalAccount and globalAccount[account_number].deposit(amount):
                print("입금 완료")
            else:
                print("입금 실패")

        elif systemNumber == "3":
            account_number = input("계좌 번호: ")
            amount = int(input("출금액: "))
            if account_number in globalAccount and globalAccount[account_number].withdraw(amount):
                print("출금 완료")
            else:
                print("출금 실패")

        elif systemNumber == "4":
            account_number = input("계좌번호:")
            if account_number in globalAccount:
                print(globalAccount[account_number].get_account())
            else:
                print("계좌를 찾을 수 없습니다.")
        elif systemNumber == "5":
            print("은행 계좌 프로그램 종료")
            break;


bankSystem()

------------------------------------------------------------------------------------------------------------------------------------------------

Day 14
상속과 추상
상속 (inheritance): 객체지향 프로그래밍에서 매우 중요한 개념. 상속을 통해 한 클래스 (자식)가 다른 클래스 (부모)의 속성과 메서드를 그대로 이어받을 수 있음. 이는 코드의 재사용성을 높이고, 중복을 줄여 프로그램의 구조를 더욱 효율적으로 만듬.

 

(상속의 기본 문법:)

class ParentClass:
    #부모 클래스의 메서드와 속성 정의
    pass

class ChildClass(ParentClass):
    #자식 클래스에서 추가된 메서드와 속성 정의
    pass
오버라이딩 (Overriding)
오버라이딩은 자식 클래스가 부모 클래스로부터 상속받은 메서드를 자신의 필요에 맞게 재정의하는 것을 의미함. 이를 통해 상속받은 기능을 유지하면서도, 특정 부분을 자식 클래스에 맞게 커스터마이징 할 수 있음.

오버라이딩의 특징:
(재정의): 부모 클래스의 메서드와 동일한 이름, 매개변수로 자식 클래스에서 메서드를 재정의
(확장): 부모 클래스의 기능을 유지하면서 추가적인 기능을 더할 수 있음
(다형성): 같은 메서드 이름으로 다양한 기능을 구현할 수 있어, 다형성을 실현하는데 중요한 역할을 함

 

(상속과 오버라이딩 예시)

class Monster:
    def __init__(self,hp,name,damage):
        self.hp = hp
        self.name = name
        self.damage = damage
        def attack(self,character):
            character.hp -= self.damage

class Slime(Monster):
    def __init__(self,hp,name,damage,poison):
        super().__init__(hp,name)  # 위 부모의 init(생성자)을 넣기
        self.poison = poison       # 자기의 생성자

    def attack(self, character):
        character.hp -= self.damage * 2   # overriding 예시

    def sprayPoison(self,character):
        character.hp -= self.damage + self.poison

#kim = character()

a = Slime(50,'귀여운슬라임',30,5)
a.attack(kim)
a.sprayPoison(kim)

 

 

(abstract class 예시)

from abc import ABC, abstractmethod

class Shape(ABC):

    @abstractmethod
    def get_area(self):
        pass

    @abstractmethod
    def get_round(self):
        pass

class Circle(Shape):
    def __init__(self,r):
        self.radius = r

    def get_area(self):
        return 3.14*self.radius**2
    def get_round(self):
        return 3.14*self.radius*2

class Triangle(Shape):
    def __init__(self,b,h):
        self.base = b
        self.height = h
    def get_area(self):
        return self.base * self.height * 0.5
    def get_round(self):
        return self.base * 3

class Square(Shape):
    def __init__(self,s):
        self.side = s
    def get_area(self):
        return self.side * self.side
    def get_round(self):
        return self.side * 4

a = Triangle(5,5)
print(a.get_area())   #12.5
print(a.get_round())  #15

b = Square(8)
print(b.get_area())   #64
print(b.get_round())  #32

 

객체지향프로그래밍 (OOP)
요소:
캡슐화 (encapsulation) - 데이터보호,
상속 (inheritance) - 코드 간략화,
다형성 (polymorphism) - 코드 유지보수 용이

원칙: SOLID 원칙의 소개 및 설명 (class 잘 만드는 방법)
S: 단일 책임 원칙
O: 개방/폐쇄 원칙
L: 리스코프 교환 원칙
I: 인터페이스 원칙
D: 의존성 역전 원칙

 

반응형
728x90
반응형
지난 시간 리뷰

def reverseStr(my_string):
    strList = list(my_string)  # my_string 리스트화 하면 [b,r,e,a,d]
    strList.reverse()          # [d,a,e,r,b]
    word = ""
    for i in strList:
        word += i
    return word

a = reverseStr("bread")
print(a)  # daerb

todo_list = ["problemsolving","practiceguitar","swim","studygraph"]
finished = [True, False, True, False]

def haveto_List(todoList,finishedList):
    return [todoList[index] for index,item in enumerate(finishedList) if not item]
print(haveto_List(todo_list,finished))
Day 13


객체의 개념

객체란? 객체는 속성(변수)과 메서드(함수)를 하나의 단위로 묶은 것임. 예를 들어, 자동차를 객체로 생각하면 이 자동차 객체에는 여러 속성 (색상, 브랜드, 연식 등)과 메서드 (운전하기, 정지하기, 경적 울리기 등)가 있음. 

속성: 속성은 객체의 특징을 나타냄. 예를 들어, 자동차의 색상 (빨강,파랑),
브랜드 (BMW, 테슬라), 연식 (2020년,2021년) 등이 속성에 해당함.


메서드: 메서드는 객체가 수행할 수 있는 행동임. 예를 들어,
"DRIVING", "HONKING", "INTRODUCING" 등의 기능을 수행하는 것이 메서드에 해당함. 

객체의 생성자 (CONSTRUCTOR)

생성자는 객체가 생성될 때 자동으로 호출되는 특별한 메서드로,
파이썬에서는 __init__ 메서드를 사용하여 생성자를 정의함

(Class 활용 예시1)

class Car:
    def __init__(self,b,n,c): #변수/구조체 [명사/상태]
        self.brand = b
        self.name = n
        self.color = c

    def introduce(self):
        print(f"차의 이름은 {self.name} 브랜드는 {self.brand} 차 색깔은 {self.color}입니다 ")
    def horning(self):
        print("빵빵 경적 울립니다~")
    def driving(self):
        print("부릉부릉 앞으로 갑니다~")

a = Car('Hyundai','k5','black')
b = Car('Kia','모닝','purple')
a.driving()  #부릉부릉 앞으로 갑니다~
a.introduce() #차의 이름은 k5 브랜드는 Hyundai 차 색깔은 black입니다
b.horning()  #빵빵 경적 울립니다~
b.introduce() #차의 이름은 모닝 브랜드는 Kia 차 색깔은 purple입니다

(class 활용 예시 2)

class Dog:  #강아지키우기 게임
    def __init__(self,n):
        self.hp = 100     #max 200
        self.stress = 50  #max 100
        self.name = n
    def eating(self):
        if(self.hp >= 200):
            print('체력이 꽉 찼습니다.')
            print(f"현재 체력은 {self.hp} 입니다.")
            self.hp = 200
        else:
            self.hp += 50

a = Dog('mega')

a.eating()
#체력이 꽉 찼습니다.
#현재 체력은 200 입니다.

 

반응형
728x90
반응형
가변 매개변수 (*args)
설명: args는 여러 개의 위치 인수를 받을 수 있게 해주며,
함수에서 몇 개의 인수를 받을 지 미리 정할 수 없을 때 유용함.

예시: 아래 toppings는 여러개의 인수를 받을 수 있음

(출생년도에 대한 띠 zodiac 알려주기 예시)

def zodiac(*years):
    sign = ['닭띠','개띠','돼지띠','쥐띠','소띠','호랑이띠','토끼띠','용띠','뱀띠','말띠','양띠','원숭이띠']
    # newList = []
    # for i in years:
    #     newList.append(sign[i - 1993])
    # return newList
    return [sign[i-1993] for i in years]  # 위 커멘드들의 요약버전



a = zodiac(1993,1994,1999,2002)
print(a)    #['닭띠', '개띠', '토끼띠', '말띠']

 

람다함수
: 간결하고 익명의 한 줄 함수로, 작은 연산이나 변환에 적합

내용 요약
정의: 람다 함수는 이름이 없는 익명 함수로, 간단한 함수를 한 줄로 작성할 수 있게 해주며,
주로 작은 연산이나 데이터 변환에 사용됨. 

차이점: 일반 함수는 def 키워드를 사용하여 정의되고 이름을 가지며, 복잡한 로직을 포함할 수 있음.
반면, 람다 함수는 간단한 표현식을 위해 사용되며, lambda 키워드로 정의되고 이름을 가지지 않음.
plus = lambda a,b: a+b
result = plus (5,7)
print(result)       #12

minus = lambda a,b: a-b
result2 = minus(5,2)
print(result2)      #3

mult = lambda a,b,:a*b
result3 = mult(4,5)
print(result3)      #20 

 

콜백함수
다른 함수에 전달되어 특정 이벤트나 조건 후에 실행되는 함수 g(f(x))

정의:
1. 콜백 함수는 일반적인 함수처럼 정의되지만, 다른 함수에 인자로 전달됨
2. 콜백 함수를 정의하고, 다른 함수에 인자로 전달하여 호출함
3. 파이썬에서는 모든 함수가 일급 객체이므로, 함수를 변수에 할당하거나 다른 함수의 인자로 전달 할 수 있음
eggs=['🥚','🥚','🥚']
def cookEggs(eggs,index,recipe):
    recipe(eggs,index)
def makeFry(eggs,index):
    eggs[index]= '🍳'
def makeSandwich(eggs,index):
    eggs[index]='🥪'

cookEggs(eggs,0,makeFry)
cookEggs(eggs,1,makeSandwich)
print(eggs)  # ['🍳', '🥪', '🥚']
내장 함수
내장 함수 3대장 (map, filter, reduce): 데이터 컬렉션을 처리하는 강력한 파이썬 내장 함수 트리오임.
내장 함수는 파이썬 인터프리터에 기본적으로 내장되어 있는 함수들을 의미하며, 별도의 모듈을 임포트하지 않고도 사용할 수 있음. 

파이썬 내장 함수의 장점
- 사용 편의성: 별도 설치나 임포트 없이 사용 가능
- 성능 최적화: 파이썬의 내부적 최적화로 인해 빠른 실행 속도 제공
- 범용성: 다양한 프로그래밍 상황에 적용 가능

# map (치환)
# filter (필터링)
# reduce (누적)

(map함수 예시)

numList = [1,2,3,4,5]
a = map(lambda x: x**2,numList)
b = map(lambda x: x+100,numList)
c = map(lambda x: x**2+100,numList)
print(list(a)) # [1, 4, 9, 16, 25]
print(list(b)) # [101, 102, 103, 104, 105]
print(list(c)) # [101, 104, 109, 116, 125]

coffeePriceList = [2000,3000,3500,4000]
# map을 사용해서 '3000원','4000원','4500원','5000원' 으로 바꾸려면~
d = map(lambda x: str(x+1000)+'원',coffeePriceList)
print(list(d)) # ['3000원', '4000원', '4500원', '5000원']

fruits = ['apple','banana','mango','avocado']
e = map(lambda x: len(x),fruits)
print(list(e)) # [5, 6, 5, 7]

(filter 함수 예시)

numList = [1,2,3,4,5,6,7,8,9,10]
filter(lambda x: x>5,numList)    # 5 이상 필터
filter(lambda x: x%2==0,numList) # 짝수 필터

fruits = ['apple','banana','mango','avocado']
d = filter (lambda x: 'o' in x,fruits)
print(list(d)) # ['mango', 'avocado']
# 6글자 이상인 애들만 걸러주고, 그 앞에 '🥪' 붙이기
a = filter(lambda x: len(x)>5, fruits) #6자 이상 필터
b = map(lambda x: "🥪"+x, a )  #🥪 붙이기 맵
print(list(b))   #['🥪banana', '🥪avocado']

(reduce 함수 예시)

numbers = [1,2,3,4,5]
result = reduce(lambda x,y: x+y,numbers)    # x y 두개가 들어감.
result2 = reduce(lambda x,y: x+y,numbers)
print(result)    # 15
반응형
728x90
반응형

Day 9 리뷰 문제

# REVIEW 1) 1~20 숫자 중 짝수만 포함하는 리스트 컴프리헨션 만들기

#방법1
[i for i in range (1,21) if i % 2 ==0]
#방법2
[i for i in range (2,21,2)]

# REVIEW 2) 주어진 리스트 [1,2,3,4,5,6,7,8,9,10]에서 5보다 큰 숫자만을 포함하는 새로운 리스트를 리스트 컴프리헨션을 사용해 만들기

numList = [1,2,3,4,5,6,7,8,9,10]
overFiveList = [i for i in numList if i > 5]
print(overFiveList)      #[6,7,8,9,10]

# REVIEW 3) 문자열 리스트 ['apple','banana','cherry','date']에서 각 단어의 첫 글자만을 추출하여 새로운 리스트 만들기
# 예상 답안 ['a','b','c','d']

fruits = ['apple','banana','cherry','date']
firstLetterList = [i[0] for i in fruits]
print (firstLetterList)  # ['a','b','c','d']

# REVIEW 4) 위의 FRUITS를 대문자화 하기

fruitsUpper= [i.upper() for i in fruits]
print(fruitsUpper)      # ['APPLE','BANANA','CHERRY','DATE']
Day 10
딕셔너리 컴프리헨션 (Dictionary Comprehension)
딕셔너리 컴프리헨션은 Key 값과 Value 쌍을 생성하여 Dictionary를 만드는데 사용됨.

구조:
{키 : 값 for 변수 in 리스트 or 문자열}
zip 함수의 기본 사용법
#1. zip 함수를 이해하기 쉬운 비유로 설명하자면, 'zipper' 처럼 서로 다른 두 줄의 요소들을 하나씩 짝지어 올리는 것임
#2. zip 함수는 두 개 이상의 리스트를 받아서, 첫 번재 리스트의 첫 번째 요소와 두 번째 리스트의 첫 번째 요소를 묶고, 다음으로 두 번째 요소들을 묶는 식으로 진행 

(#Dict 리뷰)

#dict_comp
normalPopcorn = {
        'name':'일반',
        'price':'2500',
    }   #이렇게 생긴게 Dict 였다.

(# Dict_comp 활용)

# #dict_comp을 활용하려면 zip를 해주어야 한다
# #zipper
# zipped = zip(coffee,price)
# print(list(zipped))  #[('아메리카노', 2500), ('라떼', 3000), ('바닐라', 3500)]

coffee = ['아메리카노','라떼','바닐라']
price = [2500,3000,3500]

result = [{'이름':name,'가격':price} for name,price in zip(coffee,price)]

print(result)
#[{'이름': '아메리카노', '가격': 2500}, {'이름': '라떼', '가격': 3000}, {'이름': '바닐라', '가격': 3500}]

coffee = ['아메리카노','라떼','바닐라']
price = [2500,3000,3500]
caffeine=[120,150,50]

resultC = [{'이름':name,'카페인':caffeine} for name,caffeine in zip(coffee,caffeine)]
print(resultC)

(#Enumerate 리뷰)

#enumerate 순서랑 값 나타내기
for index,item in enumerate(coffee):      #enumerate 순서랑 값 나타냄
    print(f"{index}.{item}")
    #결과 0. 아메리카노
    #결과 1. 라떼
    #결과 2. 바닐라

(#Dict comp, Enumerate, Zip 활용)

#아래 popcorn = 의 dict를 {index ~~ for ~ in enumerate(zip()) 을 활용하여 표현 가능하다
coffee = ['아메리카노','라떼','바닐라']
price = [2500,3000,3500]

a= {index: {'이름':coffee, '가격':price} for index,(coffee,price) in enumerate(zip (coffee,price))}

popcorn = {
    1: {
        'name':'일반',
        'price':2500
    }
}
print(a)
# {0: {'이름': '아메리카노', '가격': 2500}, 1: {'이름': '라떼', '가격': 3000}, 2: {'이름': '바닐라', '가격': 3500}}

#1 for coffee,price in zip (coffee,price)
#2 for index,(coffee,price) in enumerate(zip (coffee,price))
#3 딕셔너리화 {for index,(coffee,price) in enumerate(zip (coffee,price))}
#4 딕셔너리 값에 인덱스넣기 {index:{'name':coffee,'price':price} for index,(coffee,price) in enumerate(zip (coffee,price))}

 

Day 10
Function

1. 프로그래밍과 함수의 관계
 특징: 함수는 프로그램에서 중요한 역할을 하며, 코드를 조직화하고 재사용할 수 있게 해줌.
이는 유지 보수를 쉽게 하고, 이는 유지 보수를 쉽게 하고 프로그램의 복잡성을 줄이는 데 기여함
2. 함수 정의 방법: def 키워드
설명: 함수를 호출하려면 함수 이름과 괄호를 사용함. 괄호 안에는 함수가 정의될 때 지정된 매개변수에 해당하는 인자를 넣어 줌. 함수가 호출되면, 파이썬은 함수의 본문을 실행.

3. 키워드 매개변수 (Keyword Arguments)
설명: 키워드 매개변수를 사용하면 인수를 전달할 때 매개변수의 이름을 명시적으로 지정할 수 있음. 이렇게 하면, 인수의 순서가 바뀌어도 올바르게 전달 됨. 

(예시: pet_name과 animal_type의 순서가 바뀌어도 함수가 올바르게 작동)

(예시 2)

def add(x,y):
    result = x+y
def minus(x,y):
    result = x-y
def multiply(x,y):
    result = x*y
def oddEven(x):
    if x%2 ==0 :
        return "짝수입니다"
    else:
        return "홀수입니다"
a = oddEven(5)
print(a)
4. 기본 매개변수 값 설정
설명: 함수 정의 시 매개변수에 기본값을 설정할 수 있음. 호출 시 해당 매개변수에 값을 제공하지 않으면, 기본값이 사용됨.

(예시: animal_type에 기본값 'dog'가 설정되어 있으므로, pet_name_만 전달해도 함수가 작동함)

(응용예시)

def makeListDict(xList,yList,xKey,yKey):
    return [{xKey: x, yKey: y} for x,y in zip(xList,yList)]

breads = ['소금빵','보름달','단팥빵','앙버터','마카롱']
prices = [2500,1000,2400,4500,3000]
result= makeListDict(breads,prices,'빵','가격')
print(result)
    #[{'빵': '소금빵', '가격': 2500}, {'빵': '보름달', '가격': 1000}, {'빵': '단팥빵', '가격': 2400}, {'빵': '앙버터', '가격': 4500}, {'빵': '마카롱', '가격': 3000}]

 

반응형
728x90
반응형
지난 시간 리뷰 문제 
# REVIEW 1 1부터 100까지의 사이 출력한 뒤 정수 N의 배수만 출력하도록 만들기
num = int(input("정수 입력하기: "))
for x in range (101):
    if x % num == 0:
        print(x)
# REVIEW 2 정수를 받고, 구구단 (x1 ~ x9) 출력하기
num1= int(input("정수 입력:"))
for i in range (1,10):
    print(f"{num1} * {i} = {num1 * i}")   # 5*1=5  5*2=10
DAY 9
BREAK: FOR, WHILE 에 반복을 끊는 역할

CONTINUE: JUMP 같은 역할

(break 예시)

for i in range (100):
    if i==50:
        break
    else:
        print(i)        # 0 1 2 3... 49

(continue 예시)

for i in range (100):
    if i==50:
        continue
    else:
        print(i)   # 0 1 2 3 ... 49 51 .. 99
Day 9
While 문 : 파이썬에서 while 문은 조건이 True인 동안 반복해서 코드 블록을 실행하는 데 사용 됨. while 루프는 주어진 조건이 False가 될 때까지 계속 실행되며, 조건이 처음부터 False이면 루프 내부의 코드는 한 번도 실행되지 않음.

While 은 유저가 끝을 결정 짓는 상황, 
For 는 프로그래머가 끝을 결정 짓는 상황으로 이해할 수 있음!

(while문 기본 구조 1)

a=1
while a < 10:
    print ('아메리카노')
    a=a+1     # a += 1
    #결과: 아메리카노 9번 써짐

(while문 기본 구조 2)

while True:
    print("너가 숫자 1을 넣어야 탈출 가능")
    num=int(input("숫자 입력:"))
    if num == 1 :
        break

(while문의 응용 - 커피 프로그램 개발-)

coffeeList=[]

while True:
    print("-메가커피 프로그램-")
    print("1. 커피 등록하기")
    print("2. 커피 메뉴보기")
    print("3. 시스템 종료")
    codeNumber = int(input("번호 입력: "))
    if codeNumber==1:
        print("커피 등록 시스템")
        coffeeName=input("커피 이름 입력")
        coffeeList.append(coffeeName)
        print("등록 완료!")
    elif codeNumber ==2:
        if len(coffeeList) == 0:
            print("커피 메뉴가 없어요ㅠ.ㅠ")
        else: print(coffeeList)
    elif codeNumber ==3:
        print("이용해 주셔서 감사합니다.")
        break
    else:
        print("숫자를 다시 입력하세요")
Day 9 
For 문 컴프리헨젼
파이썬에서의 리스트 컴프리헨션 (List Comprehension)은 for 문을 사용하여 리스트를 생성하는
간결하고 효율적인 방법임.

기본적인 for 문 대신에 리스트 컴프리헨션을 사용하면 코드를 더 짧고 읽기 쉽게 만들 수 있음

(기존 FOR문)

a = []
for i in range (1001):
    a.append(i)
    print(a)

(FOR_COMPREHENSION 예시)

a = [i for i in range (1001)]
print(a)        #[1, 2, 3.... , 1000]
b = [i for i in range (101)]
print(b)        #[1,2,3...,100]
c = [i for i in range (1,501)]
print(c)        #[1,2,3...,500]
d = [i for i in "megastudy"]
print(d)          # ['m','e','g','a',..'y']
e = [i*2 for i in range (1,101)]
print(d)         # [2,4,6,8...200]
#1. 1~10을 각각 제곱한 수의 리스트
f = [i**2 for in range (1,11)]
print(f)
#[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
#2. 1~10에 각각 5를 더한 수의 리스트
g= [i+5 for i in range (1,11)]
print(g)
#[6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
조건부 컴프리헨션 (Conditional Comprehension)
컴프리헨션 내에 if-else 조건문을 사용하여 특정 조건에 따라 다른 값들을 생성
구조: [값1 if 조건 else 값2 for 변수 in 반복가능객체]

(예시 1) IF가 뒤에 있을 때에는, FILTER 역할 수행!)

fruits =['apple','strawberry','mango','orange','melon']
for i in fruits :
    print(i)   # apple strawberry mango ...
#예시) alphabet a 가 있는 애들만 찾기
a = [i for i in fruits if i.count('a')>0]
print(a)  #['apple', 'strawberry', 'mango', 'orange']
#예시) alphabet r 이 하나만 있는 애들만 찾기
b = [i for i in fruits if i.count('r')==1]
print(b)  #['orange']
#글자 개수가 6글자 이상만 찾기
c = [i for i in fruits if len(i) >= 6]
print(c)  #['strawberry', 'orange']

(예시 2) IF - ELSE 가 있을때는 MAP 변환/치환 역할 수행!

d = [':>' if i%2 ==0 else i for i in range (1,101)]
print(d)  #[1, ':>', 3, ':>', 5, ':>', 7, ':>', 9, ':>',...:>(100)]

(활용 1) 유저에게 n을 입력 받고, 1~100까지의 리스트 출력을 하는데
n  의 배수만 @를 표현해주고 나머지는 숫자로 표현

n=int(input("정수 입력: "))
e = ['@' if i%n==0 else i for i in range (1,101)]
print (e)
# 5 넣으면 [1, 2, 3, 4, '@', 6, 7, 8, 9, '@' ... '@]

(활용 2) fruits = ['apple','strawberry','mango','orange','melon']
fruits 에서 5글자 이하이면 대문자로 바꿔서 출력하고
아니면 #로 출력하는 리스트 만들기

f = [i.upper() if len(i)<=5 else '#' for i in fruits]
print (f) #['APPLE', '#', 'MANGO', '#', 'MELON']
중첩 루프 컴프리헨션 (Nested Loop Comprehension)
컴프리헨션 내에 두 개 이상의 반복문을 중첩하여 사용 가능. 이는 여러 개의 리스트나 다른 반복 가능한 객체들 간의 조합을 생성하는 데 유용
구조: [값 for 변수1 in 반복가능객체1 for 변수2 in 반복가능객체2]
h=[i*j for i in range (1,4) for j in range (1,4)]
#i:1일때 j: 1,2,3
#i=2일때 j: 1,2,3
#i=3일때 j: 1,2,3
print(h)
#결과: [1, 2, 3, 2, 4, 6, 3, 6, 9]

g=[i+j for i in ["apple","banana"] for j in ["pie","tanghuru"]]
print(g)
# 결과: ['applepie', 'appletanghuru', 'bananapie', 'bananatanghuru']

 

반응형

+ Recent posts