(Pandas를 활용한 데이터 분석 문제) 목표: 공공데이터 포털에서 '따릉이' 데이터를 다운로드하여 Pandas를 사용해 데이터를 분석하고, 특정 조건에 맞는 정보를 추출하는 퀴즈 수행
데이터소스: 1. 공공데이터 포털에 접속 2. 검색창에 따릉이 검색 3. 검색 결과에서 첫번째로 나오는 엑셀파일 다운로드 4. df = pd.read_csv('bicycle.csv', encoding = 'cp949') 주요 작업: 1. Pandas를 사용하여 다운로드한 '따릉이' 데이터를 읽어들임 2. 다음과 같은 데이터 처리를 진행: - 대여소명에서 숫자를 제거하여 새로운 열에 저장 - 대여시간대를 '새벽' '아침' '점심' '저녁' '밤'으로 분류하여 새로운 열에 저장. (apply 함수 활용) 3. 생성된 새로운 열들을 이용하여 각 대여소명별로 가장 많은 대여가 일어난 시간대를 집계 (groupby와 value_counts 활용) 4. 신촌동의 [점심] 자전거 대여 수를 파이그래프로 나타내기
인터넷에 있는 웹페이지를 자동으로 탐색하고 정보를 수집하는 과정. 이를 수행하는 소프트웨어를 Crawler, 또는 Spider라고 함.
웹크롤링이 왜 필요한가? - 대량의 유용한 데이터 수집이 가능하고 - 웹사이트의 컨텐츠를 검색엔진에 인덱싱하여 최적화 가능 - 웹사이트 분석, 고객 리뷰 수집 등 시장조사에 활용 가능
HTML 태그 (Tags) - 웹 페이지의 기본 구성 요소 - <태그이름> 형식으로 작성되며, 대부분의 태그는 시작태그 와 종료 태그 로 구성됨 - 예)
는 단락 (paragraph)을 나타내는 태그
id 속성 - HTML 요소에 고유한 식별자를 제공 - 페이지 내에서 유일해야 하며, 주로 JAVASCRIPT나 CSS에서 요소를 식별할 때 사용됨 - 예)
는 'header"인 div 요소를 나타냄
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을 가져오는 데 사용됨
판다스에서의 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() # 보여주기
(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()
1. 라이브러리란 : 라이브러리는 특정 기능을 수행하는 함수나 클래스들의 모음임. 이들을 사용함으로써 개발 시간을 단축하고, 오류를 줄일 수 있음.
2. 파이참에서 라이브러리 설치하기 : 파이참에서는 프로젝트 설정을 통해 쉽게 라이브러리를 추가할 수 있음 ( File > Settings > Project : [프로젝트이름] > Python Interpreter ) 로 이동하여 필요한 라이브러리를 검색하고 설치할 수 있음
3. 라이브러리 사용 : 라이브러리를 설치한 후에는 import 구문을 사용하여 코드 내에서 해당 라이브러리를 호출하고, 그 기능을 사용할 수 있음.
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.
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
상속과 추상 상속 (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: 의존성 역전 원칙
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입니다
가변 매개변수 (*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. 파이썬에서는 모든 함수가 일급 객체이므로, 함수를 변수에 할당하거나 다른 함수의 인자로 전달 할 수 있음
#방법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 함수는 두 개 이상의 리스트를 받아서, 첫 번재 리스트의 첫 번째 요소와 두 번째 리스트의 첫 번째 요소를 묶고, 다음으로 두 번째 요소들을 묶는 식으로 진행
# 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']