Python-将函数值转换为int或float以进行比较

因此,从本质上讲,我正在模拟一个钱箱,在其中放入硬币并建立用户信用,然后,当用户请求购买某项商品时,我会检查以确保他们对该商品有足够的信用度。

我遇到的问题是,当我进入haveYou函数时,我尝试比较价格和信用这两个值 在当前版本的代码中,Cash.box中的self.price只设置为35。 init ,以便Selector.select()中的if语句正常工作。

如果我在init函数中包含self.price = 0,它将保持该值并表示信用和价格相等,因此继续 如果我尝试返回self.credit> = self.price,并引用getPrice方法的返回值,则表示无法将int与函数值进行比较。我已经检查过,绝对是self.price成为问题。

所以我的问题是,如何将函数值转换为int,或者将getPrice的返回值设置为int开头?我看过了,但是Internet上的int变得如此饱和,以至于无法浮动到字符串内容,我对此一无所获。 我大约需要5个小时将自己的头撞在桌子上,非常感谢您的帮助。谢谢

import time
import sys

class CashBox(object):
    def __init__(self):
        self.credit = 0
        self.totalReceived = 0
        #self.price = 35

    def deposit(self,amount):
        self.credit = amount + self.credit
        self.totalReceived = amount + self.totalReceived
        print(self.credit)
        print(type(self.credit))
        return self.credit

    def returnCoins(self):
        print("Returning ",self.credit/100," dollars.")
        self.totalReceived = 0

    def haveYou(self,amount):
        price = Product.getPrice
        return self.credit >= price

    def deduct(self,amount):
        pass

    def totalCoins(self):
        return self.totalReceived

class CoffeeMachine(object): 

    def __init__(self):
        self.cashBox = CashBox()
        self.credit = CashBox.__init__
        self.selector = self.cashBox

    def oneaction(self):

        while True:
            command = input("""
            ______________________________________________________
            PRODUCT LIST: all 35 cents,except bouillon (25 cents)
            1=black,2=white,3=sweet,4=sweet & white,5=bouillon      
            Sample Commands: insert 25,select 1,cancel,quit.
            Your command: 
            """)
            words = command.lower().split()           
            if 'select' in words:
                Selector.select(self,int(words[1]))
            elif 'insert' in words:
                coinsAllowed = [5,10,25,50]
                if int(words[1]) in coinsAllowed:
                    self.cashBox.deposit(int(words[1]))
                else:
                    print("""
                    That is not one of the allowed coins,please insert a penny,nickel,dime,quarter,or half-dollar. Thank you.
                    """)
            elif 'cancel' in words:
                print("Cancelling transaction. Returning to main menu: ")
                self.cashBox.returnCoins()
            elif 'quit' in words:
                print("Have a nice day!")
                break
            else:
                print("That is not an option")

    def totalCash(self):
        return self.cashBox.totalReceived    

class Product(object):

    def __init__(self,name,price,recipe):
        self.name = name
        self.price = price
        self.recipe = recipe

    def getPrice(self):
        return self.price

    def make(self):
        for item in self.recipe:
            print("dispensing",item)
            time.sleep(0.5)
        print("Enjoy your",self.name)
        time.sleep(0.5)
        print(self.price)

class Selector(object):

    def __init__(self):
        #self.Product = Product()
        self.cashBox = CashBox()
        self.credit = CashBox.deposit
        #self.products.append(Product.

    def select(self,choiceIndex):
        recipes = {
            1 : ["Black coffee",35,["cup","coffee","water"]],2 : ["White coffee","creamer",3 : ["Sweet coffee","sugar",4 : ["White & Sweet coffee",5 : ["Bouillon",["cup bouillonPowder","water"]]
        }
        if choiceIndex in range(1,len(recipes)+1):
            if self.cashBox.haveYou(self.credit) == True:
                self.choiceIndex = choiceIndex
                self.recipe = recipes.get(choiceIndex)
                #print(self.recipe,"Great selection")
                product = Product(*self.recipe)
                price = CashBox.haveYou(*self.recipe)
                product.make()              
            else:
                print("You don't have enough credit for that,please insert more money.")
        else:
            print("That selection does not exist")

def main():
    m = CoffeeMachine()
    while m.oneaction():
        pass
    total = m.totalCash()
    print(f"Total Cash: ${total/100:.2f}")

if __name__ == "__main__":

取决于我在尝试什么: 取消注释self.price = 35

Exception has occurred: AttributeError
'int' object has no attribute 'price'
  File "C:\Users\Tanner Harmer\Desktop\Coffee2\CashBox.py",line 81,in getPrice
    return self.price
  File "C:\Users\Tanner Harmer\Desktop\Coffee2\CashBox.py",line 22,in haveYou
    price = Product.getPrice(self.price) + self.price
  File "C:\Users\Tanner Harmer\Desktop\Coffee2\CashBox.py",line 108,in select
    if self.cashBox.haveYou(self.credit) == True:
  File "C:\Users\Tanner Harmer\Desktop\Coffee2\CashBox.py",line 50,in oneaction
    Selector.select(self,int(words[1]))
  File "C:\Users\Tanner Harmer\Desktop\Coffee2\CashBox.py",line 122,in main
    while m.oneaction():
  File "C:\Users\Tanner Harmer\Desktop\Coffee2\CashBox.py",line 128,in <module>
    main()

或者如果我拥有

price = Product.getPrice  
return self.credit >= price
Exception has occurred: TypeError
'>=' not supported between instances of 'int' and 'function'
  File "C:\Users\Tanner Harmer\Desktop\Coffee2\CashBox.py",line 23,in haveYou
    return self.credit >= price
  File "C:\Users\Tanner Harmer\Desktop\Coffee2\CashBox.py",in <module>
    main()
yujunjie19860211 回答:Python-将函数值转换为int或float以进行比较

您需要在末尾添加()才能真正获得该值。

所以代替:

price = Product.getPrice  
return self.credit >= price

使用:

price = Product(<Here put the 3 values that this class needs>).getPrice()  
return self.credit >= price
,

如果准确性是关键(在金融中通常如此),则永远不要使用浮点数。相反,我建议您将货币存储为以便士数表示的整数。

例如,如果某人的银行帐户余额为$ 1,343.98,则您将其存储为134,398便士。每当将对象转换为字符串时,它都会得到一个漂亮的小数点。

import math

class PecuniaryPurse:
    currency_codes = frozenset((
        "EUR","USD","GBP","JPY","CHF","AUD","CAD"
    ))

    @classmethod
    def to_int(cls,amount):
        if isinstance(amount,cls):
            _amount_int = amount._amount
        else:
            _amount_flt = float(str(amount))
            _amount_int = int(amount)
            if not math.isclose(amount,_amount_flt):
                raise ValueError()
        return _amount_int

    def __init__(self,currency_code,_amount = 0):
        try:
            assert (currency_code in self.currency_codes)
            self._currency_code = currency_code
            self._amount = type(self).to_int(_amount)
        finally:
            pass

    def __str__(self):
        return ''.join(str(x) for x in (
                self._currency_code,"  ",str(self._amount // 100),".",str(self._amount % 100)
        ))

    def __add__(self,other):
        if isinstance(other,type(self)):
            assert(self._currency_code == other._currency_code)
            return type(self)(self._currency_code,self._amount + other._amount)
        else:
            other = type(self).to_int(other)
        return type(self)(self._currency_code,self._amount + other)

PP = PecuniaryPurse
p = PP("USD",1234) + PP("USD",99)
print(p) # USD  13.33
,
import time
import sys

class CashBox(object):
    def __init__(self):
        self.credit = 0
        self.totalReceived = 0
        #self.price = 35

    def deposit(self,amount):
        self.credit = amount + self.credit
        self.totalReceived = amount + self.totalReceived
        print(self.credit)
        print(type(self.credit))
        return self.credit

    def returnCoins(self):
        print("Returning ",self.credit/100," dollars.")
        self.totalReceived = 0

    def haveYou(self,name,price,recipe):
        return self.credit >= price

    def deduct(self,amount):
        pass

    def totalCoins(self):
        return self.totalReceived

class CoffeeMachine(object): 

    def __init__(self):
        self.cashBox = CashBox()
        self.credit = CashBox.__init__
        self.selector = self.cashBox

    def oneAction(self):

        while True:
            command = input("""
            ______________________________________________________
            PRODUCT LIST: all 35 cents,except bouillon (25 cents)
            1=black,2=white,3=sweet,4=sweet & white,5=bouillon      
            Sample Commands: insert 25,select 1,cancel,quit.
            Your command: 
            """)
            words = command.lower().split()           
            if 'select' in words:
                Selector.select(self,int(words[1]))
            elif 'insert' in words:
                coinsAllowed = [5,10,25,50]
                if int(words[1]) in coinsAllowed:
                    self.cashBox.deposit(int(words[1]))
                else:
                    print("""
                    That is not one of the allowed coins,please insert a penny,nickel,dime,quarter,or half-dollar. Thank you.
                    """)
            elif 'cancel' in words:
                print("Cancelling transaction. Returning to main menu: ")
                self.cashBox.returnCoins()
            elif 'quit' in words:
                print("Have a nice day!")
                break
            else:
                print("That is not an option")

    def totalCash(self):
        return self.cashBox.totalReceived    

class Product(object):

    def __init__(self,recipe):
        self.name = name
        self.price = price
        self.recipe = recipe

    def getPrice(self):
        return self.price

    def make(self):
        for item in self.recipe:
            print("dispensing",item)
            time.sleep(0.5)
        print("Enjoy your",self.name)
        time.sleep(0.5)
        print(self.price)

class Selector(object):

    def __init__(self):
        #self.Product = Product()
        self.cashBox = CashBox()
        self.credit = CashBox.deposit
        #self.products.append(Product.

    def select(self,choiceIndex):
        recipes = {
            1 : ["Black coffee",35,["cup","coffee","water"]],2 : ["White coffee","creamer",3 : ["Sweet coffee","sugar",4 : ["White & Sweet coffee",5 : ["Bouillon",["cup bouillonPowder","water"]]
        }
        if choiceIndex in range(1,len(recipes)+1):
            self.choiceIndex = choiceIndex
            self.recipe = recipes.get(choiceIndex)
            product = Product(*self.recipe)
            if self.cashBox.haveYou(*self.recipe) == True:
                #print(self.recipe,"Great selection")
                #price = CashBox.haveYou(*self.recipe)
                product.make()              
            else:
                print("You don't have enough credit for that,please insert more money.")
        else:
            print("That selection does not exist")

def main():
    m = CoffeeMachine()
    while m.oneAction():
        pass
    total = m.totalCash()
    print(f"Total Cash: ${total/100:.2f}")

if __name__ == "__main__":
    main()
本文链接:https://www.f2er.com/3169359.html

大家都在问