相关疑难解决方法(0)

Python比较运算符<和>如何使用函数名作为操作数?

抛出这个问题(在Python 2.7.5中)有一点错字:

def foo(): return 3
if foo > 8:
    launch_the_nukes()
Run Code Online (Sandbox Code Playgroud)

当它,我不小心爆炸了月亮.

我的理解是,E > F相当于(E).__gt__(F)和表现良好的类(如内置)相当于(F).__lt__(E).

如果没有__lt____gt__运营商那么我认为Python使用__cmp__.

但是,这些方法都与工作function对象,而<>运营商的工作.引擎盖下发生了什么?

>>> foo > 9e9
True
>>> (foo).__gt__(9e9)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'function' object has no attribute '__gt__'
>>> (9e9).__lt__(foo)
NotImplemented
Run Code Online (Sandbox Code Playgroud)

python

16
推荐指数
1
解决办法
741
查看次数

在平等比较不同的数据类型时,我可以使Python抛出异常吗?

假设我想比较两个不同数据类型的变量:string和int.我在Python 2.7.3和Python 3.2.3中都测试了它,并且都没有抛出异常.比较的结果是False.在这种情况下,我可以使用不同的选项配置或运行Python以引发异常吗?

ks@ks-P35-DS3P:~$ python2
Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a="123"
>>> b=123
>>> a==b
False
>>> 
ks@ks-P35-DS3P:~$ python3
Python 3.2.3 (default, Apr 12 2012, 19:08:59) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a="123"
>>> b=123
>>> a==b
False
>>> 
ks@ks-P35-DS3P:~$ 
Run Code Online (Sandbox Code Playgroud)

python error-handling types exception

5
推荐指数
2
解决办法
2400
查看次数

为什么{} | [] |()| str | set | etc.> n等于python2.x中的True?

我在尝试比较时注意到了这一点:

if len(sys.argv) >= 2:
    pass
Run Code Online (Sandbox Code Playgroud)

但我做到了这一点仍然是真的(花了我一些时间来找到这个bug.):

if sys.argv >= 2: # This is True!!!
    pass
Run Code Online (Sandbox Code Playgroud)

以下是一些例子:

>>> {} > 2
True
>>> [] > 2
True
>>> () > 2
True
>>> set > 2
True
>>> str > 2
True
>>> enumerate > 2
True
>>> __builtins__ > 2
True
>>> class test:
...     pass
... 
>>> test
<class __main__.test at 0xb751417c>
>>> test > 2
True
Run Code Online (Sandbox Code Playgroud)

在python3.x中它会导致TypeError.

python comparison python-2.7

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

澄清比较不同类型的对象

以下句子对我来说是一个混乱的原因(来自Guido在python.org上的教程):

"请注意,比较不同类型的对象是合法的.结果是确定性的但是随意的:类型按名称排序.因此,列表总是小于字符串,字符串总是小于元组,等等"一个元组等."

这意味着:

a=[90]
b=(1)
a<b
Run Code Online (Sandbox Code Playgroud)

结果应该是True.但事实并非如此!你可以帮助我吗?不是一个元组,等等."

另外,"结果是确定的但是随意的"是什么意思?

python

0
推荐指数
1
解决办法
1098
查看次数

为什么0 <()在Python中评估为True?

我无意中输入time.clock<()了Python 2.7解释器响应:True.以下代码举例说明了该行为:

>>> repr(time.clock)
'<built-in function clock>'
>>> time.clock<()
True
Run Code Online (Sandbox Code Playgroud)

此外:

>>> import sys
>>> sys.maxint < ()
True

>>> map(lambda _:0<_,((),[],{}))
[True, True, True]
Run Code Online (Sandbox Code Playgroud)

相反:

>>> 1<set(())
TypeError: can only compare to a set
Run Code Online (Sandbox Code Playgroud)

问题:除了为什么,是否存在空洞的实际意义或目的list,tupledict评估好像是否大于任何数字?


更新:

  • Viktor指出默认情况下会比较内存地址:

    >>> map(lambda _:(id(0),'<',id(_)),((),[],{}, set([])))

    [(31185488L, '<', 30769224L), (31185488L, '<', 277144584L), (31185488L, '<', 279477880L), (31185488L, '<', 278789256L)]

尽管看似顺序,但这是不正确的.


  • Martijn Pieters指出:

如果没有定义明确的比较运算符,Python 2将使用Numbers和Type-names进行比较,其中数字的优先级最低.

这并未暗示正在调用的内部方法.另见这个有用但不确定的SO线程:

在IPython 2.7.5 …

python collections comparison logic boolean

0
推荐指数
1
解决办法
265
查看次数