연습문제
- 반장선거
#1) 투표결과를 받아와서
#2) 해당 결과를 알맞는 자료구조로 변환해서
#3) 가장 많이 받은 표를 계산 후 출력
# 1. 데이터 입력받기
data = input("투표 결과를 입력하세요. ").split()
# 2. 적절한 데이터셋으로 변환
data_set = set(data) # 중복을 포함하지 않는 자료구조
# 3. dict 형태로 가져오기
data_dict = {}
for key in data_set:
data_dict[key] = data.count(key)
# 4. 최대값을 출력 max()
print(f'{max(data_dict.keys())}이가 {max(data_dict.values())} 표를 받아 반장이 되었습니다.')
# 투표 결과를 입력하세요. 원범 원범 혜원 혜원 혜원 혜원 유진 유진
# 혜원이가 4 표를 받아 반장이 되었습니다.
- 놀이동산에 가자
# 테마파크에 온 원범이와 친구들은 놀이기구를 타려고 합니다.
# 모든 놀이기구는 한번에 타는 인원수에는 제한이 없지만 제한 무게를 넘으면 무조건 다음 기구를 타야 합니다.
# 원범이와 친구들이 총 몇 명 탈 수 있는지 알 수 있는 프로그램을 작성해 주세요.
# 첫번째 줄에서 제한 무게가 주어지고 두번째 줄에서는 함께한 친구들의 수 n이 주어집니다.
# 그 다음 차례대로 탑승할 친구들의 몸무게가 무작위로 주어집니다.
# 단, 놀이기구는 선착순으로만 탈 수 있습니다. 두 명 이상의 인원이 항상 탑승합니다.
limit_weight = int(input('제한 무게를 입력하세요. '))
n = int(input('친구 수를 입력하세요. '))
weight = 0
total_weight = 0
for i in range(n):
weight = int(input(f'{i+1}번째 친구 몸무게를 입력하세요. '))
total_weight += weight
if total_weight > limit_weight:
print(f'{i+1}번째 친구부터는 다음 기구에 탑승해주세요. ')
break
else:
print(f'총 {n}명 탑승하였습니다.')
# 제한 무게를 입력하세요. 90
# 친구 수를 입력하세요. 3
# 1번째 친구 몸무게를 입력하세요. 40
# 2번째 친구 몸무게를 입력하세요. 30
# 3번째 친구 몸무게를 입력하세요. 50
# 3번째 친구부터는 다음 기구에 탑승해주세요.
- 택시 기사의 하루 일당 구하기
# A기사님은 오늘 매출 30만원을 채우기를 원합니다. (30만원 이상일 경우 운행 종료)
# 손님별 운행시간은 5 ~ 20분으로 정합니다. 그 중 5 ~ 15분인 고객의 콜을 받습니다.
# 기본요금은 기본 5분일 경우 5,000원으로 1분이 추가될때마다 1,000원을 더 추가합니다.
# 1) 오늘 콜을 받은 횟수
# 2) 탑승횟수
# 3) 30만원을 채우기까지 총 소요시간
# 4) 승객에게 받은 요금
# 5) 사납금을 납부하고 남은 금액 을 최종 산출하세요
import random
num = 0
total_num = 0
fee = 0
total_fee = 0
total_time = 0
while total_fee < 300000:
time = random.randint(5, 20)
total_num += 1
if 5 <= time <= 15:
fee = 5000 + (time-5) * 1000
total_fee += fee
total_time += time
num += 1
print(f'{num}이 탑승했습니다. 소요시간은 {time}이 걸립니다. 금액은 {fee}입니다.')
else:
print('매칭에 실패했습니다.')
print(f'오늘 매칭 횟수는 {total_num}번 이고, 탑승손님은 {num}명 이고, \
소요시간은 {total_time}분 이고, 총 수익은 {total_fee}원 입니다.')
randint vs. randrange
randint(start, stop) : start, stop 사이(stop 이하)의 랜덤 정수를 리턴 (stop도 포함)randrange(start, stop, step) : start, stop 사이(stop 미만)의 정수 중 step 간격의 랜덤 정수 리턴
-> randint 가 아닌 randrange 를 사용하면 원하는 배수값을 (ex. 3의 배수) 리턴 받을 수 있음
예외처리
오류가 나면 파이썬은 에러가 나서 수행이 중지됨
- 중지되지 않고 수행
- 예외적인 부분이나 에러를 좀 더 효과적으로
- 기타
[오류의 종류]
- 프로그램 실행 전에 발생
- 프로그램 실행 중에 발생
[예시]
- ML 모델 돌리는데 데이터에 NULL값이 있을 때
- 크롤링 시에 URL 주소를 잘못 입력했을 때
- 숫자형 대신에 누군가 문자형을 입력했을 때
Try - except 구문
[예외 종류]
- AttributeError - 존재하지 않는 속성 지정
- IndexError - 존재하지 않는 범위의 인덱스 지정
- KeyError - 존재하지 않는 키를 지정
- TypeError - 올바르지 않는 타입 지정
- ValueError - 올바르지 않는 값 지정
- ZeroDivisionError - 0으로 나눔
# Try - Except - Pass 문
list_1 = [100, "이백", 300]
list_num = []
for i in list_1:
try:
float(i)
list_num.append(i)
except:
pass
print(list_1) # [100, '이백', 300]
print(list_num) # [100, 300]
# Try - Except - Else - Finally 문
def div_num(a, b):
try: # 예외가 발생할것 같은 구문
val = a / b
print(f"나눗셈 결과: {val}")
except: # 예외가 발생했을때 출력하는 구문
print("예외가 발생했습니다.")
else: # 예외가 발생하지 않았을때 문장 실행
print("처리를 정상 종료했습니다.")
finally: # 무조건 실행
print("처리를 종료했습니다.")
div_num(4, 2) # 정상 처리
# 나눗셈 결과: 2.0
# 처리를 정상 종료했습니다.
# 처리를 종료했습니다.
div_num(10, 0) # 예외 처리
# 예외가 발생했습니다.
# 처리를 종료했습니다.
# 맛집 관리 연습문제
cake = 20
waiting = 1
i = 0
while i < 20:
print("남은 케이크는", cake, "입니다")
order = int(input("손님 케이크 몇개 주문하시나요?"))
if order > cake:
print("손님 남은 케익이", cake,"라서 주문이 불가하세요")
else:
print("케익", cake,"개 포장해주세요")
waiting += 1
cake -= order #주문 수 만큼 케이스 감소
i += order
# 예외처리1 - 손님이 주문할 수 있는 최대 주문량은 2개 2개를 넘으면 최대 주문 에러 출력
# 예외처리2 - 1보다 작거나 숫자가 아닌값이 들어오면 정수가 들어오지 않았습니다 값 에러 출력
# 예외처리3 - 케이크가 다 떨어지면 Sold Out 에러 출력
class OrderError(Exception):
pass
class SoldOutError(Exception):
pass
cake = 4
waiting = 1
i = 0
while cake != 0:
print("남은 케이크는", cake, "입니다")
try:
order = int(input("손님 케이크 몇개 주문하시나요?"))
if order < 1:
raise OrderError("1 이상의 정수를 입력해주세요")
if order > 2:
raise OrderError("한 번에 최대 2개까지만 주문 가능합니다")
if order > cake:
raise SoldOutError("케이크가 다 떨어졌습니다")
print("케익", order, "개 포장해주세요")
waiting += 1
cake -= order #주문 수 만큼 케이크 감소
i += order
except OrderError as e:
print(f"정상적인 주문이 아닙니다: {e}")
except SoldOutError as e:
print(f"주문이 불가합니다: {e}")
except Exception as e:
print(f"알 수 없는 오류가 발생했습니다: {e}")
print("케이크가 모두 판매되었습니다")
sentence = list("hello")
while (len(sentence) + 1):
try:
print(sentence.pop(0))
except Exception as e:
print(e)
break
# h
# e
# l
# l
# o
# pop from empty list
pop from empty list는 IndexError 예외 메시지의 일부분으로, pop() 메서드가 빈 리스트에서 값을 꺼낼 때 발생하는 예외를 의미합니다.
따라서 위 코드에서 sentence.pop(0)를 호출할 때, sentence 리스트가 빈 리스트가 되면 pop() 메서드는 IndexError 예외를 발생시키고, 이 예외 메시지가 except 블록에서 출력됩니다.
즉, pop from empty list는 IndexError 예외 메시지의 일부로, sentence 리스트가 빈 리스트가 되면 마지막으로 출력되는 메시지입니다.
for i in range(3):
try:
print(i, 3//i)
except ZeroDivisionError:
print("Not divided by 0")
# Not divided by 0
# 1 3
# 2 1
함수
- 코드의 재사용
- 코드의 용도 구분
- 실수 최소화
# 함수의 호출 과정(키워드 인수)
# 위치인수는 호출할때 함수의 정의와 인수 순서가 같은 순서로 지정
# 위치가 틀어지면 값이 완전히 바뀔수 있다.
def billing(unit_prices, units, fees, tax_rate):
return (unit_prices * units + fees) * tax_rate
x = billing(1000, 10, 500, 1.1)
print(x) # 11550.000000000002
y = billing(10, 1000, 1.1, 500)
print(y) # 5000550.0
# 키워드 + 위치인수
z = billing(1000, 10, tax_rate = 1.1, fees = 500)
print(z) # 11550.000000000002
def get_abbr(data_list):
result = []
for x in data_list:
result.append(x[:3]) # ['Seo', 'Any', 'Inc', 'Jej']
# for x in data_list[:3]:
# result.append(x) # ['Seoul', 'Anyang', 'Incheon']
return result
get_abbr(['Seoul', 'Anyang', 'Incheon', 'Jeju'])'DATA ANALYSIS > TIL' 카테고리의 다른 글
| [Day9] Python 심화(1) (0) | 2023.05.08 |
|---|---|
| [VOD] 같이 푸는 PYTHON [기초] (0) | 2023.05.04 |
| [Day6] Python 기초(4) (0) | 2023.05.03 |
| [Day5] Python 기초(3) (0) | 2023.05.02 |
| [Day4] Python 기초(2) (0) | 2023.04.29 |