这种比较的结果让我感到惊讶(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)
这里发生了什么?
我不清楚使用静态方法设计类的最佳方法是什么,这些方法可以覆盖.我将尝试用一个例子来解释.
我们有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) 找到计数器列表的联合的最佳方法(在可读性和效率方面)是什么?
例如,我的列表可能如下所示:
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)
有更好的方法吗?