質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

363閲覧

pythonで型のエラー

NatsukiKataoka

総合スコア7

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/08/21 05:44

編集2019/08/21 12:35

前提・実現したいこと

pythonで自動販売機のモデルみたいなのを作っています。しかしinputの型はstring だと知っていても型についてのエラーが出てしまいます。どうしたらよろしいでしょうか?

発生している問題・エラーメッセージ

--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-4-5d5168a40431> in <module> 38 return returnOrNot 39 ---> 40 moneyPut = decide('a') 41 # __________________________________________________________________ 42 #自動販売機の飲み物の種類をタプル型で表示 NameError: name 'decide' is not defined

該当のソースコード

python

1from datetime import date 2#todayに日付を入れる 3today = date.today() 4#Drinkクラスを作成 5class Drink: 6 def __init__(self, name, price, count): 7 self.name = name 8 self.price = price 9 self.count = count 10 self.lamp = False 11#お金を返却させるための関数 12 def returnMoney(self, moneyToReturn): 13 if int(moneyPut) > 1: 14 return str(moneyToReturn) + "円が返却されます。" 15 self.moneyPut = '0' 16#ランプ表示の関数 17 def SoldOutLamp(self): 18 if self.count == 0: 19 self.lamp = True 20 else: 21 self.lamp = False 22 23 if self.lamp == False: 24 return 'can buy' 25 else: 26 return 'sold out' 27 def decide(self, i): 28 if i == 'a': 29 moneyPut = int(input('put money')) 30 return moneyPut 31 elif i == 'b': 32 liquid = int(input('what to drink? 0:cola, 1:water, 2:tea')) 33 return liquid 34 else: 35 returnOrNot=int(input('返金しますか? 0:Yes, 1:No :')) 36 return returnOrNot 37 38moneyPut = decide('a') 39# __________________________________________________________________ 40#自動販売機の飲み物の種類をタプル型で表示 41cola = Drink('cola', 150, 40) 42water = Drink('water', 100, 3) 43tea = Drink('tea', 140, 0) 44 45#これらをdrinksでまたタプルにする 46drinks = (cola, water, tea) 47#ここでお金を入れる 48# decide('a') 49 50#ここで飲み物を選ぶ 51liquid = decide('b')

やりたいこと

●目標_______________________________
1. 必要金額が投入されている場合に、飲み物ボタンが押されると缶を出す
2. 売切れランプの追加(売切れの時は購入できない)
もし可能ならなぜエラーが出てきてしまうのか教えてもらうことって可能でしょうか?
本当にお願いします!
またクラスの中の関数を使って出されたliquidという数字を使ってdrinks[liquid].name のような事ってできますか?

### 補足情報(FW/ツールのバージョンなど) python 3.73です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2019/08/21 05:55

「NameError: name 'decide' is not defined」エラーが発生します。 第三者が実行、検証できるコードを提示ください。
t_obara

2019/08/21 06:38

自動販売機モデルというのであれば、自動販売機クラスする方が分かりやすいかと思います。各Drinkの個数や自動販売機に投入された金額の把握、何が購入されたかなどをそのクラスに管理させるのが良いかと思います。 また、decideを引数で処理を分ける理由が無いですし、名称と処理内容に齟齬が出るのでは無いでしょうか。3つの関数にした方が分かりやすくなるかと思います。
guest

回答2

0

ベストアンサー

おそらく,以下のliquid変数がNoneであることが原因であると思われます.

liquid = decide('b')

decide関数をみてみると,標準入力から数字を受け取った際に何も値を返していないので,ここを修正することで正しい挙動に近づくと思われます.
以下のように関数で何らかの値を返すように変更してみてください.

def decide(self, i): """ 何らかの処理 """ return liquid

投稿2019/08/21 06:15

noconocolib

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NatsukiKataoka

2019/08/21 12:28

from datetime import date #todayに日付を入れる today = date.today() #Drinkクラスを作成 class Drink: def __init__(self, name, price, count): self.name = name self.price = price self.count = count self.lamp = False #お金を返却させるための関数 def returnMoney(self, moneyToReturn): if int(moneyPut) > 1: return str(moneyToReturn) + "円が返却されます。" self.moneyPut = '0' #ランプ表示の関数 def SoldOutLamp(self): if self.count == 0: self.lamp = True else: self.lamp = False if self.lamp == False: return 'can buy' else: return 'sold out' def decide(self, i): if i == 'a': moneyPut = int(input('put money')) return moneyPut elif i == 'b': liquid = int(input('what to drink? 0:cola, 1:water, 2:tea')) return liquid else: returnOrNot=int(input('返金しますか? 0:Yes, 1:No :')) return return # class ForReceipt: # def __init__(self, name, price, count): # super().__init__(name, price, count) #親クラスのコンストラクタを実行 class ReceiptFor(Drink): def message1(self): message1 = (drinks[liquid].name + 'を買うためにお金を' + str(moneyPut) + "入れました。") return message1 def message2(self, letter): if letter == 'a': message2 = ('しかし'+ drinks[liquid].name +'を買うためのお金が足りないため買えませんでした。レシートは以上です。') return message2 elif letter == 'b': message2 = ("あなたの残高は{}円です。".format(str(moneyPut))) return message2 def message3(self, letter): if letter == 'a': message3 = 'なにもなし' return message3 else: message3 = ('しかし'+ drinks[liquid].name +'を買うための在庫がないため買えませんでした。レシートは以上です。') return message3 def message4(self, letter): if letter == 'a': message4 = 'なにもなし' return message4 else: message4 = (returnMoney(moneyPut)) return message4 moneyPut = (decide('a')) # __________________________________________________________________ #自動販売機の飲み物の種類をタプル型で表示 cola = Drink('cola', 150, 40) water = Drink('water', 100, 3) tea = Drink('tea', 140, 0) #これらをdrinksでまたタプルにする drinks = (cola, water, tea) #ここでお金を入れる # decide('a') #ここで飲み物を選ぶ liquid = decide('b') すみませんこれでもうまくいかなくて....もし構わなければ教えてもらう事ってきますか?
noconocolib

2019/08/22 00:45

手元ではどういったエラーになりますか? ちなみにdecide関数がDrinkクラスの中に定義されてしまっているので,このコードの呼び出し方だとNameError: name 'decide' is not definedなどと言ったエラーになりそうです. これは,decide関数をDrinkクラスの外で定義することで回避できそうです.
guest

0

def decide()で値(liquid、moneyPut)を返していないのでエラーになっていると思います。

投稿2019/08/21 05:56

meg_

総合スコア10579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問