알쏭달쏭 공부한거 쓰기
7/5 파이썬 수업-딕셔너리,객체와 클래스 본문
#딕셔너리 dictionary
key와 value가 하나의 세트로 담겨있다.
• 키key와 값value을 쌍으로 갖는 자료형
• 키를 이용하여 값을 참조
list -index로 접근
딕셔너리는 key를 통해서 value에 접근
key는 문자열, 튜플은 가능하지만 리스트는 안된다.
#for x in 리스트, 문자열, 레인지, 셋, 튜플, 딕셔너리:
## 6.1 다음과 같은 파이썬 딕셔너리 구조의 프로그램을 실행할 적에, 다음 밑줄 친 곳에 들어갈 알맞은 내용은 무엇인가? (5)번 문제의 출력을 위하여 len() 함수를 사용하시오.
---
```
>>> price = {'김밥': 5000, '어묵': 3000, '떡볶이': 2000}
>>> price['김밥']
(1) 5000
>>> price['김밥'] = 6000
>>> price
(2) 6000
>>> price.values()
(3) dict_keys(['김밥', '어묵', '떡볶이'])
>>> price.keys()
(4) dict_values([5000, 3000, 2000])
>>> len(price)
3
>>> (5) _________________________________
이 식당의 메뉴 개수는 3개 입니다.
```
def dict_test():
price={'김밥': 5000, '어묵': 3000, '떡볶이': 2000}
for x in price:
print(f'{x}:{price[x]}')
dict_test()
def dict_2():
price={'apple': 5000, 'banana': 4000, 'grape': 5300,'melon': 6500}
for i in price:#i에 key만 넘어온다
print(f'{i}의 가격은 {price[i]}')
#price(i) 로 치면 인식이 안된다.
dict_2()
#딕셔너리의 추가와 삭제
• 딕셔너리에 새로운 항목을 삽입하려면 다음과 같은 방법 사용
딕셔너리이름[키] = 값
•삭제 시 del 키워드 다음에 삭제할 딕셔너리 항목의 키를 입력• 존재하지 않는 키를 이용하여 항목을 삭제하려하면KeyError라는 오류메시지가 출력됨
없는 애 삭제는 오류가 난다.
#딕셔너리의 함수
len()>딕셔너리 항목의 개수를 반환
in,not in 판단할 때 딕셔너리의 키를 기준으로 판단해야한다.
값에 있어서도 키에 없으면 없다고 판다.
==,!= key와 값이 연결되어 있는가?
대소관계는 지원하지 않는다.
#딕셔너리의 매소드
키만 알고 싶다>딕셔너리 이름. keys()> 리스트로 반환
값만 알고 싶다.>딕셔너리 이름. values()> 리스트로 반환
키와 값 둘 다 알고 싶다.>딕셔너리 이름. items()>키와 값을 튜플로 묶어서 반환
price['참치김밥']> 없는 키를 넣으면 오류난다.
*get
price.get('참치깁밥')> 없는 키를 넣으면 아무 값도 내지 않는다.!!오류가 생기지 않는다.
price.get('찾는 키',해당키가 없을 때 반환할 값)
>해당키가 있다면> 키에 해당하는 value 낸다
>해당 키가 없다면>반환할 값에 넣은 게 나온다.
## dts4. 달을 숫자로 입력받아 영어로 출력하는 프로그램을 작성하시오.
- 조건문 사용하지 않고 딕셔너리 구조와 메소드 활용하여 풀이할 것.
---
달 목록
```
'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'
```
---
실행 결과
```
달: 4
April
```
실행 결과
```
달: -1
해당 달은 존재하지 않습니다.
```
def dts4():
month={'1':'January','2':'February','3':'March','4':'April','5':'May','6':'June','7':'July','8': 'August','9':'September','10':'October','11':'November','12':'December'}
n=input('달:')
print(month.get(n,'해당 달은 존재하지 않습니다.'))
dts4()
교수님은
user=int(input('달:'))
로 받아서
month의 키를 정수 1~12로 작성함
tp=('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December')
#딕셔너리 축약
month={x+1:tp[x] for x in range(12)}
print(month)
n=int(input('달:'))
print(month.get(n,'해당 달은 존재하지 않습니다.'))
#month=dict(튜플들(키,값)) 키랑 값을 튜플 형태로 묶어서 casting 이용해서 딕셔너리화
month=dict((x+1,tp[x]) for x in range(12))
print(month)
'''
결과
{1: 'January', 2: 'February', 3: 'March', 4: 'April', 5: 'May', 6: 'June', 7: 'July', 8: 'August', 9: 'September', 10: 'October', 11: 'November', 12: 'December'}
달:3
March
{1: 'January', 2: 'February', 3: 'March', 4: 'April', 5: 'May', 6: 'June', 7: 'July', 8: 'August', 9: 'September', 10: 'October', 11: 'November', 12: 'December'}
'''
#리스트 축약, 셋, 튜플, 딕셔너리 축약도 가능하다.
축약으로 만든것과 casting으로 만든것의 값이 동일한다.
#연습 dts1번
## dts1. 아래와 같은 딕셔너리를 생성하시오.
- 딕셔너리 함축(dictionary comprehension) 사용할 것.
---
실행 결과
```
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81, 10: 100}
```
def dts1():
num={x:x**2 for x in range(1,11)}
print(num)
dts1()
'''
결과
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81, 10: 100}
'''
#교수님 sol)
def dts1():
num={x:x**2 for x in range(1,11)}
print(num)
dct=dict((x,x**2) for x in range(1,11))
print(dct)
dts1()
'''
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81, 10: 100}
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81, 10: 100}
'''
x:x**2도 되지만
(x,x**2)처럼 튜플로 만든 다름에 dict로 캐스팅 해도 된다.
#dts2
## dts2. 쇼핑몰의 가격이 딕셔너리에 저장되어 있다. 모든 상품의 가격 총합을 출력하시오.
```
dct = {'옷': 100_000, '컴퓨터': 2_000_000, '모니터': 320_000}
```
---
실행 결과
```
합계: 2,420,000원
```
교수님sol)
def dts2():
dct = {'옷': 100_000, '컴퓨터': 2_000_000, '모니터': 320_000}
print(f'합계 {sum(dct.values()):,}원')
dts2()
'''
합계 2,420,000원
'''
#sum 주의해야한다.
## 6.2 문제 6.1의 price 딕셔너리에 (‘순대’ : 4500) 메뉴를 추가하는 코드를 (1)에 넣으시오. (2)에는 그 후의 출력 결과를 적으시오. (3)은 price['순대‘]를 사용하여 출력하시오. (4)는 반드시 len() 함수를 이용하시오.
---
```
>>> (1)price['순대']= 4500
>>> price#대화형임!
(2) {'김밥': 5000, '어묵': 3000, '떡볶이': 2000, '순대': 4500}
>>> (3)print(f'순대의 가격은 {price["순대"]}원입니다.')
순대의 가격은 4500원 입니다.
>>> (4)print(f'이 식당의 메뉴개수는 {len(price)}개 입니다.')
이 식당의 메뉴 개수는 4개 입니다.
```
def day7_6_2():
price = {'김밥': 5000, '어묵': 3000, '떡볶이': 2000}
price['순대']= 4500
print(price)
print(f'순대의 가격은 {price["순대"]}원입니다.')
print(f'이 식당의 메뉴개수는 {len(price)}개 입니다.')
day7_6_2()
결과
{'김밥': 5000, '어묵': 3000, '떡볶이': 2000, '순대': 4500}
순대의 가격은 4500원입니다.
이 식당의 메뉴개수는 4개 입니다.
max(price)>> 메뉴의 ㄱㄴㄷ..사전 순서상으로 온다.
sum(price)>오류 발생
가격의 합: sum(price.values())> 값만 으로 만들어진 리스트의 합을 구함
## 6.3 동윤이가 새로 문을 열고 운영하는 커피 가게에는 Americano, Ice Americano, Cappuccino, Caffe Latte, Espresso의 5가지 메뉴가 있으며, 각 메뉴의 가격은 각각 3,000원, 3,500원, 4,000원, 4,500원, 3,600원이다. 이 목록을 menu라는 딕셔너리로 작성하라.
### 1) 이 menu의 내용을 다음과 같이 출력하여라.
---
실행 결과
```
Americano 가격 : 3,000원
Ice Americano 가격 : 3,500원
Cappuccino 가격 : 4,000원
Cafe Latte 가격 : 4,500원
Espresso 가격 : 3,600원
```
### 2) 사용자로부터 다음과 같은 주문을 받은 후 주문한 내용이 메뉴에 있는지 구하는 프로그램을 작성하라.
---
실행 결과
```
Americano 가격 : 3,000원
Ice Americano 가격 : 3,500원
Cappuccino 가격 : 4,000원
Cafe Latte 가격 : 4,500원
Espresso 가격 : 3,600원
위의 메뉴중 하나를 선택하세요: Espresso
Espresso는 3,600원 입니다. 결제를 부탁합니다.
```
---
실행 결과
```
Americano 가격 : 3,000원
Ice Americano 가격 : 3,500원
Cappuccino 가격 : 4,000원
Cafe Latte 가격 : 4,500원
Espresso 가격 : 3,600원
위의 메뉴중 하나를 선택하세요: Fan Cake
미안합니다. Fan Cake는 메뉴에 없습니다.
```
sol)
def day7_6_3():
cafe={'Americano' : 3000,'Ice Americano' : 3500,'Cappuccino': 4000,'Cafe Latte ': 4500,'Espresso': 3600}
for i in cafe:
print(f'{i.ljust(20)} 가격:{cafe[i]}원')
#ㅣjust(길이)
for i in cafe:
print(f'{i}\t 가격{cafe[i]:,}원') #:, 세자리마다 , 가 들어간다.
for i in cafe:
print(f'{i:20s}가격:{cafe[i]:,}원')
print(cafe)
n=input('위의 메뉴중 하나를 선택하세요')
if n in cafe:
print(f'{n}는 {cafe[n]:,}입니다. 결제 부탁합니다.')
else:
print(f'미안합니다. {n}은 메뉴에 없습니다.')
day7_6_3()
#ljust(길이)> 길이만큼 채우고 나머지는 공백으로 채운다.
#:, 값을 표현할때 쓴다
#{:20s} 20칸 확보하고 형식 써주기
cf)
코딩에서는 3,000원 등 ,를 쓸 수 없다
>대신 3_000원으로 쓸 수 있다.
메뉴판 출력하고 싶다면 for 문으로 key와 valuse값 하나씩 만들기
그냥 단순 확인은 print(딕션너리 명) 하면 된다.
if 문 보면 get을 쓰면 되지 않을까 생각을 했는데 더 복잡해지니까 그냥 if 사용
-입력받을때 대소문자에 구애받지 않기 위해서 : 한번 생각해보기
if n.lower() in [x.lower() for x in cafe]:
print(f'{n}는 {cafe[n]:,}입니다. 결제 부탁합니다.')
else:
print(f'미안합니다. {n}은 메뉴에 없습니다.')
1) x for x in cafe> cafe의 key만 받는다.
2)cafe.lower() dict형이므로 문자열 매소드 사용 불가
3) n이 소문자일때 cafe[n]이 존재하지 않는다.
이거 한번 생각해보자
해결!!
def day7_6_3():
cafe={'Americano' : 3000,'Ice Americano' : 3500,'Cappuccino': 4000,'Cafe Latte ': 4500,'Espresso': 3600}
for i in cafe:
print(f'{i.ljust(20)} 가격:{cafe[i]}원')
#ㅣjust(길이)
for i in cafe:
print(f'{i}\t 가격{cafe[i]:,}원') #:, 세자리마다 , 가 들어간다.
for i in cafe:
print(f'{i:20s}가격:{cafe[i]:,}원')
print(cafe)
n=input('위의 메뉴중 하나를 선택하세요')
if n.lower() in [l.lower() for l in cafe]:
jumon=n.split()
a=''
for x in jumon:
a=a+x.capitalize()
#x=x[0].upper()+x[1:]
a=a+' '
a=a.strip()
print(f'{a}는 {cafe[a]:,}입니다. 결제 부탁합니다.')
else:
print(f'미안합니다. {a}은 메뉴에 없습니다.')
day7_6_3()
#딕셔너리 매소드 추가
pop(key)반드시 key를 작성해야한다.
list.pop과 dict.pop의 차이점
리스트 자리에 대해 index를 가짐으로 앞의 원소가 제거가 되면 당겨져서 다시 index값을 가진다.
반면 딕셔너리는 앞의 원소가 삭제되어도 key는 고정되어 있다.
#zip() buit in function
복습 자료 안에 넣어둠
#16번은 과제
def a():
student_tuple = (('191101', '홍길동', '010-123-45xx'), ('191102', '임꺽정', '010-223-45xx'), ('191103', '장길산', '010-323-45xx') )
num,name,_=zip(*student_tuple)
a=dict(zip(num, name))
print(a)
while True:
user=input('학번을 입력하세요: ')
#print(f'{user}번의 학생은 {a.get(user,"해당 학번의 학생이 없습니다.")}입니다.')
#191106번의 학생은 해당 학번의 학생이 없습니다.입니다.
if int(user)>0:
if a.get(user)!=None:
print(f'{user}번의 학생은 {a.get(user)}입니다.')
else:
print('해당 학번의 학생이 없습니다.')
else:
print('프로그램을 종료합니다.')
break
a()
'''
{'191101': '홍길동', '191102': '임꺽정', '191103': '장길산'}
학번을 입력하세요: 191102
191102번의 학생은 임꺽정입니다.
학번을 입력하세요: 191106
해당 학번의 학생이 없습니다.
학번을 입력하세요: -3
프로그램을 종료합니다.
'''
객체와 절차 차이
>절차지향 프로그래밍은 프로그램의 순서와 흐름을 먼저 세우고 필요한 자료구조와 함수들을 설계하는 방식이다. 객체지향 프로그래밍은 반대로 자료구조와 이를 중심으로 한 모듈들을 먼저 설계한 다음에 이들의 실행순서와 흐름을 짜는 방식이다.
객체지향=코드 정리하는 방법=데이터 생각하는 구조=oop
클래스 내용 설명함.
#자동차를 프로그래밍하자!= 자동차 클래스를 작성하자!
#자동차를 프로그래밍하자!= 자동차 클래스를 작성하자!
#자동차의 속성, 동작을 파이썬 언어로 나타내자.
#동작: 직진, 좌/우회전한다, 정지한다, ...=> 함수인데 클래스 안에 있으며로 메소드(함수)로 구현
#속성: 색상, 총 주행거리
class Car:
def __init__(self,color='white',mileage=0):
self._color=color
self._mileage=mileage
def __str__(self):
return f'MY Color is {self._color} My total mileage is {self._mileage}'
def straight(self, m):
print(f'go to straight {m}m')
self._mileage+=m
def turn_right(self):
print('turn right')
def turn_left(self):
print('turn left')
def get_color(self):
return print(self._color)
def set_color(self,color):
self._color=color
print(f"{self}'s color is changed to {self._color}")
#MY Color is cream My total mileage is 102's color is changed to cream
#여기에다가 happy라는 이름을 넣고 싶은데 방법이 없을까//?
happy=Car('cyan')
print(happy)
happy.straight(100)
happy.turn_right()
happy.straight(2)
happy.turn_left()
print(happy)
happy.get_color()
happy.set_color('cream')
print(happy)
'파이썬 -23여름학기(ㄱㅎㅈ)' 카테고리의 다른 글
유튜브 -파이썬 , class (0) | 2023.07.06 |
---|---|
23 여름 중간 풀이 (0) | 2023.07.05 |
중간 대비-22 파이썬 족보 (0) | 2023.07.04 |
HW 6-튜플, 집합 추가문제 (0) | 2023.07.04 |
중간고사 대비-hw별 문제풀이 가능여부 및 연습 (0) | 2023.07.03 |