小编flo*_*ake的帖子

为什么9007199254740993!= 9007199254740993.0?

这种比较的结果让我感到惊讶(CPython 3.4):

>>> 9007199254740993 == 9007199254740993.0
False
Run Code Online (Sandbox Code Playgroud)

我对文档的理解是左操作数应该被转换float为匹配右操作数的类型:

Python完全支持混合算术:当二进制算术运算符具有不同数值类型的操作数时,具有"较窄"类型的操作数被扩展为另一个的操作数,其中整数比浮点更窄,这比复数更窄.混合类型数量之间的比较使用相同的规则.构造函数int(),float()和complex()可用于生成特定类型的数字.

这似乎没有发生:

>>> float(9007199254740993) == 9007199254740993.0
True
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

python floating-point numbers comparison-operators

7
推荐指数
1
解决办法
390
查看次数

静态方法和继承设计

我不清楚使用静态方法设计类的最佳方法是什么,这些方法可以覆盖.我将尝试用一个例子来解释.


我们有Goat一个方法类can_climb.(顺便说一下,这是Python 3,在Python 2中我会写class Goat(object):.)

class Goat:
    def __init__(self, *args):
        ...

    def can_climb(self, mountain):
        return mountain.steepness < 10

billy = Goat("Billy")
if billy.can_climb(mount_everest):
    print("wow Billy, impressive")
Run Code Online (Sandbox Code Playgroud)

这按预期工作,但该方法can_climb不使用self.使它成为静态方法看起来更干净,而且pylint甚至会对上述方法发出警告.所以让我们改变一下:

class Goat:
    def __init__(self, *args):
        ...

    @staticmethod
    def can_climb(mountain):
        return mountain.steepness < 10

billy = Goat("Billy")
if billy.can_climb(mount_everest):
    print("wow Billy, impressive")
Run Code Online (Sandbox Code Playgroud)

billy.can_climb接近结束可以代替,Goat.can_climb并且在这个例子中它不会有所作为.有些人甚至可能会认为通过类而不是实例调用静态方法更清晰,更直接.

但是,当我们使用继承并引入多态时,这会导致一个微妙的错误:

class Goat:
    def __init__(self, *args):
        ...

    @staticmethod
    def can_climb(mountain):
        return mountain.steepness < 10

class MountaineeringGoat(Goat):
    @staticmethod
    def …
Run Code Online (Sandbox Code Playgroud)

python polymorphism inheritance static-methods

7
推荐指数
2
解决办法
6989
查看次数

许多柜台的联盟

找到计数器列表的联合的最佳方法(在可读性和效率方面)是什么?

例如,我的列表可能如下所示:

counters = [Counter({'a': 6, 'b': 3, 'c': 1}),
            Counter({'a': 2, 'b': 5}),
            Counter({'a': 4, 'b': 4}),
            ...]
Run Code Online (Sandbox Code Playgroud)

我想计算联合,即counters[0] | counters[1] | counters[2] | ....

一种方法是这样做:

def counter_union(iterable):
    return functools.reduce(operator.or_, iterable, Counter())
Run Code Online (Sandbox Code Playgroud)

有更好的方法吗?

python counter

3
推荐指数
1
解决办法
864
查看次数