【问题标题】:Python 'in' operator with 'for' loop and with 'if' statement带有“for”循环和“if”语句的 Python 'in' 运算符
【发布时间】:2019-06-05 01:36:53
【问题描述】:

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

    for i in x:
        #iterates

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

【问题讨论】:

    标签: python if-statement for-in-loop


    【解决方案1】:

    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 中”。

    【讨论】:

    • @Nane 请为对您有帮助的答案投票,并接受最能回答您问题的答案。
    【解决方案2】:

    原因是for...inin 不同。

    for x in y 迭代 y

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

    【讨论】:

      【解决方案3】:

      python中的关键字“in”根据“for”和“if”解决了不同的目的。请查看this related link in stack overflow 以获得更清晰的信息

      【讨论】:

        【解决方案4】:

        in 的成员资格测试是通过__contains__ 方法实现的(请参阅Documentation)。不同的行为来自之前的关键字 forif 在您的情况下。

        使用for 的迭代是这样实现的,只要关键字for 之后的条件为真,就会调用next 方法并将其返回值写入迭代变量。一般来说,会员资格测试只是一个条件。

        代码

        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
        

        【讨论】:

        • 如果B.next() 返回A,则不需要if B.__contains__(A):。如果我错了,请纠正我。
        【解决方案5】:

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

        语句x in y 是一个布尔值语句,当且仅当x 的值在集合y 中时采用(假设y 是某个适当的集合)True。它是用y__contains__成员函数实现的。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-26
          • 2023-03-30
          相关资源
          最近更新 更多