2017-03-17 41 views
-2

我是Python新手,我知道“in”这个词是用来查看一个字符串是否是另一个字符串的子字符串。但是当我使用这样的“in”时,发生了一些有线事件:我的python“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子句是“真”?它不应该是假的吗?任何人都可以帮助我?提前致谢。

回答

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

((("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或零或一个空的容器或一些其他方式falsey对象)

如果你要检查一切都在发电机是真实的,你可以使用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

您的问题的一种不同的方法。

你喂养("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) 

以上结果为真。即对于for循环的每次迭代,您都会追加“False”。
因此,if中的以下语句被执行。

print c 
print "Something wrong"