알쏭달쏭 공부한거 쓰기

7/5 파이썬 수업-딕셔너리,객체와 클래스 본문

파이썬 -23여름학기(ㄱㅎㅈ)

7/5 파이썬 수업-딕셔너리,객체와 클래스

elec_cy 2023. 7. 5. 16:37

https://colab.research.google.com/drive/1McVY7e0CFbMh2jnZ_3GUhMWihoy0S-iW?usp=sharing#scrollTo=wUUXb3UtUI1l

 

Day_07.ipynb

Colaboratory notebook

colab.research.google.com

car1.py
0.00MB
python_day07.pdf
0.94MB

 

 

day8-st.py
0.00MB
python_day09.pdf
1.16MB
day09.py
0.01MB

 

 

#딕셔너리 dictionary        

key와 value가 하나의 세트로 담겨있다.

• 키key와 값value을 쌍으로 갖는 자료형

• 키를 이용하여 값을 참조

 

list -index로 접근

딕셔너리는 key를 통해서 value에 접근

hong[key]로 접근한다.

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와 key의 차이점

리스트 자리에 대해 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)