Python不能将-1识别为False?

时间:2015-03-18 14:39:59

标签: python

我最近写了一个使用的Python程序:

if s.find('something'): 

if s.find('something')==True:

但在我使用之前没有任何工作正常:

if s.find('something') >0

这是我在我的计划中获得准确的真正决定的唯一方法。

似乎-1结果未被识别为False。成功的发现也不被认为是真的。所以寻找-1(假)或正数> 0(真)是唯一对我有用的东西。

我做错了什么?这不是Python的工作方式,可以吗?

6 个答案:

答案 0 :(得分:12)

您正在错误地解释find的返回值。文档说明:

  

<强> str.find(sub[, start[, end]])

     

返回找到子字符串sub的字符串中的最低索引,以使sub包含在切片s[start:end]中。可选参数start和end被解释为切片表示法。如果找不到-1,请返回sub

在所有数字中,Python仅考虑0 to be false; -1 is true。当find返回匹配开头的索引,0是字符串的有效索引时,如果未找到匹配项,则返回-1。

因此,您的代码应该是*:

if s.find('something') != -1: 

if s.find('something') >= 0:

虽然它们也不是Pythonic中最多的,但如果您只想查看s是否包含'something' - 请参阅下文。


现在,关于你的第二个例子:bool常数False比较等于0

>>> 0 == False
True

bool常量True仅等于数字1

>>> 1 == True
True
>>> 2 == True
False

因此,s.find('something') == True表达式与s.find('something') == 1完全等效;只有当True的格式为s时才会将整个表达式计算为xsomethingxxxx,并且从第2个字符(索引1)开始匹配something。< / p>


str.find的文档继续以下注释:

  

注意

     

仅当您需要知道find()的位置时,才应使用sub方法要检查sub是否为子字符串,请使用in运算符:

>>> 'Py' in 'Python'
True

因此,你问题中问题最为Pythonic的形式是

if 'something' in s:

根据@myaut的建议,如果您需要<{1}}在'something'内的位置并希望它包含该值,则应使用str.index代替,如果在字符串中找不到s,则会抛出异常。

substring

答案 1 :(得分:2)

Python认为0False,而不是-1

正如您在Python documentation中所看到的,Python努力尝试使用许多不同类型的False值:

  • False
  • None
  • 0任何数字类型:00L0.00j
  • 任何空序列:''()[]
  • 任何空映射:{}

你在Python中-1应该是False的直观概念是有道理的,但这不是Python的设计方式。 Python中的零和空洞都是假的。

答案 2 :(得分:0)

如果您只想检查字符串是否包含在另一个字符串中,请使用:

if 'something' in s:
    print 'something in %s' % s
else:
    print 'bad luck'

答案 3 :(得分:0)

-1,因为错误代码来自C,但这导致意大利面条代码检查返回值。

Python有更可靠的方式来报告错误:raise an Exception。即str.index这样做:

>>> 'abcde'.find('cd')
2
>>> 'abcde'.index('cd')
2
>>> 'abcde'.find('zx')
-1
>>> 'abcde'.index('zx')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: substring not found

当然要检查字符串是否包含子字符串,您应该使用in运算符:

>>> 'ab' in 'abcde'
True
>>> 'zx' in 'abcde'
False

说到if语句,你应该注意到与boolean相比是一个坏主意(检查例如PEP-8)。

Python中的每个类型都定义了自己的规则,这些规则考虑了哪些值&#34; True&#34;:Truth value testing

答案 4 :(得分:0)

验证它的bool值的最快方法;

bool(-1)
True

bool(0)
False

bool('')
False

等等,

答案 5 :(得分:0)

你没有做错事。

在python bool继承自intFalse0True1。您可以尝试int(True)int(False)。如果您尝试bool(0),您将获得False,但如果您写bool(-1)bool(1),您将始终获得True。如果您使用find,则会获得-1,因此您需要使用>= 0。您可以在'something'内找到'something else'

你可以写if 'something' in s:。我认为该发布已被弃用。