[英]How does the “in” and “not in” statement work in python
我主要在C学习,花了很多时间了解它的实施情况。 但我最近开始学习python。 所以这里有许多不同于C的怪癖。
'in'语句如何在python中工作?
if x in array:
#the usage of an in statement produces a boolean
for x in array:
#the usage of an in statement produces an iterable
另外作为一个附带问题。 'not'可以放在布尔表达式的前面,类似于'!' 在C或它可以放在python中'in'语句的前面。 这怎么可能?
if not x == 5:
#makes sense because 'x == 5' evaluates to a boolean
if x not in array:
#the statement 'in array' is not a boolean
#shouldn't it be 'if not x in array'
这些都有可能吗? 它们的评估方式是否应该保持一致? 现在,我认为这是因为Python是一种解释型语言,解释器可以根据周围的语法做不同的事情。
对解释的解释或链接将非常有用,我一直无法找到解决此问题的任何内容。
你混淆了两个完全不相关的语法。
一个是声明 ,请参阅for
语句文档。 in
是固定语法的一部分:
for_stmt ::= “for” target_list “in” expression_list “:” suite
[“else” “:” suite]
您使用的时刻for
开始一条线, in
部分是必需的,正如:
是必需的。 不要混淆Python的for
与C for
循环; Python是For Each构造 。 因此它不会“生成”可迭代的,它需要一个可迭代的输入。
另一种是成员资格测试操作 ,运算符是一种表达式 :
运营商
in
和not in
测试的成员。
它适用于容器(不仅仅是迭代)。
两者都严重依赖于Python的OO性质,这是C无法做到的。 如果要查找其他语言的等价物,请查看C ++,Java或C#中的概念,而不是C语言。
for <expr> in <iterable>
获取一个可迭代的对象 ,这个对象可以一个接一个地生成元素。 C ++有一个等价的概念 ,在Java中, 迭代器和流中有相似之处。
<expr> [not] in <expr>
只要求右手表达式结果支持成员资格测试,但如果没有可用于成员资格测试的显式挂钩,Python将回退到迭代。 该not
在not in
简单地反转的结果in
操作。
C ++和Java对此没有标准抽象,不同的容器类型各自实现自己的拼写(在C ++中大多数称之为find
,例如set::find
或map::find
,而Java通常选择contains
变体,给你Set.contains()
和Map.containsKey()
)。
for x in array:
的for x in array:
与基于 c ++ 11中引入的循环的范围没有太大差别。 c ++中的语法也非常相似:
int a[] = {0, 1, 2, 3, 4, 5};
for (int n : a) // the initializer may be an array
std::cout << n << ' ';
该语句if x in a:
和for x in a:
不会有很多工作要做对方,他们只是拥有同一个词in
,但它有不同的含义。
您可以很容易地想象如何在c ++中实现类似于if x in a:
的功能 - 例如使用std :: find 。 另一种方法是迭代容器并将每个元素与x
进行比较。 某些类型的容器可能存在特定的重载,以使其当然具有更高的性能,但重要的是它可以实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.