У меня есть этот фрагмент кода, который я не могу понять:
>>> 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?
Ok. Но какое-нибудь объяснение тому, с чем я здесь столкнулся?..
Когда вы делаете это:
>>> 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)
Орлиный глаз, спасибо.
Я думаю, вы могли неправильно понять, что такое l
.
l
представляет собой кортеж из 3 элементов:
c
Когда вы создаете итератор, перебирающий кортеж, конечно, первый вызов next
даст вам лямбду!
Возможно, вы хотели вызвать лямбду:
next(i)()
Или, может быть, вы хотели объявить l
так:
l = lambda: (-4, 'c', 0) # you might think you don't need the parentheses, but you do
Лямбда, возвращающая кортеж.
А потом сделать iter(l())
.
Отлично, оценил.
Вы должны использовать
next(i)()
. Потому чтоnext(i)
возвращает только лямбда-объект.