Лямбда как итератор в Python возвращает объект функции на первой итерации - PullRequest
1 голос
/ 10 июля 2019

У меня есть фрагмент кода, который я не могу понять:

>>> l = lambda: -4, 'c', 0
>>> i = iter(l)
>>> i
<tuple_iterator object at 0x00700CD0>
>>> next(i)
<function <lambda> at 0x0070A4F8>
>>> next(i)
'c'
>>> next(i)
0
>>> next(i)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>>

Почему он возвращает лямбда-объект на первой итерации вместо -4?

Ответы [ 2 ]

3 голосов
/ 10 июля 2019

Я думаю, вы могли неправильно понять, что такое l.

l - это кортеж из 3 элементов:

  • лямбда, которая возвращает -4
  • Строка c
  • целое число 0

Когда вы создаете итератор, выполняющий итерации по кортежу, конечно, первый вызов next даст вам лямбду!

Может быть, вы хотели назвать лямбду:

next(i)()

Или, может быть, вы хотели объявить l так:

l = lambda: (-4, 'c', 0) # you might think you don't need the parentheses, but you do

Лямбда, которая возвращает кортеж.

А потом сделай iter(l()).

3 голосов
/ 10 июля 2019

Когда вы делаете это:

>>> l = lambda: -4, 'c', 0

l на самом деле является кортежем, содержащим первый элемент в виде лямбда-функции, второй элемент в виде строки и третий элемент в целом числе.

Это эквивалентно следующему:

>>> l = (lambda: -4, 'c', 0)

Если вы хотите получить доступ к лямбда-функции, которая возвращает -4, попробуйте следующее:

>>> i = iter(l)
>>> next(i)()
-4

Но учтите, что next(i)() работает только с callable (лямбда, функциями и т. Д.) Объектами. Если вы используете next(i)() со строковым объектом, Python поднимет TypeError: 'str' object is not callable. Поэтому всегда проверяйте, является ли предмет callable. т.е.

i = iter(l)
item = next(i)
if callable(item):
    print(item())
else:
    print(item)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...