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

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

ただいまの
回答率

87.37%

pythonで型のエラー

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 627

前提・実現したいこと

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

該当のソースコード

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 returnOrNot  

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')

やりたいこと

●目標___________________________

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

補足情報(FW/ツールのバージョンなど)

python 3.73です。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • can110

    2019/08/21 14:55

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

    キャンセル

  • t_obara

    2019/08/21 15:38

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

    キャンセル

回答 2

checkベストアンサー

0

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

liquid = decide('b')

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

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

  return liquid

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/21 21: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')

    すみませんこれでもうまくいかなくて....もし構わなければ教えてもらう事ってきますか?

    キャンセル

  • 2019/08/22 09:45

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

    これは,decide関数をDrinkクラスの外で定義することで回避できそうです.

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る