Что означает этот сегмент кода? - PullRequest
1 голос
/ 30 марта 2020

Я пытаюсь реализовать функцию в python, которая принимает входные данные итерируемые и проходит через них для выполнения какой-либо операции. Я был озадачен тем, как обрабатывать разные итерации (пример: списки и словари не могут быть зациклены одним и тем же общим способом), поэтому я заглянул в библиотеку statistics в python и обнаружил, что они обрабатывают эту ситуацию следующим образом: -

def variance(data, xbar=None):
    if iter(data) is data:        #<-----1
        data = list(data)
    ...

тогда они обрабатывают data как список повсюду.

Итак, мой вопрос: -

  • Что означает (1 ); и
  • Является ли это правильным методом, так как он каждый раз делает новый список из данных. Разве они не могут просто использовать итератор для l oop через данные?

1 Ответ

3 голосов
/ 30 марта 2020

iter(something) возвращает объект итератора, который возвращает элементы something. Если something уже является итератором, он просто возвращает его без изменений. Таким образом,

if iter(data) is data:

- это способ определить, является ли data объектом итератора. Если это так, он преобразует его в список всех элементов.

Это происходит потому, что после кода требуется реальный список элементов. Есть вещи, которые вы можете сделать со списком, которые вы не можете сделать с помощью итератора, например, элементы доступа, определенные c, элементы вставки / удаления и l oop над ним несколько раз. Итераторы могут обрабатываться только последовательно.

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