a=b=range(3)
In[1] = zip(a,b)
Я ожидаю увидеть что-то вроде этого:
out[1] =
[(0 0),
(1 1),
(2 2)]
однако, я получаю:
out[1] = <zip at 0x26da8d2e9c8>
То же самое для других функций fi
range(20)
out = range(0,20))
Для этих функций это не проблема, потому что я знаю, как они работают. Но это затрудняет работу с функцией и понимание того, как они работают, потому что вы никогда не сможете увидеть результат.
Может кто-нибудь объяснить мне, почему эта консоль работает так и как я могу это изменить?
Преобразуйте их в списки:
>>> list(zip(a,b))
[(0, 0), (1, 1), (2, 2)]
Причина, по которой вам нужно сделать это, - это то, что zip()
возвращает итератор (то, что вы можете вызвать next()
), а range()
возвращает итерабельность (что-то, на которое вы можете позвонить iter()
). Оба из них не оцениваются до того, как они необходимы (они "ленивы" в этом смысле), поэтому они не отображают все их содержимое при назначении переменных.
Однако, когда вы конвертируете их в списки, они повторяются и оцениваются, чтобы вы могли видеть их содержимое.
То же самое верно, когда вы создаете свой собственный итератор или итератор:
class my_iterator():
def __init__(self):
self.x = 0
def __iter__(self):
return self
def __next__(self):
self.x += 1
if self.x < 10: return self.x
raise StopIteration
который затем выполняет очень похоже на экземпляры zip
:
>>> i
<__main__.my_iterator object at 0x7f219d303518>
>>> list(i)
[1, 2, 3, 4, 5, 6, 7, 8, 9]