除了检查序列中的成员资格外,是否可以使用Python中的`in`操作符?

ddl*_*dlj 1 python python-3.5

in Python中的运算符是一个成员运算符,用于测试序列中的成员资格.

in运营商的描述

如果在指定序列中找到变量,则求值为true,否则求值为false.

现在考虑代码:

>>>s = 'HELLO'
>>>char = 'M'
>>>char in s
False
>>>for char in s:
....    print(char)
H
E
L
L
O
Run Code Online (Sandbox Code Playgroud)

请在这里纠正我:我想声明for char in s应该检查'M''HELLO'其中进行评估,False并循环应该结束.但是在这里,它不是检查成员资格,而是将每个字符分配给变量char,因此循环打印每个字符.我的问题是,in除了检查会员资格外,如何使用运营商?

Rig*_*leg 5

in关键字用于两种不同的上下文:

  • 会员资格考试
  • 迭代

如你所说,第一个通过调用序列来检查某些东西是否属于一个序列__contains__.使用此语法时,将返回布尔值.

x = 1
l = [0, 1, 2]
if x in l:
    print("x is in l")
else:
    print("x is not in l")
Run Code Online (Sandbox Code Playgroud)
> x is in l

由于in查找__contains__方法,x in seq只要seq实现一个__contains__方法就有效.关于成员资格的概念,您可以实现这一点,即使它没有逻辑意义.

class Foo:
    def __contains__(self, x):
        return x == 12

f = Foo()
if 12 in f:
    print("12 is in f")
Run Code Online (Sandbox Code Playgroud)
> 12 is in f

第二个实际上更经常使用.根据迭代协议,它枚举可迭代对象的元素,以便可以对它们执行操作.

您可以迭代列表:

l = [0, 1, 2]
for x in l:
    print(x)
Run Code Online (Sandbox Code Playgroud)
> 0
> 1
> 2

在一个字符串:

s = "hello"
for c in s:
    print(c)
Run Code Online (Sandbox Code Playgroud)
> h
> e
> l
> l
> o

并且在实现该__iter__方法的任何对象上,只要后者返回实现该__next__方法的对象.

以下示例是一个基本的(不是说"差")range类,您可以迭代实例.

class Bar:
    def __init__(self, first, last):
        self.first = first
        self.last = last
        self.current = first

    def __iter__(self):
        return self

    def __next__(self):
        if self.current == self.last:
            raise StopIteration
        result = self.current
        self.current += 1
        return result

b = Bar(0, 5)
for i in b:
    print(i)
Run Code Online (Sandbox Code Playgroud)
> 0
> 1
> 2
> 3
> 4

许多本机类型都是可迭代的:字典,范围,集合 ......


从语义上讲,in在两种情境中使用相同的单词是有意义的."那东西是这个东西吗?" 是一个有效的问题,只要"stuff"是一个集合,它能够包含东西.从此以后,"为那东西中的每一件事做这件事"似乎很自然.

因此,对于两种情境都使用"in".

然而,这实际上是对现实的简化,实际上更为广阔.我邀请您阅读文档,并深入了解该in关键字,阅读Python的语法.