Python 'in' 运算符与 'for' 循环和 'if' 语句

Python 'in' operator with 'for' loop and with 'if' statement

我正在使用 python in 运算符与 for 循环和 if 陈述。我的问题是 in 是如何实现的,它在这两种情况下的行为不同:它在使用 for 循环时进行迭代,并检查是否存在某些元素使用 with if 语句时?这是否取决于 forif?

的实施
    for i in x:
        #iterates

    if i in x:
        #checks weather i in x or not 

in关键字通常是一个运算符:

print(2 in [1, 2, 3])  # True
if 3 in range(7, 20):
   print('3 in range!')

对应object.__contains__特殊方法。表达式 a in b 对应于 type(b).__contains__(a)。请注意,ab 都是查找的名称。

for 语句中,in 不是 运算符。它是 for .. in .. 语法的一部分,将循环变量 name 与可迭代对象分开。

for thing in range(20):
    print(thing)  # thing is something else on each step

请注意,for a in b 只有 b 是查找的名称。 a 是要绑定的名称,类似于赋值语句。


Python 语法有几种构造,其中前导关键字定义了后续关键字的含义。例如,as 关键字在 importwith 中具有不同的含义:

# as aliases ExitStack
from contextlib import ExitStack as ContextStack

# as holds the result of ContextStack().__enter__()
with ContextStack() as stack:
    ...

不是通过实现而是通过意义来思考这样的关键词是有帮助的。例如,a in b 总是表示“a 包含在 b”。

原因是 for...inin 不同。

for x in y 遍历 y.

if x in y 呼叫 y.__contains__(x).

python中的关键字"in"根据"for"和"if"解决了不同的用途。请查看 this related link in stack overflow 以更清楚地了解

in 的成员资格测试是通过 __contains__ 方法实现的(参见 Documentation)。不同的行为来自之前的关键字,forif 在你的例子中。

使用 for 的迭代是这样实现的,即调用方法 next 并将其 return 值写入迭代变量,只要关键字 for 是真的。一般的会员测试只是一个条件。

代码

A in B

执行

B.__contains__(A)  # returns boolean

代码

for A in B :
    # Body

执行

A = B.next()
if B.__contains__(A) :
    # Body

A = B.next()
if B.__contains__(A) :
    # Body

# ...

A = B.next()
if B.__contains__(A) :
    # B.next() throws "StopIteration" if there is no more element

在许多语言中,您会发现具有多种用途的关键字。这只是一个例子。从 语句 的角度思考可能比像运算符那样思考 in 关键字更有帮助。

语句 x in y 是一个布尔值语句,当且仅当 x 的值在集合 y。它是用y.

__contains__成员函数实现的

语句 for x in y: 开始一个循环,其中每次迭代 x 从集合 y 中获取不同的值。这是使用 y__next____iter__ 成员函数在生成的迭代器对象上实现的。

还有其他语句可以出现 in 关键字,例如列表理解或生成器理解。