表达式中的Python“in”关键字与for循环中的[重复]

Posted

技术标签:

【中文标题】表达式中的Python“in”关键字与for循环中的[重复]【英文标题】:Python 'in' keyword in expression vs. in for loop [duplicate] 【发布时间】:2016-11-07 08:15:52 【问题描述】:

我了解in 运算符在这段代码中的作用:

some_list = [1, 2, 3, 4, 5]
print(2 in some_list)

我也明白i 将采用此代码中列表的每个值:

for i in [1, 2, 3, 4, 5]:
    print(i)

我很好奇for 循环中使用的in 运算符是否与第一个代码中使用的in 运算符相同。

【问题讨论】:

重复或相关:***.com/q/25573715/1639625 infor..in 是两种不同的语言结构。 【参考方案1】:

它们是相同的概念,但不是相同的运算符。

print(2 in some_list) 示例中,in 是一个处理几种不同情况的运算符。 Python docs for the in operator 给出了详细信息,我将其解释如下:如果y 具有__contains__ 成员函数,则x in y 调用y.__contains__(x)。否则,x in y 尝试遍历 y.__iter__() 以找到 x,或者如果 __iter__ 不存在,则调用 y.__getitem__(x)。复杂性在于为旧代码和新代码提供一致的成员资格测试 - 如果您要实现自己的类,__contains__ 就是您想要的。

for 循环中,in 只是一个标记,用于将循环索引变量与您正在循环的任何内容分开。 Python docs for the for loop 讨论语义,我将其解释如下:in 之后的任何内容都在循环开始时进行评估以提供迭代器。然后循环体针对迭代器的每个元素运行(除非 break 或其他控制流更改)。 for 语句不用担心__contains____getitem__

编辑 @Kelvin 提出了一个很好的观点:您可以针对您自己的新型类 (class foo(object)) 更改 in 的行为:

更改x in y、define y.__contains__()。 更改for x in y,define y.__iter__()

【讨论】:

赞成,因为您可以通过定义 __contains__ 来更改第一种 in 的行为 它的措辞对我来说意味着运算符和关键字是分开的,尽管我认为它几乎相同或者运算符也是关键字。 @syntonym 已修复 - 谢谢 :) 我发现你可以做for...else,所以我觉得for循环中使用的inin示例中的in基本相同. @Novice 这是一个非常容易理解的猜测:)。差异是微妙但真实的。例如,__contains__ 不会被 for 循环调用。无论如何,编码愉快!【参考方案2】:

不,不一样。 in 测试与您的第一个示例一样,是对成员资格的测试,并返回一个真值。这个in 可能被认为是==is 的顺序类似物(取决于__contains__ 的实现方式)。

第二个示例中的in 是迭代语法的一部分;它临时将您选择的变量i 绑定到可迭代对象中的每个项目。这个in 可能被认为是赋值运算符= 的顺序类似物。

【讨论】:

【参考方案3】:

不,尽管他们都使用同一个词,但他们做的事情却不同。 in 在这两种情况下都是语法结构,例如它不是对象的名称,不能更改。你可以看到here和here每一个的语法定义。如您所见,名称是硬编码的,没有任何关系。

【讨论】:

以上是关于表达式中的Python“in”关键字与for循环中的[重复]的主要内容,如果未能解决你的问题,请参考以下文章

python中的while循环与for循环怎么样那个比较好用?

Robot Framework --- FOR循环语句

python中的for循环相当于scratch中的啥循环?

Python分支,循环,break和continue

Python学习基础:for 循环 与 range()函数

python流程控制