Python оператор in с циклом for и оператором if - PullRequest
0 голосов
/ 10 января 2019

Я использую оператор python in с для цикла и с if оператором. Мой вопрос заключается в том, как в реализовано, что он ведет себя по-разному в этих двух случаях: он повторяется при использовании для цикла и проверяет, существует ли какой-то элемент при использовании с if заявление? Зависит ли это от реализации для и , если ?

    for i in x:
        #iterates

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

Ответы [ 5 ]

0 голосов
/ 10 января 2019

Во многих языках вы найдете ключевые слова, которые имеют многократное использование. Это просто пример этого. Вероятно, более полезно думать в терминах операторов , чем думать о ключевом слове in как об операторе.

Оператор x in y является оператором с логическим значением, принимающим (при условии, что y является некоторой подходящей коллекцией) True тогда и только тогда, когда значение x находится в коллекции y. Он реализован с помощью функции-члена __contains__ y.

Оператор for x in y: запускает цикл, где каждая итерация x принимает значение, отличное от коллекции y. Это реализовано с использованием функции-члена __iter__ y и __next__ в результирующем объекте итератора.

Есть и другие операторы, где может появляться ключевое слово in, например, понимание списка или понимание генератора.

0 голосов
/ 10 января 2019

Членское тестирование с in осуществляется по методу __contains__ (см. Документация ). Различное поведение происходит от ключевого слова ранее, for и if в вашем случае.

Итерация с for реализована таким образом, что вызывается метод next и его возвращаемое значение записывается в переменную итерации, если условие после ключевого слова for выполняется. В общем, членство в тестировании - это просто условие.

Код

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
0 голосов
/ 10 января 2019

Причина в том, что for...in - это нечто отличное от in.

for x in y перебирает y.

if x in y звонки y.__contains__(x).

0 голосов
/ 10 января 2019

Ключевое слово "in" в python решает различные задачи на основе "for" и "if". пожалуйста, посмотрите эту связанную ссылку в переполнении стека для большей ясности

0 голосов
/ 10 января 2019

Ключевым словом 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). Обратите внимание, что a и b являются именами, которые ищутся.

В операторе for in является , а не оператором. Он является частью синтаксиса for .. in .. и отделяет переменную цикла name от повторяемого.

for thing in range(20):
    print(thing)  # thing is something else on each step

Обратите внимание, что for a in b only b - это имя, которое ищется. a - имя для привязки, похожее на оператор присваивания.


Синтаксис Python имеет несколько конструкций, где ведущее ключевое слово определяет значение следующих ключевых слов. Например, ключевое слово as имеет другое значение в import и with:

# 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».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...