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

时间:2017-01-19 12:01:23

标签: python python-3.5

Python中的

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

in运营商

的说明
  

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

现在考虑代码:

>>>s = 'HELLO'
>>>char = 'M'
>>>char in s
False
>>>for char in s:
....    print(char)
H
E
L
L
O

请在此纠正我: 我认为语句for char in s应检查'M'中的'HELLO'哪个应该被评估为False,并且应该终止循环。但是在这里,它不是检查成员资格,而是将每个字符分配给变量char,因此循环打印每个字符。 我的问题是,除了检查成员资格之外,如何使用in运算符?

3 个答案:

答案 0 :(得分: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")
> 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")
> 12 is in f

第二种实际上更经常使用。根据{{​​3}},它枚举可迭代对象的元素,以便可以对它们执行操作。

您可以遍历列表:

l = [0, 1, 2]
for x in l:
    print(x)
> 0
> 1
> 2

字符串:

s = "hello"
for c in s:
    print(c)
> h
> e
> l
> l
> o

实现iteration protocol方法的任何对象,只要后者返回实现__iter__方法的对象。

以下示例是一个基本的(不是说"差的")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)
> 0
> 1
> 2
> 3
> 4

许多原生类型都是可迭代的:__next__dictionariesranges ......

从语义上讲,对两个上下文使用相同的in字是有意义的。 "这件东西是什么东西?"是一个有效的问题,只要" stuff"是一个集合,它能够包含东西。从此以后,"为那些东西中的每一件事做到这一点"看起来很自然。

因此使用""对于这两种情况。

然而,这实际上是对现实的简化,实际上更为广阔。我邀请您阅读sets,要深入了解in关键字,请阅读documentation

答案 1 :(得分:0)

具有__contains __()方法的任何对象都可以使用“in”运算符。通过使用dir()函数或hasattr()函数,您可以检查是否可以在该对象上使用“in”运算符

>>>dir(hw)
[...,__contains__,...]
>>>hasattr(hw,"__contains__")
True

答案 2 :(得分:0)

你需要考虑的主要事情是关键字in如果你在for循环中使用它,那么它将重新定义char或循环中的每一行。

所以要在你需要的循环中单独测试每个角色:

s = 'HELLO'
char = 'M'
for chr in s:
    if char in chr:
        print chr

但这有点毫无意义。您也可以使用if char=chr

但你可以像这样测试列表元素中的字符:

s = ['HELLO', 'MIKE', 'BOB']
char = 'M'
for word in s:
    if char in word:
        print word

将测试每个列表元素是否存在“M”