【问题标题】:How does the "in" and "not in" statement work in python“in”和“not in”语句在python中是如何工作的
【发布时间】:2017-08-16 07:38:57
【问题描述】:

我主要学习 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 <target> in <iterable><expr> in <expr> 没有太多共同之处,只是这两种语法都以相同的顺序使用字母 in
  • not x in array 也可以,但not in 更具可读性。 innot in 都是运算符。正如 Martijn Pieters 所说,for … in 是无关的,in 不是那里的运营商;相反,它是for 语法的一部分。这与 Python 是一种解释型语言无关。
  • 如果你学过C,你应该对编译器和词法分析了解一两点吧?嗯,这两种类型的语句在这个意义上是完全不同的......它们只是以完全不同的方式编译......
  • 我的问题更多是关于python如何处理这两者,而不是哪种方式更好
  • 任何语言都一样。某些关键字有多种用途,编译器知道如何根据上下文处理它们。取C中的extern关键字。

标签: python


【解决方案1】:

您混淆了两个完全不相关的语法。

一个是语句,请参阅for statement 文档。 in 是固定语法的一部分:

for_stmt ::=  “for” target_list “in” expression_list “:” suite
              [“else” “:” suite]

当您使用for 开始一行时,需要in 部分,就像需要: 一样。不要将 Python 的 for 与 C 的 for 循环混淆; Python 是For Each construct。因此它不会“产生”一个可迭代对象,它需要一个可迭代对象作为输入。

另一个是membership test operation,运算符是一种表达式

运算符innot in 测试成员资格。

它适用于容器(不仅仅是可迭代对象)。

两者都严重依赖 Python 的 OO 特性,这是 C 无法做到的。如果您想找到其他语言的等价物,请查看 C++、Java 或 C# 中的概念,而不是 C。

for <expr> in <iterable> 接受一个iterable object,一个可以产生元素的东西,一个接一个。 C++ 有一个equivalent concept,在Java 中有iteratorsstreams 的相似之处。

<expr> [not] in <expr> 只要求右手表达式结果支持成员资格测试,但如果没有明确的钩子可用于成员资格测试,Python 将退回到迭代。 not in 中的 not 只是简单地反转了 in 操作的结果。

C++ 和 Java 对此没有标准抽象,不同的容器类型各自实现自己的拼写(在 C++ 中,大多数人称之为find,例如set::findmap::find,而Java 通常选择contains 变体,给出你Set.contains()Map.containsKey())。

【讨论】:

    【解决方案2】:

    for x in array: 与 c++11 中引入的range based for loop 没有太大区别。 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 进行比较。当然,某些类型的容器可以有特定的重载以提高性能,但重要的是它可以被实现。

    【讨论】:

      猜你喜欢
      • 2016-11-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2012-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多