python 为什么num.is_integer()函数返回false

2uluyalo  于 2023-02-11  发布在  Python
关注(0)|答案(4)|浏览(182)
class Item:
    pay_rate = 0.8 # The pay after %20 discount
    all = []
    def __init__(self, name: str, price: float, quantity=0):
        #Run validations to the recieved arguments
        assert price >= 0, f"Price {price} is not greater than or equal tozero!"
        assert quantity >= 0, f"Quantity {quantity} is not greater than or equal to zero!"

        # Assign to self object
        self.name = name
        self.price = price
        self.quantity = quantity

        #Actions to execute

        Item.all.append(self)

    def calculate_total_price(self):
        return self.price * self.quantity

    def apply_discount(self):
        self.price = self.price * self.pay_rate

    @classmethod
    def instantiate_from_csv(cls):
        with open('items.csv', 'r') as f:
            reader = csv.DictReader(f)
            items = list(reader)
        for item in items:
        Item(
                name=item.get('name'),
                price=float(item.get('price')),
                quantity=int(item.get('quantity')),
            )
    @staticmethod
    def is_integer(num):
        #We will count out the floats that are .0
        if isinstance(num, float):
            #Count out the floats that are point zero
            return num.is_integer()
        elif isinstance(num, int):
            return True
        else:
            return False

    def __repr__(self):
        return f"Item('{self.name}', {self.price}, {self.quantity})"

我目前正在学习python,并试图理解OOP的概念。除了下面几行之外,我都理解了

def is_integer(num):
    #We will count out the floats that are .0
    if isinstance(num, float):
        #Count out the floats that are point zero
        return num.is_integer()
    elif isinstance(num, int):
        return True
    else:
        return False

有人能解释一下为什么num.is_integer()返回False吗?该函数的定义目的是从100.0或50.0这样的浮点数中删除.0(教程中是这么说的)
这是我第一次遇到这种类型的返回用法。我习惯于返回a*B或返回'Hi'类型的东西。

bxpogfeg

bxpogfeg1#

如果你的is_integer()函数返回False,那是因为你传递了一个浮点数,其中有一个重要的小数部分,或者是一些既不是int也不是float的对象。
您可能会发现对该函数的此更改很有用:

def is_integer(n):
    if __debug__:
        print(type(n))
    return n.is_integer() if isinstance(n, float) else isinstance(n, int)
yqlxgs2m

yqlxgs2m2#

首先,这种类型的回报没有什么不寻常的。举个例子:

  1. return 'Hi'-返回字符串“Hi”
  2. return a * b-假设a=3,B=5,它计算a*b并返回结果,15
  3. return num.is_integer()-检查数字是否为整数,并返回结果True或False
    关于is_integer()的一个注意事项,它会说5050.0都是整数,尽管严格地说,在Python中50是一个int数据类型50.0是一个float数据类型,如果你带着这些知识阅读下面的代码,那么它似乎做了同样的事情,除了你会用Item.is_integer(50)调用它。
def is_integer(num):
    #We will count out the floats that are .0
    if isinstance(num, float):
        #Count out the floats that are point zero
        return num.is_integer()
    elif isinstance(num, int):
        return True
    else:
        return False
6yjfywim

6yjfywim3#

我正在学习同样的教程,实际上我来这里是为了理解同样的事情。从我所查找的内容来看,由于教程中的编写方式,这里存在一些混乱。对于像我们这样的初学者来说,这看起来像一个递归函数,整个过程似乎处于循环中,而实际上它并不是,is_integer()是一个预定义函数(文档链接:https://python-reference.readthedocs.io/en/latest/docs/float/is_integer.html
在我看来,一种更好的写法是将函数定义为check_integer或其他类型,这样就不会有任何歧义。

@staticmethod
def check_int(num): #this is better than using "def is_integer(num)"
    #we will count out the floats that end with .0 e.g 5.0,10.0 etc.
    if isinstance(num,float):
        #count out floats with point zero
        return num.is_integer()
    if isinstance(num,int):
        return True
    else:
        return False
aiazj4mn

aiazj4mn4#

只需要记住,具有相同名称和不同参数的函数是不同的
在我们的案例中

is_integer(num): user-defined function #which is defined by us
is_integer(): inbuilt function #which is used inside the function

我也在freecodecamp youtube频道遵循相同的教程,使用python https://www.youtube.com/watch?v=Ej_02ICOIgs&t=968s进行面向对象编程
在1:09:00时间戳,我遇到了类似的困惑,所以我单独运行并理解了它,我们没有从num中删除任何.0,我们使用了递归。
内部使用的. is_integer()函数(不带参数)是内置函数enter link description here
因此,内置函数通常会删除.0存在,并对整数返回true,对指针值返回false。为了更好地理解,我检查了几个输入
对于整数

检查浮动

检查看起来像12.0

的整数

相关问题