파이썬으로 자판기 코딩을 하는데 문제가 생겼습니다. TypeError: '<' not supported between instances of 'tuple' and 'int'
조회수 6165회
def show_menu():
print()
print("[자판기 판매 메뉴]")
for i in range(0, len(drink_menu)):
if i%10==0:
print()
print("|",i+1,".",drink_menu[i],":",drink_price[i],"|",end=" ")
def buy(num):
if money < drink_price[num]:
print("잔액이 부족합니다. 잔액 : %d" % money)
return money
else:
print(drink_menu[num], " 구입완료")
balance = money - drink_price[num]
left_drink[num] = left_drink[num]-1
print("잔액 : ", balance)
return balance,left_drink
def drink(num):
if left_drink[num]<1:
print("음료가 모두 소진되었습니다.")
else:
pass
if __name__ == '__main__':
drink_menu = ("생수","생수","생수","레몬워터","레몬워터","옥수수 수염차","옥수수 수염차", "우엉차","트레비","트레비",
"밀키스","펩시","핫식스","사이다","코코리치(망고)","코코리치(망고)","Lipton","트로피카나 스파클링(청사과)",
"트로피카나 스파클링(청사과)","트로피카나 스파클링(포도)", "가나초콜릿음료","가나초콜릿음료","레쓰비","레쓰비",
"칸타타","레쓰비 카페타임","게토레이","게토레이","코코팜","잔치집 식혜")
drink_price = (600,600,600,1500,1500,1300,1300,1300,1000,1000,800,800,1000,1000,1000,1000,1000,1000,1000,1000,600,600,600,600,1000,1000,800,800,800,800)
left_drink = [1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10]
money = 0
money = int(input("돈을 투입하세요 : "))
while True:
show_menu()
sel = int(input("\n메뉴 번호를 선택하세요 (종료 : 0) : "))
if sel == 0:
break;
elif (sel >= 1 and sel <= len(drink_menu)):
money = buy(sel - 1)
else:
print("잘못된 메뉴 번호입니다")
print("자판기 종료, 잔액 %d 반환" % money)
change_money_1000 = money // 1000
change_money_500 = (money - (change_money_1000 * 1000)) // 500
change_money_100 = (money - (change_money_1000 * 1000) - (change_money_500 * 500)) // 100
print("1000원 짜리:", change_money_1000, "개", "500원짜리:", change_money_500, "개", "100원짜리:", change_money_100, "개")
음료를 구입할 때 left_drink의 해당 음료의 갯수를 하나 씩 줄이고 싶은데 실행을 하면
Traceback (most recent call last):
File "C:/Users/JES/.PyCharmCE2019.1/config/scratches/scratch_2.py", line 49, in <module>
money = buy(sel - 1)
File "C:/Users/JES/.PyCharmCE2019.1/config/scratches/scratch_2.py", line 11, in buy
if money < drink_price[num]:
TypeError: '<' not supported between instances of 'tuple' and 'int'
두가지 오류가 발생합니다 튜플로 하건 리스트로 하건 오류가 발생하는데 어떻게 해결하면 좋을까요?
-
(•́ ✖ •̀)
알 수 없는 사용자 - 〉
1 답변
-
이건 사실 간단한 문제입니다. 차근차근 어디서 문제가 생긴건지 말씀드리겠습니다.
먼저 에러 내용을 보시면 아래와 같습니다.
if money < drink_price[num]:<br> TypeError: unorderable types: tuple() < int()
이는 말하자면 money가 tuple이며 drink_price[num]은 int형인데 비교연산자로 비교하기 때문에 생기는 에러라고 에러내용에 쓰여져 있습니다.
자 그렇다면 어느 부분에서 money가 tuple로 변경이 되었을지 확인을 해보면 while문 내부의
money = buy(sel - 1)
이 부분에서 money의 값의 변경이 이루어집니다.
자 그렇다면 이번에는 buy 함수의 리턴 결과에 대해서 보자면 잔액이 부족한 경우는 buy 함수는 정상적으로
return money
요 부분으로 인해 money 값만을 반환합니다.
하지만 잔액이 부족하지 않은 정상처리된 결과 부분을 보면
return balance, left_drink
이 부분으로 인하여 money는 balance, left_drink 라는 값을 한번에 tuple로서 받게 되는 것입니다.
그렇다면 해결 방안은 무엇일까요?
두가지 방안이 있습니다.
- 값을 하나만 반환한다.
-
return balance, left_drink
이 부분을return balance
로 변경합니다.
-
- 잔액이 그대로인 경우 리턴값과 리턴 결과를 받는 부분을 수정한다.
- 잔액이 모자란경우 left_drink를 추가해서 반환한다.
return money, left_drink
로 수정한다. 그리고money = buy(sel - 1)
를money, _ = buy(sel - 1)
로 수정할 수 있습니다.
- 잔액이 모자란경우 left_drink를 추가해서 반환한다.
아래는 수정된 코드입니다.
def show_menu(): print() print("[자판기 판매 메뉴]") for i in range(0, len(drink_menu)): if i%10==0: print() print("|",i+1,".",drink_menu[i],":",drink_price[i],"|",end=" ") def buy(num): if money < drink_price[num]: print("잔액이 부족합니다. 잔액 : %d" % money) return money else: print(drink_menu[num], " 구입완료") balance = money - drink_price[num] left_drink[num] = left_drink[num]-1 print("잔액 : ", balance) return balance def drink(num): if left_drink[num]<1: print("음료가 모두 소진되었습니다.") else: pass if __name__ == '__main__': drink_menu = ("생수","생수","생수","레몬워터","레몬워터","옥수수 수염차","옥수수 수염차", "우엉차","트레비","트레비", "밀키스","펩시","핫식스","사이다","코코리치(망고)","코코리치(망고)","Lipton","트로피카나 스파클링(청사과)", "트로피카나 스파클링(청사과)","트로피카나 스파클링(포도)", "가나초콜릿음료","가나초콜릿음료","레쓰비","레쓰비", "칸타타","레쓰비 카페타임","게토레이","게토레이","코코팜","잔치집 식혜") drink_price = (600,600,600,1500,1500,1300,1300,1300,1000,1000,800,800,1000,1000,1000,1000,1000,1000,1000,1000,600,600,600,600,1000,1000,800,800,800,800) left_drink = [1,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10] money = 0 money = int(input("돈을 투입하세요 : ")) while True: show_menu() sel = int(input("\n메뉴 번호를 선택하세요 (종료 : 0) : ")) if sel == 0: break elif (sel >= 1 and sel <= len(drink_menu)): money = buy(sel - 1) else: print("잘못된 메뉴 번호입니다") print("자판기 종료, 잔액 %d 반환" % money) change_money_1000 = money // 1000 change_money_500 = (money - (change_money_1000 * 1000)) // 500 change_money_100 = (money - (change_money_1000 * 1000) - (change_money_500 * 500)) // 100 print("1000원 짜리:", change_money_1000, "개", "500원짜리:", change_money_500, "개", "100원짜리:", change_money_100, "개")
- 값을 하나만 반환한다.
댓글 입력