我是Python的新手,我知道“in”这个词用于查看字符串是否是另一个字符串的子字符串。但是,当我像这样使用“in”时,发生了一些事情:
Input:
c=['1234444', '56788888', '99999900']
print "dddd" in c[0]
print "ffffff" in c[1]
print np.arange(len(c)-1 )
if((("ddd" in c[i]) and ("fffff" in c[i+1]))for i in np.arange(len(c)-1 )):
print c
print "Something wrong"
Output:
False
False
[0 1]
['1234444', '56788888', '99999900']
Something wrong
为什么if子句是“True”?不应该是假的吗?有人可以帮帮我吗?提前谢谢。
答案 0 :(得分:2)
此
((("ddd" in c[i]) and ("fffff" in c[i+1]))for i in np.arange(len(c)-1 ))
是一个发电机。
如果你这样做
if((("ddd" in c[i]) and ("fffff" in c[i+1]))for i in np.arange(len(c)-1 ))
你没有迭代生成器,你基本上是在说“这个生成器是什么东西*”,它就是这样。
(*其中“某事物”不是None
或零或空容器或其他一些虚假对象)
如果要检查生成器中的所有内容是否为真,可以使用all
。
if all((("ddd" in c[i]) and ("fffff" in c[i+1]))for i in np.arange(len(c)-1 ))
如果要检查生成器中是否有任何内容,可以使用any
。
if any((("ddd" in c[i]) and ("fffff" in c[i+1]))for i in np.arange(len(c)-1 ))
答案 1 :(得分:1)
你制作了一个生成器表达式但是你不会循环它。生成器对象不是空的'所以True
。否则,生成器表达式中的表达式永远不会执行。
例如:
>>> gen = (False for _ in range(0)) # always false *and* empty
>>> bool(gen)
True
也许您在寻找any()
function?如果它的任何值为真,它将遍历其参数并返回True
:
if any("ddd" in c[i] and "fffff" in c[i+1]) for i in np.arange(len(c)-1)):
print "Never reached"
有相应的all()
function。
答案 2 :(得分:1)
对您的问题采用不同的方法。
你正在喂("ddd" in c[i])
,这会导致"错误"和("fffff" in c[i+1])
也会产生"错误"如果声明。
基本上你说的是
if((False and False)for i in np.arange(len(c)-1 )):
现在,假和假=假
>>> False and False
False
所以你的if语句减少为
if( False for i in np.arange(len(c)-1 )):
以上列表理解等同于:
temp = []
for i in np.arange(len(c)-1 ):
temp.append(False)
以上结果为True。即你正在附加" False" for for循环的每次迭代 因此if中的以下语句被执行。
print c
print "Something wrong"