我最近写了一个使用的Python程序:
if s.find('something'):
或
if s.find('something')==True:
但在我使用之前没有任何工作正常:
if s.find('something') >0
这是我在我的计划中获得准确的真正决定的唯一方法。
似乎-1结果未被识别为False。成功的发现也不被认为是真的。所以寻找-1(假)或正数> 0(真)是唯一对我有用的东西。
我做错了什么?这不是Python的工作方式,可以吗?
答案 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认为0
是False
,而不是-1
。
正如您在Python documentation中所看到的,Python努力尝试使用许多不同类型的False
值:
False
None
0
任何数字类型:0
,0L
,0.0
,0j
。''
,()
,[]
。{}
。你在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
继承自int
。 False
为0
,True
为1
。您可以尝试int(True)
和int(False)
。如果您尝试bool(0)
,您将获得False
,但如果您写bool(-1)
或bool(1)
,您将始终获得True
。如果您使用find
,则会获得-1
,因此您需要使用>= 0
。您可以在'something'
内找到'something else'
。
你可以写if 'something' in s:
。我认为该发布已被弃用。