Python не имеет встроенного метода isiterable() для проверки, является ли объект итерируемым или нет. Но есть несколько способов, с помощью которых можно определить, является ли объект итерируемым. Некоторые из подходов являются дорогостоящими операциями, а некоторые иногда не осуществимы в использовании.
Является ли объект итерируемым
Чтобы проверить, является ли объект итерируемым в Python, используйте метод iter(). Python iter() — это встроенная функция, которая возвращает итератор для данного объекта.
Метод iter() — это наиболее точный способ проверить, является ли объект итерируемым, и обработать исключение TypeError, если это не так.
Синтаксис функции iter() следующий.
|
1 |
iter(object, sentinel) |
Пример
|
1 2 3 4 5 6 7 8 |
data = ["Upendra", "Arjun", "Nikunj"] try: object_iterator = iter(data) except TypeError as te: print(data, "is not iterable") else: print(data, "is iterable") |
Вывод:
|
1 |
['Upendra', 'Arjun', 'Nikunj'] is iterable |
Давайте назначим целое число переменной данных и проверим итерацию.
|
1 2 3 4 5 6 7 8 |
data = 21 try: object_iterator = iter(data) except TypeError as te: print(data, "is not iterable") else: print(data, "is iterable") |
Вывод:
|
1 |
21 is not iterable |
Проверка с помощью коллекций в Python
Чтобы проверить, является ли объект итерируемым в Python, используйте абстрактный класс Iterable модуля collections. Модуль collections предоставляет некоторые абстрактные базовые классы, которые позволяют запрашивать классы или экземпляры, предоставляют ли они определенную функциональность.
Python isinstance() — это встроенный метод, который возвращает True, если указанный объект имеет указанный тип. В противном случае возвращается False. Мы будем использовать абстрактный класс Iterable и метод isinstance(), чтобы проверить, является ли объект итерируемым или нет в Python.
Чтобы работать с классом Iterable, нам нужно сначала его импортировать.
|
1 |
from collections.abc import Iterable |
Теперь давайте определим целое число, которое не является итерируемым, но давайте проверим его, используя класс Iterable и метод isinstance() с оператором if-else в Python.
|
1 2 3 4 5 6 7 8 |
from collections.abc import Iterable data = 12 if isinstance(data, Iterable): print("The data is iterable") else: print("The data is not iterable") |
Запустите программу и посмотрите вывод.
|
1 |
The data is not iterable |
Как видите, мы получили правильный ответ: целое число в Python не является итерируемым типом данных.
Теперь давайте назначим список переменной данных, которая является итерируемой, и посмотрим, какой результат она возвращает.
|
1 2 3 4 5 6 7 8 |
from collections.abc import Iterable data = ["Rick", "and", "Morty"] if isinstance(data, Iterable): print("The data is iterable") else: print("The data is not iterable") |
Вывод:
|
1 |
The data is iterable |
Да, список является итерируемым, что означает, что наш способ определить, является ли объект итерируемым, верен.
Почему метод коллекций не является полным решением
Проверка итерируемого объекта с помощью метода isinstance(obj, Iterable) обнаруживает классы, зарегистрированные как Iterable или имеющие метод __iter__(), но не обнаруживает классы, которые выполняют итерацию с помощью метода __getitem__().
Единственный точный подход — определить, является ли объект итерируемым, — это вызвать iter(obj).
Утиная типизация
Утиная типизация — это концепция, связанная с динамической типизацией, где тип или класс объекта менее важны, чем определяемые им методы. Когда вы используете утиную типизацию, вы вообще не проверяете типы. Вместо этого вы проверяете наличие заданного метода или атрибута.
|
1 2 3 4 5 6 7 8 9 10 |
data = ["Rick", "and", "Morty"] try: iterator = iter(data) except TypeError: # not iterable print("The data is not iterable") else: # iterable print("The data is iterable") |
Вывод:
|
1 |
The data is iterable |
Теперь, если вы присвоите переменной данных целое число, она будет выполняться, кроме блока с ошибкой типа.
|
1 2 3 4 5 6 7 8 9 10 |
data = 21 try: iterator = iter(data) except TypeError: # not iterable print("The data is not iterable") else: # iterable print("The data is iterable") |
Вывод:
|
1 |
The data is not iterable |
Как и ожидалось, утиная типизация отлично работает, когда дело доходит до определения того, является ли переменная итерируемой или нет.

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