Пропустить до содержимого

Как использовать оператор in в Python?

CodeMDD.io

Операторы “in” и “not in” в Python: проверка на принадлежность

Python’s in и not in операторы позволяют быстро определить, является ли заданное значение частью коллекции значений или нет. Этот тип проверки распространен в программировании и известен как “тест на принадлежность” в Python. Поэтому эти операторы известны как “операторы принадлежности”.

В этом руководстве вы узнаете, как:

  • Выполнять тесты на принадлежность с использованием операторов in и not in
  • Использовать in и not in с различными типами данных
  • Работать с operator.contains(), эквивалентной функцией к оператору in
  • Обеспечить поддержку in и not in в вашем собственном классе

Начало работы с тестами на принадлежность в Python

Иногда вам нужно определить, присутствует ли значение в коллекции значений или нет. Другими словами, вам нужно проверить, является ли заданное значение членом коллекции значений или нет. Этот тип проверки обычно известен как тест на принадлежность.

Рассмотрим следующую функцию is_member():

def is_member(value, iterable):
for item in iterable:
if value is item or value == item:
return True
return False

Чтобы продемонстрировать работу функции is_member(), рассмотрим следующий пример использования:

>>> numbers = [1, 2, 3, 4, 5]
>>> is_member(3, numbers)
True
>>> is_member(6, numbers)
False

В этом примере мы создаем список чисел [1, 2, 3, 4, 5] и затем выполняем тест на принадлежность с помощью функции is_member(). Мы проверяем, является ли число 3 членом списка чисел, и получаем ответ True. Затем мы проверяем, является ли число 6 членом списка чисел, и получаем ответ False.

Хотя функция is_member() работает, она может быть неудобной для использования. В Python есть специальные операторы in и not in, которые делают проверку на принадлежность более простой и удобной.

Использование операторов in и not in с различными типами данных

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

Списки, кортежи и диапазоны

Списки, кортежи и диапазоны являются итерируемыми типами данных в Python, что означает, что вы можете выполнить итерацию по их элементам. Операторы in и not in позволяют вам проверить, находится ли заданное значение в списке, кортеже или диапазоне.

Рассмотрим следующий пример:

>>> numbers = [1, 2, 3, 4, 5]
>>> 3 in numbers
True
>>> 6 in numbers
False
>>> fruits = ('apple', 'banana', 'cherry')
>>> 'apple' in fruits
True
>>> 'orange' in fruits
False
>>> r = range(1, 6)
>>> 3 in r
True
>>> 6 in r
False

В этом примере мы создаем список numbers [1, 2, 3, 4, 5], кортеж fruits ('apple', 'banana', 'cherry') и диапазон от 1 до 6 r. Затем мы используем операторы in и not in для проверки на принадлежность значениям в этих структурах данных. Мы проверяем, являются ли числа 3 и 6 членами списка numbers, и получаем ответы True и False соответственно. Затем мы проверяем, являются ли слова “apple” и “orange” членами кортежа fruits, и получаем ответы True и False соответственно. Наконец, мы проверяем, являются ли числа 3 и 6 членами диапазона r, и получаем ответы True и False соответственно.

Операторы in и not in просты в использовании и позволяют вам легко проверять на принадлежность элементов списка, кортежа или диапазона.

Строки

Строки являются итерируемыми типами данных, поэтому операторы in и not in также работают с ними. Они позволяют вам проверить, содержит ли строка заданное подстроку или нет.

Рассмотрим следующий пример:

>>> message = "Hello, world!"
>>> "Hello" in message
True
>>> "Python" in message
False

В этом примере мы определяем строку message "Hello, world!". Затем мы используем операторы in и not in для проверки, содержит ли строка подстроки “Hello” и “Python”. Мы получаем ответы True и False соответственно.

Операторы in и not in могут быть полезными при поиске определенных слов или фраз в текстовых строках.

Генераторы

Генераторы в Python - это специальные объекты, которые создают элементы по мере необходимости, вместо того чтобы хранить их все сразу в памяти. Они также являются итерируемыми типами данных и поддерживают использование операторов in и not in.

Рассмотрим следующий пример:

>>> squares = (x**2 for x in range(1, 6))
>>> 9 in squares
True
>>> 6 in squares
False

В этом примере мы создаем генератор squares, который генерирует квадраты чисел от 1 до 5. Затем мы используем операторы in и not in для проверки наличия чисел 9 и 6 среди сгенерированных значений. Мы получаем ответы True и False соответственно.

Операторы in и not in позволяют вам проверять наличие элементов в генераторах, не храня все значения в памяти.

Словари и множества

Словари и множества также являются итерируемыми типами данных в Python, но они имеют особенности в использовании операторов in и not in.

Словари

Когда вы используете оператор in с словарем, он проверяет наличие ключа в словаре, а не его значений. Оператор not in проверяет отсутствие ключа.

Рассмотрим следующий пример:

>>> student = {
... "name": "John",
... "age": 20,
... "grade": "A"
... }
>>> "name" in student
True
>>> "score" in student
False

В этом примере мы создаем словарь student со следующими ключами и значениями: “name” со значением “John”, “age” со значением 20 и “grade” со значением “A”. Затем мы используем операторы in и not in для проверки наличия ключей “name” и “score” в словаре student. Мы получаем ответы True и False соответственно.

Оператор in позволяет вам проверять наличие ключей в словаре, что может быть полезно при работе с данными.

Множества

Множества представляют собой наборы уникальных элементов в Python. Оператор in работает с множествами и позволяет вам проверить наличие элемента в множестве.

Рассмотрим следующий пример:

>>> colors = {"red", "green", "blue"}
>>> "red" in colors
True
>>> "yellow" in colors
False

В этом примере мы создаем множество colors с элементами “red”, “green” и “blue”. Затем мы используем оператор in для проверки наличия цветов “red” и “yellow” в множестве. Мы получаем ответы True и False соответственно.

Оператор in позволяет вам быстро проверить, является ли элемент частью множества.

Применение операторов in и not in в действии

Операторы in и not in могут быть использованы для различных задач в Python. Рассмотрим некоторые примеры применения этих операторов.

Замена цепных операторов or

Возьмем, например, следующий код:

>>> grade = 85
>>> if grade >= 70 or grade <= 100:
... print("Passed")
...
Passed

В этом примере мы использовали цепные операторы or для проверки, входит ли оценка в диапазон от 70 до 100 включительно. Оператор or позволяет выполнять проверку на принадлежность нескольких значений, но он может стать неудобным и сложным для чтения, особенно при большом количестве значений.

Оператор in позволяет сделать эту проверку более удобной:

>>> grade = 85
>>> if grade in range(70, 101):
... print("Passed")
...
Passed

В этом примере мы используем оператор in для проверки, входит ли оценка в диапазон от 70 до 100. Мы получаем тот же результат, что и в предыдущем примере, но при этом код становится более понятным и легким для чтения.

Написание эффективных тестов на принадлежность

При выполнении тестов на принадлежность в Python есть несколько способов сделать их более эффективными.

  1. Используйте итерируемые типы данных с непостоянным временем выполнения доступа к элементам, такими как множества или генераторы. Это ускоряет проверку на принадлежность, особенно для больших коллекций.

  2. Используйте функцию operator.contains(). Эта функция является эквивалентом оператора in и может быть полезна, если вы хотите использовать результат проверки на принадлежность в других операциях.

Использование функции operator.contains() для тестов на принадлежность

Функция operator.contains() предоставляет альтернативный способ выполнения тестов на принадлежность в Python. Она принимает два аргумента: контейнер и элемент. Функция возвращает True, если элемент присутствует в контейнере, и False в противном случае.

Рассмотрим следующий пример:

>>> import operator
>>> numbers = [1, 2, 3, 4, 5]
>>> operator.contains(numbers, 3)
True
>>> operator.contains(numbers, 6)
False

В этом примере мы импортируем модуль operator и используем функцию operator.contains() для выполнения тестов на принадлежность числам в списке numbers. Мы получаем те же результаты, что и с использованием операторов in и not in.

Функция operator.contains() может быть полезна, если вы хотите использовать результат проверки на принадлежность в других операциях или применить функциональный стиль программирования.

Поддержка тестов на принадлежность в пользовательских классах

Если вы создаете собственные классы в Python, вы можете добавить поддержку операторов in и not in с помощью специальных методов __contains__() и __iter__().

Метод __contains__() позволяет определить, входит ли заданный элемент в экземпляр вашего класса. Метод должен возвращать True, если элемент принадлежит экземпляру класса, и False в противном случае.

Метод __iter__() должен возвращать итератор, используемый для итерации по элементам экземпляра класса. Это позволяет вашему классу быть итерируемым, что в свою очередь позволяет использовать оператор in для проверки на принадлежность.

Рассмотрим следующий пример:

class MyList:
def __init__(self, values):
self.values = values
def __contains__(self, item):
return item in self.values
def __iter__(self):
return iter(self.values)
numbers = MyList([1, 2, 3, 4, 5])
print(3 in numbers) # True
print(6 in numbers) # False

В этом примере мы создаем класс MyList с методами __contains__() и __iter__(). Метод __contains__() проверяет, входит ли заданный элемент в экземпляр класса, путем использования оператора in. Метод __iter__() возвращает итератор для итерации по элементам экземпляра класса. Затем мы создаем экземпляр класса MyList с числами [1, 2, 3, 4, 5] и выполняем тесты на принадлежность с использованием операторов in и not in.

Это позволяет вашему классу поддерживать операторы in и not in и использовать их для выполнения тестов на принадлежность.

Заключение

Python предоставляет удобные операторы in и not in, которые позволяют вам выполнять тесты на принадлежность различным типам данных. Эти операторы облегчают проверку, является ли заданное значение частью коллекции значений. Они работают с такими типами данных, как списки, кортежи, строки, генераторы, словари и множества. Операторы in и not in могут быть использованы для различных задач, включая замену цепных операторов or, написание эффективных тестов на принадлежность, использование функции operator.contains() и поддержку тестов на принадлежность в пользовательских классах.

Надеюсь, что этот руководство поможет вам лучше понять и использовать операторы in и not in в Python. Удачи с вашими проектами на Python!