파이썬에서는 리스트 안에 for 반복문, if 구문을 넣어 코드를 간략화할 수 있습니다. 마찬가지로 딕셔너리 안에도 for 반복문, if 구문을 넣어 코드를 간략화 할 수 있습니다.


dictionary에 for 반복문 넣기 (list가 주어진 경우)


students = ["student a", "student b", "student c", "student d", "student e"]

students라는 리스트가 주어져 있습니다. 이제 리스트 안에 있는 5명의 학생에게 50~100 사이의 점수를 랜덤하게 부여하는 딕셔너리를 만들려고 합니다.


import random
students = ["student a", "student b", "student c", "student d", "student e"]

scores = {student:random.randint(50,100) for student in students}

print(scores)


위와 같이 딕셔너리를 만들 수 있습니다.


코드의 구조를 보면 아래와 같습니다.

variable = {key : value for key in list}


dictionary에 for 반복문 넣기 (dictionary가 주어진 경우)

students = {"student a" : 90,
"student b" : 80,
"student c" : 70,
"student d" : 60,
"student e" : 50}

이번에는 딕셔너리에 있는 학생 5명의 점수를 일괄적으로 10점 올려보도록 하겠습니다.

students = {"student a" : 90,
"student b" : 80,
"student c" : 70,
"student d" : 60,
"student e" : 50}

add_scores = {student : score + 10 for (student, score) in students.items()}

print(add_scores)

위와 같이 코드를 작성하여 모든 학생의 점수를 일괄적으로 10점 올렸습니다.


코드의 구조를 보면 아래와 같습니다.

variable = {new_key : new_value for (key, value) in dictionary.items()}

*딕셔너리 이름 뒤에는 .items()를 붙여야 에러가 발생하지 않습니다.



dictionary에 if 구문 넣기


이번에는 바로 위에서 만든 딕셔너리에서 점수가 80점 이상인 학생만 골라내 새로운 딕셔너리를 만들어 보겠습니다. 

students = {"student a" : 90,
"student b" : 80,
"student c" : 70,
"student d" : 60,
"student e" : 50}

add_scores = {student : score + 10 for (student, score) in students.items()}

passed_students = {student : score for (student, score) in add_scores.items() if score >= 80}

print(passed_students)

위의 코드 처럼 딕셔너리 안에 if 구문을 넣으면 점수가 80점 이상인 학생만 골라낼 수 있습니다.


코드의 구조를 보면 아래와 같습니다.

variable = {new_key : new_value for (key, value) in dictionary.items() if statement}


블로그 이미지

방구석 세계인

관심분야 : 외국어 학습, 프로그래밍, 책 리뷰 등...

,

 list에 for 반복문 넣기

1, 2, 3, 4, 5, 6, 7, 8, 9, 10 이라는 숫자들로 리스트를 만드려면 보통 아래와 같이 코드를 작성할 것입니다.

numbers = []
for i in range(1, 10+1):
numbers.append(i)

print(numbers)



위의 방식을 이용하면 3줄의 코드를 작성하여 numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 라는 리스트를 만들 수 있습니다. 하지만 파이썬에서는 단 한줄의 코드만으로 똑같은 리스트를 작성할 수 있습니다.


numbers = [n for n in range(1, 10+1)]

print(numbers)

위의 코드처럼 리스트 안에 for 반복문을 넣으면 단 한줄의 코드만으로도 numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 라는 리스트를 만들 수 있습니다.


for 반복문이 안에 들어가는 리스트의 구조는 아래와 같습니다.

variable = [<result> for <each value in the list> in <how many times will loop>]


list에 if 구문 넣기

numbers = [1, 2, 4, 523, 9, 11, 32, 6]

이번엔 위의 리스트에서 짝수만 골라서 새로운 리스트를 선언해보려고 합니다. if 구문을 이용하면 짝수만 골라낼 수 있을 것입니다. 여기서 만약 if 구문을 리스트 안에다 넣을 수 있다면 작성할 코드의 숫자를 줄일 수 있을 것입니다.


numbers = [1, 2, 4, 523, 9, 11, 32, 6]

even_numbers = [n for n in numbers if n % 2 == 0]

print(even_numbers)


if 구문이 안에 들어가는 리스트의 구조는 아래와 같습니다.

variable = [<result> for <each value in the list> in <how many times will loop> if statement]


블로그 이미지

방구석 세계인

관심분야 : 외국어 학습, 프로그래밍, 책 리뷰 등...

,

튜플 (tuple)

튜플은 다른 프로그래밍 언어에는 없고, 파이썬에만 있는 특별한 기능 중 하나입니다.

튜플은 리스트 (list)와 같은 자료형으로, 생긴것도 리스트와 비슷하게 생겼습니다.


list_example = [1, 2, 3, 4, 5]
tuple_example = (1, 2, 3, 4, 5)

리스트, 튜플을 각각 하나씩 선언해보았습니다. 리스트는 []로 감싸지며, 튜플은 ()로 감싸진다는 차이점을 알 수 있습니다.


그럼 리스트, 튜플 사이의 기능적 차이점은 어떻게 될까요?


리스트

list_example = [1, 2, 3, 4, 5]
print(list_example)

list_example[0] = 10
print(list_example)


튜플

tuple_example = (1, 2, 3, 4, 5)
print(tuple_example)

tuple_example[0] = 10
print(tuple_example)

리스트는 이미 선언된 요소를 중간에 자유롭게 바꿀 수 있습니다.

그래서 처음에 [1, 2, 3, 4, 5]로 선언된 것을 [10, 2, 3, 4, 5]로 바꿀 수 있었습니다.

하지만 튜플은 한번 선언된 요소를 중간에 바꿀 수 없습니다.

그래서 [1, 2, 3, 4, 5]로 선언된 것을 [10, 2, 3, 4, 5]로 바꾸려하자 에러가 발생했습니다.



프로그램을 작성하다보면 리스트 내부의 요소를 변경해서는 안되는 일이 생길 수 있습니다.

그럼 해당 리스트에 주석을 달아놓던지하여 요소를 변경해서는 안된다고 표시해줄 수 있을 것입니다. 하지만 프로그램은 한 번 만들면 끝이 아니라 이후 계속 유지, 보수를 해줘야 합니다. 그러나 시간의 흐름에 따라 해당 리스트 내부의 요소를 변경해서는 안된다는 사실을 잊어버릴 수도 있습니다.

그럴때 아예 튜플로 선언해버리면 해당 문제를 사전에 예방할 수 있을 것입니다.

 


튜플 (tuple) 선언 할 때 tip

1. 튜플 내 요소를 하나만 생성하고 싶을 때

tuple_example = (1,) O
tuple_example = (1) X

요소가 하나뿐이더라도 튜플을 생성할 때에는 요소 뒤에 항상 comma(,)를 붙여야 합니다.


2. 괄호 생략

#둘 다 가능함
tuple_example = (1, 2, 3, 4, 5)

tuple_example = 1, 2, 3, 4, 5

튜플을 생성할 때, 괄호를 쓰지 않아도 아무 문제 없이 정상적으로 생성됩니다.

블로그 이미지

방구석 세계인

관심분야 : 외국어 학습, 프로그래밍, 책 리뷰 등...

,

커피 자판기 만들기 (실습)

이번에는 커피 자판기 프로그램을 만들어 보려고 합니다. (물론 실제로 커피를 만들어주는 프로그램이 아니라 가상의 커피 자판기를 만드려는 것입니다)

espresso, latte, cappuccino 이렇게 3가지의 메뉴를 뽑을 수 있고, report를 입력했을 땐 남은 재료 현황, off를 입력했을땐 자판기 작동이 멈추도록 프로그램을 짜려고 합니다.

먼저 아래의 코드를 복사, 붙여넣기 한 후 몇 번 동작시켜서 자판기의 구조를 파악해보시길 바랍니다.


# current resources status
water = 1000
milk = 600
coffee = 300
money = 0

# coins setting / quarters : 0.25, dimes : 0.10, nickles : 0.05, pennies : 0.01
quarter = 0.25
dime = 0.10
nickle = 0.05
penny = 0.01

def running() :
"""coffee machine running"""
global water, milk, coffee, money
# is resources sufficient? (if not, print current status)
switch = True
while switch:
# prompt user by asking "what would you like?? (espresso/latte/cappuccino) : "
question = input("What would you like? espresso(1.5$) / latte(2.5$) / cappuccino(3.0$) : ")

# report function (shows current resources up. hidden function for maintainers)
if question == "report":
print(f"Current stock \n water : {water}ml \n milk : {milk}ml \n coffee : {coffee}g \n money : {money}$")
continue
elif question == "off":
switch = False

# coin insert question and make progress
input_quarter = float(input("How many quarters?(0.25$) : "))
input_dime = float(input("How many dimes(0.10$) : "))
input_nickle = float(input("How many nickles(0.05$) : "))
input_penny = float(input("How many pennies(0.01$) : "))

def coin_calculation(coin, input_coin) :
"""calculate inputted coins"""
coin *= input_coin
return coin

inputted_money = float(coin_calculation(quarter, input_quarter))

+ float(coin_calculation(dime, input_dime)) + float(coin_calculation(nickle, input_nickle))

+ float(coin_calculation(penny, input_penny))

# check inserted coins are enough or not / stock check / money check
if question == "espresso" and inputted_money > 1.5:
if water >= 50 and coffee >= 18:
print(f"Here is espresso and ${round(inputted_money - 1.5, 2)} in change")
money += 1.5
water -= 50
coffee -= 18
else:
if water < 50:
print("Sorry, there is no water enough.")
if coffee < 18:
print("Sorry, there is no coffee enough.")
elif question == "latte" and inputted_money > 2.5:
if water >= 200 and milk >= 150 and coffee >= 24:
print(f"Here is latte and ${round(inputted_money - 2.5, 2)} in change")
money += 2.5
water -= 200
milk -= 150
coffee -= 24
else:
if water < 200:
print("Sorry, water is not enough.")
if milk < 150:
print("Sorry, milk is not enough.")
if coffee < 24:
print("Sorry, coffee is not enough.")
elif question == "cappuccino" and inputted_money > 3.0:
if water >= 250 and milk >= 100 and coffee >= 24:
print(f"Here is cappuccino and ${round(inputted_money - 3.0, 2)} in change")
money += 3.0
water -= 250
milk -= 100
coffee -= 24
else:
if water < 250:
print("Sorry, there is no water enough.")
if milk < 100:
print("Sorry, there is no milk enough.")
if coffee < 24:
print("Sorry, there is no coffee enough.")
else:
print("You inserted not enough money or chose wrong menu.")


running()

몇번 작동 시킨 후, 다시 작성된 코드를 봅니다. 위의 코드는 작동하는데에는 문제가 없습니다. 하지만 자판기에 메뉴를 추가한다던지, 재료 사용량을 바꾼다던지, 가격을 바꾼다던지 등등.. 프로그램을 수정할 일이 생기면 어떨까요? 위의 코드는 수정하기에 조금 불편할 것입니다.

프로그램은 한 번 완성하면 끝나는 것이 아닙니다. 버그를 찾아 수정해야하고, 버전을 업데이트해야하는 경우도 많습니다. 그렇기 때문에 코드를 읽기 쉽게, 그리고 나중에 수정하기 쉽게 작성할 필요가 있습니다. 이번 포스팅에서는 그 중, 수정하기 쉽게 작성하기에 포커스를 맞춰볼 것입니다.



dictionary를 이용해 코드 간소화

#1
MENU = {
"espresso": {
"ingredients": {
"water": 50,
"coffee": 18,
},
"cost": 1.5,
},
"latte": {
"ingredients": {
"water": 200,
"milk": 150,
"coffee": 24,
},
"cost": 2.5,
},
"cappuccino": {
"ingredients": {
"water": 250,
"milk": 100,
"coffee": 24,
},
"cost": 3.0,
}
}
resources = {
"water": 1000,
"milk": 600,
"coffee": 300,
}
profit = 0
#4
def is_ingredient_sufficient(order_ingredients):
"""return True if ingredients are enough, return False if ingredients are not enough"""
for item in order_ingredients:
if order_ingredients[item]>resources[item]:
print(f"sorry. {item} is not enough.")
return False
return True

#6
def coin_process():
"""insert coins and sum up how much is it"""
print("please insert coins")
total = float(input("How many quarters?(0.25$) : ")) * 0.25
total += float(input("How many dimes?(0.10$) : ")) * 0.10

total += float(input("How many nickles?(0.05$) : ")) * 0.05

total += float(input("How many pennies?(0.01$) : ")) * 0.01

return total

#8
def is_transaction_successful(money_inputted, beverage_cost):
"""Return True if money is enough. return False if money is not enough"""
if money_inputted >= beverage_cost:
charge = round(money_inputted - beverage_cost, 2)
print(f"${charge} in charge.")
global profit
profit += beverage_cost
return True
else :
print("Sorry. That is not enough money.")
return False

#10
def make_coffee(ordered_ingredients, beverage_name):
"""Deduct the required ingredients from the resources"""
for item in ordered_ingredients:
resources[item] -= ordered_ingredients[item]
print(f"Here is your {beverage_name}.")

#2
is_on = True
while is_on:
#3
choice = input("What would you like? espresso(1.5$) / latte(2.5$) / cappuccino(3.0$) : ")
if choice == "off":
is_on = False
elif choice == "report":
print("Current stock")
print(f"water : {resources['water']}ml")
print(f"milk : {resources['milk']}ml")
print(f"coffee : {resources['coffee']}g")
print(f"money : ${profit}")
else:
#5
drink = MENU[choice]
if is_ingredient_sufficient(drink['ingredients']):
#7
payment = coin_process()
#9
if is_transaction_successful(payment, drink['cost']):
#11
make_coffee(drink['ingredients'], choice)

이번에는 각 메뉴에 들어가는 재료, 비용을 딕셔너리로 만든 후 다시 코드를 작성하였습니다.

이제 메뉴, 재료, 가격 등을 수정하려면 딕셔너리 내부 위주로하여 쉽게 수정하실 수 있을 것입니다.


그리고 코드를 작성한 순서를 매겨보았습니다. 

while 반복문 안에 커피를 뽑는 과정을 작성하면서 필요한 함수들이 생기면 추가하는 방식으로 작성하였습니다.




*이 글은 Udemy 강좌 100 Days of Code - The Complete Python Pro Bootcamp for 2021의 Day 15 (intermediate) - Local Development Environment Setup & Coffee Machine Project 내용을 바탕으로 작성하였습니다.

(URL : https://www.udemy.com/course/100-days-of-code/)


블로그 이미지

방구석 세계인

관심분야 : 외국어 학습, 프로그래밍, 책 리뷰 등...

,