2017-01-19 2 views
1

in Pythonの演算子は、シーケンスのメンバシップをテストするメンバーシップ演算子です。それはそうでない場合は指定されたシーケンスと偽で変数を見つけた場合inオペレータシーケンス内のメンバシップをチェックする以外に、Pythonの `in`演算子を使用できますか?

説明がtrueと評価します。

は、今のコードを考えてみます。

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

ここに私を修正してください: を私は声明for char in sFalseに評価されなければならないとループが終了しなければならない'HELLO''M'をチェックするべきだと思います。しかしここでは、メンバシップをチェックする代わりに、すべての文字を変数charに割り当てているので、ループはすべての文字を出力しています。 私の質問は、どのようにin演算子は、メンバーシップをチェックする以外に使用することができますか?

+1

あなたが必要とする主なものの存在のために、すべてのリストの要素をテストしますここで思うには、キーワード 'n'を使用すると、それはcharまたはループのすべての行を再定義します。 –

答えて

5

inキーワードが2つの異なるコンテキストで使用されている:あなたが言ったようにそれを呼び出すことにより、チェック何かがシーケンスに属している場合、最初の

  • 会員テスト
  • 反復

配列__contains__。この構文を使用すると、ブール値が返されます。 in以来

> x is in l

x = 1 
l = [0, 1, 2] 
if x in l: 
    print("x is in l") 
else: 
    print("x is not in l") 

__contains__メソッドを実装し seq限り x in seqが有効である、 __contains__方法を探します。メンバーシップの概念に関しては論理的な意味を持たなくても実装できます。
> 12 is in f

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

f = Foo() 
if 12 in f: 
    print("12 is in f")

は、実際にはより頻繁に使用されています。 iteration protocolによれば、iterableオブジェクトの要素を列挙し、そのオブジェクトに対してアクションを実行することができます。文字列が経つにつれて

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

あなたは、リストを反復処理することができます

> h 
> e 
> l 
> l 
> o

そして__iter__メソッドを実装する任意のオブジェクトの上に

s = "hello" 
for c in s: 
    print(c)
限り、後者のリターン __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)
> 0 
> 1 
> 2 
> 3 
> 4

ネイティブ型の多くは反復可能です:dictionariesrangessets ...


は意味的に言えば、それは両方のコンテキストに同じin言葉を使うことは理にかなっています。 「このことがそのようなものですか?」 「もの」が物を含むことができるコレクションである限り、有効な質問です。それ以来、「そのことのすべてのことに対してこれを行う」はかなり自然なようです。

したがって、両方のコンテキストに「in」を使用します。

しかし、これは現実のかなり単純化ですが、実際はもっと広大です。 documentationをお読みいただき、inキーワードの詳細についてはPython's grammarをお読みください。

0

__contains __()メソッドを持つオブジェクトであれば、 "in"演算子を使用できます。 DIR()関数またははhasattr()あなたは、そのオブジェクトの「中」演算子を使用することができるかどうかをチェックすることができます関数を使用して

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

あなたがここに考える必要がある主なものは、そのあなたの場合は、キーワードinforループで使用すると、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」

+0

2番目の例の最後の行の 'chr in char:'を意味しましたか、それとも間違っているのでしょうか? –

+0

charは "M"、chrはリスト内の要素なので、正しい方法です。 –

+0

これらの変数の名前を変更して、より意味をなさないようにします。 –

関連する問題