[멋쟁이사자처럼 데이터분석] 파이썬 실습

블체·2025년 4월 9일

Notion에서 정리한 내용을 공유용으로 옮긴 내용입니다.
양식과 구성의 어색함이 있을 수 있습니다.

04/09(수) 학습내용을 바탕으로 업로드하였음

코드라이언 LMS에 따라 실습한 내용입니다.

메뉴 자판기 만들기

이론

메뉴 랜덤 출력

import random

print(random.choice(["된장찌개", "피자", "제육볶음"]))
  • random.choice : 리스트, 튜플, 문자열(”abcde”면 random으로 “d” 나옴)에서 랜덤으로 값을 하나 추출

반복 : for 문

import random

# list
menu = ["된장찌개", "피자", "치킨","떡볶이", "라면"]
# 30번 반복
for _ in range(30) :
    print(random.choice(menu))
    # print("이 문장도 반복되는가?")

반복 : while 문

import random
import time

menu = ["된장찌개", "피자", "치킨","떡볶이", "라면"]
# 30번 반복
while True:
    print(random.choice(menu))
    # break   # break 위치 학습
    print("이 문장도 반복되는가?")
    time.sleep(1)
    break
  • 무한히 반복되지 않게 주의
  • while True: 형태라면
    break 필요

변수

  • 이해
    - 정리 상자에서 티셔츠를 가져다 줘, 라고 친구에게 부탁한다면?
    → 티셔츠 상자 안에 있는 티셔츠를 하나 꺼내서 줌
    → ‘티셔츠’ 이름표를 가져다 주는 게 아님
import random

lunch = random.choice(["된장찌개", "피자", "제육볶음"])
lunch = "냉장고"
# 변수 덮어씌워짐. lunch 는 그저 문자열 "냉장고"
# 이제 위의 list 불러올 수 없음

dinner = random.choice(["김밥", "쫄면", "돈까스"])

print(lunch)

lunch를 프린트하면 lunch가 나오는 게 아닌 그 안에 있는 “피자”가 나옴

  • 이름표 = lunch = 변수

Dictionary

  • 도입
    • 조립식 약통

그림출처 : 멋쟁이사자처럼 / CODELION

  • 약이 많다면 이런 식으로 각각 요일로 구분된 약통에 약을 미리 담아 놓고 먹기도 함
    - 월요일 : 주황색 알약 한 개
    - 화요일 : 초록색 알약 한 개
    - 수요일 : 작은 알약 각각 한 개

    • '월요일' 또는 '초록색 알약 한 개' 만으로는 의미가 없음. 두 개가 같이 있어야 의미 완성
  • 딕셔너리 만들기

    • 고향은 수원이다.
    • 취미는 영화보기이다.
    • 좋아하는 음식은 국수이다.
  • 딕셔너리 형태로

    Info1 = {"고향" : "수원", "취미" : "영화보기", "좋아하는 음식" : "국수"}
    print(Info1)
  • 취미가 무엇인지 알고 싶다면?

    print(Info1.get("취미"))
  • get( )

    • 딕셔너리에서 값을 꺼내되, 에러 없이 None이나 대체값을 줄 수 있는 안전한 메서드
      - dict["키"] 는 키가 없으면 오류 발생(KeyError)

      info = {"이름": "지민", "나이": 25}
      
      print(info.get("취미"))           # 출력: None (취미가 없으니까!)
      print(info.get("취미", "없음"))   # 출력: 없음 (기본값을 설정했으니까!)
      
    • “없음”이 기본값 → 원하는 값이 없을 때 대신 사용하는 값

    • dict.get(”키”,”기본값”)의 형태로 쓰는 게 좋음

  • key, value

그림출처 : 멋쟁이사자처럼 / CODELION


List와 Dictionary에 자료 추가/삭제

자료를 저장하는 방법에는 리스트, 딕셔너리가 가장 중요

DIctionary

  • 딕셔너리에 값 추가하기
    • dict[”키”] = “값”
info = {"나이": 25}
info["이름"] = "지민"

print(info)
# 출력: {'나이': 25, '이름': '지민'}

수정하는 형식도 마찬가지

  • 딕셔너리에 값 삭제하기

    • del dict[”키”]

      info = {"이름": "지민", "나이": 25}
      del info["이름"]
      
      print(info)
      # 출력: {'나이': 25}

      없는 키 del 하면 KeyError

    • dict.clear : 딕셔너리 전체를 싹 비움

      info = {"이름": "지민", "나이": 25}
      info.clear()
      
      print(info)
      # 출력: {}
information = {"고향":"수원", "취미":"영화관람","좋아하는 음식":"국수"}
foods = ["된장찌개", "피자", "제육볶음"]
print(information.get("취미"))

# 딕셔너리에 값 추가하기
information["특기"] = "피아노"
information["사는곳"] = "서울"

# 딕셔너리에 값 삭제하기
del information["좋아하는 음식"]

# 딕셔너리에 정보 묶음이 몇 개인지
print(information)
print(len(information)) # 3개 + 2개 추가 - 1개 삭제 = 4

# clear
information.clear()
print(information)

영화관람
{'고향': '수원', '취미': '영화관람', '특기': '피아노', '사는곳': '서울'}
4
{}


List

  • 순서 값 (인덱싱)
foods = ["된장찌개", "피자", "제육볶음"]
print(foods[2]) # 출력 : 제육볶음
print(foods[3]) # 에러
print(foods[-2]) # 출력 : 피자

그림출처 : 멋쟁이사자처럼 / CODELION

  • 위와 같은 방법으로 0부터 배정
  • 없는 경우 에러

  • 음수 순서값 : 뒤에서부터 -1, -2, …순으로

  • 리스트에 값 추가 : list.append(”값”)

foods.append("김밥")
print(foods)

# ['된장찌개', '피자', '제육볶음', '김밥']

  • 리스트에 값 삭제 : del list[ 순서값 ]
del foods[-1]
print(foods)

# ['된장찌개', '피자', '제육볶음']

list 뒤 순서 값에는 int, slices만 들어갈 수 있음

반복

  • 단순 range
for x in range(30):
    print(x)
# 0부터 29까지 x 안에 넣어져서 출력

  • list 반복 1)
foods = ["된장찌개", "피자", "제육볶음"]
for x in range(3):
    print(foods[x])

→ 리스트에 “라면”을 추가하고 싶으면, range값 바꿔 줘야 함
→ 리스트 수정될 때마다 range 변경 필요
→ 개선 필요

  • list 반복 2)
for i in foods:
    print(i)

된장찌개
피자
제육볶음

→ 이렇게 하면 list 가 몇 개든 알아서 반복

  • Dictionary도 유사
information = {"고향":"수원", "취미":"영화관람", "좋아하는 음식":"국수"}
for x, y in information.items():
    print(x)
    print(y)

고향
수원
취미
영화관람
좋아하는 음식
국수

→ DIctionary의 요소 개수가 몇 개든 알아서 반복

집합

  • 순서 없음
  • 중복 없음
menu1 = set(["된장찌개", "피자", "제육볶음"])
menu2 = set(["된장찌개", "떡국", "김밥"])

  • 합집합
    • 두 집합의 겹치는 부분 알아서 1번으로 처리
menu3 = menu1 | menu2
print(menu3)

{'떡국', '김밥', '피자', '제육볶음', '된장찌개'}

  • 교집합
    • 겹치는 부분만 집합
menu4 = menu1 & menu2
print(menu4)

{'된장찌개'}

  • 차집합
menu5 = menu1 - menu2
print(menu5)

{'피자', '제육볶음'}

if 문

  • if 문 사용시 들여쓰기 주의

  • 만약 뽑힌 게 제육볶음이면, “곱빼기 주세요”를 출력하자. → if - print

import random

food = random.choice(["된장찌개","피자","제육볶음"])

if(food == "제육볶음"):
    print("곱배기 주세요")
print("종료")
  • 만약 뽑힌 게 제육볶음이면, “곱빼기 주세요”를 출력하자. → if - print 그렇지 않다면 “그냥 주세요”를 출력하자. → else - print
food2 = random.choice(["된장찌개","피자","제육볶음"])

if(food2 == "제육볶음"):
    print("곱배기 주세요")
else:
    print("그냥 주세요")
print("종료")

실습

  • 추가/삭제 기능을 탑재한 메뉴 리스트를 만들어서 그 중에 하나를 뽑아라.

  • 메뉴 리스트를 input받아서 추가 + 반복

# 메뉴 리스트
lunch = ["된장찌개", "피자", "제육볶음", "짜장면"]

# 음식 추가
while True : # 반복해서 추가
    item = input("음식을 추가해 주세요 : ")
    lunch.append(item)
    print(lunch)
    #무한으로 추가됨
  • 특정 조건에서 종료할 수 있도록 변경
# 메뉴 리스트
lunch = ["된장찌개", "피자", "제육볶음", "짜장면"]

# 음식 추가
while True : # 반복해서 추가
    print(lunch)
    item = input("음식을 추가해 주세요 : ")
    if (item == "q"): # q면 중단되고
        break
    else:
        lunch.append(item) # 아니면 계속 반복
print(lunch) # 최종 결과 출력 후 종료

데이터 삭제

  • 차집합 사용해 보기
set_lunch = set(["된장찌개", "피자", "제육볶음", "짜장면"])
item = "짜장면"
print(set_lunch - set([item]))
# 차집합을 하기 위해 item 리스트로 만들어서 set으로 묶어줌 : 3개만 출력
print(set_lunch) # 원래의 set_lunch이므로 4개 출력

차집합은 원래의 set_lunch 에 변화를 주지 않음

  • 본인을 참조? 하여 바꿔 주어야 함
set_lunch = set(["된장찌개", "피자", "제육볶음", "짜장면"])
item = "짜장면"
set_lunch = set_lunch - set([item])
print(set_lunch) # 3개 출력
  • set_lunch = set_lunch - set([item]) 부분 추가하면 3개로 출력

최종

import random
import time

# 메뉴 리스트
lunch = ["된장찌개", "피자", "제육볶음", "짜장면"]

# 음식 추가
while True : # 반복해서 추가
    print(lunch)
    item = input("음식을 추가해 주세요 : ")
    if (item == "q"): # q면 중단되고
        break
    else:
        lunch.append(item) # 아니면 계속 반복
print(lunch) # 최종 결과 출력 후 종료

set_lunch = set(lunch) # lunch가 집합으로 바뀌어 저장

# food12에서 이어서

# 음식 삭제
while True:
    print(set_lunch)
    item = input("음식을 삭제해 주세요 : ")
    if (item == "q"):
        break
    else:
        set_lunch = set_lunch - set([item]) # 괄호 중요

print(set_lunch, "중에서 선택합니다.")
# print를 ,로 연결하면 한 줄로 쭉 출력할 수 있음
print("5")
time.sleep(1)
print("4")
time.sleep(1)
print("3")
time.sleep(1)
print("2")
time.sleep(1)
print("1")
time.sleep(1)

print(random.choice(list(set_lunch))) # random은 set에서 쓸 수 없음 -> list로

이상형이 뭐예요

함수

  • 이해
    • 카페에 가서 돌체 라떼를 시킨다면

그림출처 : 멋쟁이사자처럼 / CODELION

  • 이러한 준비물, 레시피, 주의사항 등이 필요

  • 사람이 하면 실수가 있을 수 있음

  • but 돌체라떼 기계

    • 버튼을 누르면 항상 똑같은 돌체라떼가 나옴
      = 함수!

  • 함수의 구조
    - def 함수이름():
    함수가 해야 할 내용 1
    함수가 해야 할 내용 2

그림출처 : 멋쟁이사자처럼 / CODELION



  • 익명 게시판에 질문/답변 형식 만들기

  • 구현 idea1)

그림출처 : 멋쟁이사자처럼 / CODELION

→ 딕셔너리로 구현하자!

{”질문” : “취미는 무엇입니까”, “답변” : “영화 보기입니다”}

{”질문” : “특기는 무엇입니까”, “답변” : “댄스입니다”}

  • 구현 idea2 )

→ 리스트로 하나의 딕셔너리씩 나누기

[

{”질문” : “취미는 무엇입니까”, “답변” : “영화 보기입니다”}

{”질문” : “특기는 무엇입니까”, “답변” : “댄스입니다”}

]

위와 같이 리스트 - 딕셔너리 중첩해서 쓰는 경우 많음

  • 작성 방식

그림출처 : 멋쟁이사자처럼 / CODELION

  • 1번
    • list, dictionary 둘 다 사용
    • 어느 것이 질문, 어느 것이 답변인지 확실히 알 수 있음
    • 코드가 복잡함
  • 2번
    • dictionary만 사용
    • 작성한 사람만 알 수 있음
    • 다른 사람과 협업 어려움
    • 코드 간결해짐

서로 데이터 어떻게 저장하는지 방식 비교하며 보기

dictionary만 사용

# 딕셔너리만 사용

total_dictionary = {}

# 질문 q로 중단할 때까지 차례로 입력받음
while True:
    question = input("질문을 입력해주세요 : ")
    if question == "q":
        break
    else:
        total_dictionary[question] = ""
        # question이 total_dictionary에 들어가고 답변은 ""

# 질문 전부 하나씩 출력하면서 답변 적을 것임
for i in total_dictionary:
    print(i)
    answer = input("답변을 입력해 주세요 : ")
    total_dictionary[i] = answer # answer로 받은 답변 딕셔너리에 넣기

print(total_dictionary)

질문을 입력해주세요 : 취미는?
질문을 입력해주세요 : 특기는?
질문을 입력해주세요 : q
취미는?
답변을 입력해 주세요 : 피아노
특기는?
답변을 입력해 주세요 : 줄넘기
{'취미는?': '피아노', '특기는?': '줄넘기'}

  • key 먼저 넣고, key 하나씩 띄우면서 answer 다시 넣었음

list, dictionary 사용

그림출처 : 멋쟁이사자처럼 / CODELION

  • 질문 부분 구성
    • total_list 안에 담음
    • else 부분 : 딕셔너리 형태로 리스트에 append
# 리스트 사용
total_lsit = []

# 질문하는 부분
while True:
    question = input("질문을 입력해주세요 : ")
    if question == "q":
        break
    else:
        total_list.append({"질문" : question, "답변" : ""})

  • 답변 부분 구성
    • 흰 네모 각각이 딕셔너리
    • 답변하는 부분에서 딕셔너리가 통째로 i에 들어감
    • 취미는 무엇입니까? 만 출력하려면 i[”질문”] 해야 출력됨
# 리스트 사용
total_list = []

# 질문하는 부분
while True:
    question = input("질문을 입력해주세요 : ")
    if question == "q":
        break
    else:
        total_list.append({"질문" : question, "답변" : ""})

# 답변하는 부분
for i in total_list:
    print(i["질문"])
    answer = input("답변을 입력해주세요 : ")
    i["답변"] = answer
print(total_list)

(전체 코드. #답변하는 부분 추가됨)

질문을 입력해주세요 : 취미는?
질문을 입력해주세요 : 특기는?
질문을 입력해주세요 : q
취미는?
답변을 입력해주세요 : 라면 끓이기
특기는?
답변을 입력해주세요 : 라면 먹기
[{'질문': '취미는?', '답변': '라면 끓이기'}, {'질문': '특기는?', '답변': '라면 먹기'}]


실습하는 내용이 굉장히 기초적인 내용이라 쉽기도 하고 해서 재밌게는 한 듯
일단 객체지향 가지고 뭔가 Class와 함수 만들어서 출력하는 것보다 훨씬 이해하기 편함

하지만 시간 체크가 너무 귀찮게 해...분명 정리하면서 천천히 듣고 점심도 한 20분은 켜놨던 거 같은데 어째서 시간이 이렇게 적게 측정됐냔 말임...
내일은 점심 풀로 켜놔야지ㅠㅠㅠㅠ

객체지향 예제를 일부러 정리 안했는데 오늘 이해해서 정리해보려 했더니😵
챗GPT와 떠든 길이가 장난이 아님
이해는 어찌어찌 된 거 같은데 이걸 말로 풀 자신이 없다...

profile
벨로그 적응할 수 있을까

0개의 댓글