Что значит "потреблять" в Python? В итераторе?

Я работаю в Python уже несколько месяцев, и мне пришло в голову, что я часто пропускаю словарь, который ускользает от меня с первого взгляда, вместо этого пытается понять суть идеи. Теперь, оглядываясь назад, я все еще смущаюсь из-за веры в то, о чем говорит термин "потребление". Мой первоначальный интерес исходил от объяснений итераторов, которые говорили о ценности потребляемого итератора. Однако, оглядываясь, это не кажется обычным явлением в лексиконе Python. Или это? Здесь можно найти ссылки на веб-службы и одно или два обсуждения того, как скрыть тот или иной результат функции.

Полагаю, тогда, чтобы разрушить мое невежество в несколько базовых точек:

  • Использует ли "употребление" разные вещи в разных контекстах Питонов?
  • Что происходит с данными, когда оно потребляется, например, в iter()?
  • Когда переменной присваивается результат итератора - якобы потребляемая часть данных - не принадлежит ли она итератору?
  • Можете ли вы использовать более одного значения из объекта итератора в одном вызове итератору?

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

EDIT: Еще одна вещь... сохраняется ли повторяющееся значение (при вызове с next())?

Ответ 1

Относительно 2.

На самом деле мы должны различать два случая.

Помните, что написал Грег Хьюглилл:

"Итератор" - это один объект, который отвечает для создания некоторой последовательности элементов. Эта последовательность может быть элементом существующего списка, или может быть что-то рассчитано, как простые числа или десятичные цифры π.

Первый случай:

итератор вычисляет объект, который он должен произвести при стимуляции; т.е. созданный объект не существовал до вызова next(). Следовательно, если имя присваивается объекту, это будет выживать; если нет, объект будет существовать без привязки к имени в пространстве имен в течение определенного времени, а затем он исчезнет в памяти, то есть бит, который он занимает, будет использоваться для другого объекта позже или раньше.

Второй случай

- это когда итератор возвращает ранее существовавшие объекты, принадлежащие списку, кортежу, словарю и т.д. В этом случае каждый объект, созданный next(), уже имеет привязку к имени. Тогда, если объекту присваивается новое имя, когда он "выскочит" из итератора, будет два имени, привязанных к объекту. И если объект не назначен имени, он будет по-прежнему привязан к одному имени, что достаточно для поддержания объекта в живых.

Общее:

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

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

Примечание:

Фактически, в случае объекта, ранее существовавшего в списке, скажем, может быть, что у него не было имени. Но список содержит ссылку на каждый объект, который он "содержит"... На самом деле список не содержит "объекты", а только ссылки на объекты... Ну, это выходит за рамки того, что я хотел сказать.

.

Относительно 3

Вы не должны писать 3: "Когда переменной присваивается..."

Переменная слова - это ошибка в Python, поскольку она имеет двусмысленное значение. В Python нет переменных, известных в других языках, то есть "ограниченная часть памяти, значение которой может меняться". Есть только объекты. Слово переменная обычно используется для обозначения идентификатора. Поэтому лучше назвать его идентификатором или именем. Это позволяет избежать путаницы.

.

Относительно 4

Я не думаю, что можно получить два возвращения из итератора только с одним вызовом next()

Ответ 2

Термин "потреблять" является неофициальным термином, который ссылается на то, как итераторы работают на Python. "Итератор" - это один объект, который отвечает за создание некоторой последовательности элементов. Эта последовательность может быть элементом существующего списка, или может быть что-то вычислено, как простые числа или десятичные цифры & pi;.

Когда вызывающий абонент запрашивает "следующий" элемент из итератора, итератор предоставляет следующий элемент, а затем изменяет свое собственное состояние, после чего он готов к выпуску следующего элемента после этого. Обычно это то, что вы ожидаете.

Если у меня есть генератор, который производит последовательность возрастающих простых чисел, то в первый раз, когда я его назову, я получу 2 взамен. В следующий раз я получу 3. Если я дам вам ссылку на этот генератор, вы его назовете (для того, что вы думаете в первый раз) и получите 5. Нет никакого способа "reset" генератор, чтобы он начинался с 2 снова, за исключением создания совершенно нового экземпляра генератора. В этой ситуации я могу сказать, что я уже потреблял первые два элемента, прежде чем дать вам генератор.

Ответ 3

Я не эксперт Python, но могу сказать следующее: большую часть времени потребление в программировании противоположно производству. Вы можете классифицировать некоторые процессы как производителей, которые создают ценности; и другие как потребители, которые используют ценности, созданные производителями.

В случае итератора итератор является производителем, который проходит через итерируемый объект и "производит" каждое значение, по очереди, по порядку. Чтобы "потреблять" данные из итератора просто означает использовать его.

Ответ 4

Итераторы - это просто объекты, которые поддерживают методы __iter__ и next. Общий прецедент для итераторов - это цикл над ними, где каждый раз через цикл результат iterator.next() присваивается переменной.

С учетом этого вызов iterator.next() можно назвать "потреблением значения", потому что в общем случае вызов next изменяет состояние итератора, и нет способа вернуться к предыдущему государство.

Тем не менее, нет ничего, что мешало бы итератору неоднократно возвращать одно и то же значение или даже предлагать способ возврата к предыдущему состоянию. В тех случаях использование слова "потреблять" может быть не таким, как применимо.

Насколько это происходит с данными, которые возвращаются методом iterator next, он полностью зависит от реализации итератора. Генераторы склонны отбрасывать результаты, которые они дают, но если контейнер также является итератором, тогда данные, возвращаемые при вызове next(), все еще будут существовать в объекте-контейнере.

Ответ 5

Я могу ответить на ваш первый вопрос, чтобы потреблять это, чтобы вывести итерируемое, это означает, что можно запустить итерацию из следующих элементов.

Ответ 6

Использует ли "употребление" разные вещи в разных контекстах Питона?

Нет, "употребление" всегда делает то же самое.

Что происходит с данными, когда оно потребляется, например, в iter()?

Он больше не доступен из того места, где вы его получили.

Когда переменной присваивается результат итератора - якобы потребляемая часть данных - не принадлежит ли она итератору?

Правильно. Как только итератор создает данные, данные больше не принадлежат итератору.

Можете ли вы использовать более одного значения из объекта итератора в одном вызове на итераторе?

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