Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 5, 2017 23:45:29

zzx1@R2D2
Зарегистрирован: 2017-03-26
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите разобраться (zip)

Возможно, вопрос нубский, но туплю и не понимаю, почему второй print выдает пустой словарь:

>>>z=zip((1, 2), (“a”, “b”)) - в оригинале внутри два списка, а не кортежа - в посте почему-то пропадает содержание квадратных скобок, пришлось здесь заменить на круглые (

>>> print(dict(z))
{1: “a”, 2: “b”}
>>> print(dict(z))
{}

Отредактировано zzx1@R2D2 (Апрель 5, 2017 23:46:00)

Офлайн

#2 Апрель 6, 2017 00:23:14

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Помогите разобраться (zip)

Потому что zip возвращает итератор. Сделай так:

z = list(zip((1, 2), (“a”, “b”)))



Офлайн

#3 Апрель 6, 2017 00:29:39

zzx1@R2D2
Зарегистрирован: 2017-03-26
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите разобраться (zip)

ZZZ
Потому что zip возвращает итератор. Сделай так:

Но почему тогда похожее не происходит, к примеру, здесь:
>>> z=range(5)

Сколько не выводи print(list(z)) пустого списка не получишь, как в первом примере с пустым словарем.

Отредактировано zzx1@R2D2 (Апрель 6, 2017 00:32:51)

Офлайн

#4 Апрель 6, 2017 02:02:04

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

Помогите разобраться (zip)

 x = range(5)
next(x)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'range' object is not an iterator
>>>

 >>> z = iter(range(5))
>>> print(list(z))
[0, 1, 2, 3, 4]
>>> print(list(z))
[]

Офлайн

#5 Апрель 6, 2017 10:05:07

zzx1@R2D2
Зарегистрирован: 2017-03-26
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите разобраться (zip)

scidam
TypeError: ‘range’ object is not an iterator

Спасибо! С вашей помощью, коллеги, разобрался. Видимо, надо меньше читать русскоязычные статьи. Меня смутило, что везде, где я читал, указывается, что в python 3.x range(x) как раз и есть итератор, и не понимал, почему два вроде итератора ведут себя по-разному. Видимо, неточность перевода с английского.

Отредактировано zzx1@R2D2 (Апрель 6, 2017 10:05:53)

Офлайн

#6 Апрель 6, 2017 11:38:40

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9998
Репутация: +  857  -
Профиль   Отправить e-mail  

Помогите разобраться (zip)

zzx1@R2D2
Видимо, неточность перевода с английского.
В питоне есть два понятия: “итератор” и “итерабельное”
https://docs.python.org/3/glossary.html#term-iterable
https://docs.python.org/3/glossary.html#term-iterator

range() никогда не возвращала итератор, но объект типа range является итерабельным (перебираемым).



Офлайн

#7 Апрель 6, 2017 12:00:50

zzx1@R2D2
Зарегистрирован: 2017-03-26
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите разобраться (zip)

py.user.next
range() никогда не возвращала итератор, но объект типа range является итерабельным (перебираемым)

Вот и я о том же… Там, где я читал, по-русски написано “возвращает итератор” начиная с 3.0. Мне даже в голову не пришло перепроверять. Потом, когда здесь выше написали ‘range’ object is not an iterator, то пошел читать английские тексты и там как-раз и про “iterator” и про “iterable”. В общем, по неграмотности и из-за ошибки чьего-то перевода завис на день.

Отредактировано zzx1@R2D2 (Апрель 6, 2017 12:02:26)

Офлайн

#8 Апрель 6, 2017 14:25:49

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9998
Репутация: +  857  -
Профиль   Отправить e-mail  

Помогите разобраться (zip)

zzx1@R2D2
Там, где я читал, по-русски написано “возвращает итератор” начиная с 3.0. Мне даже в голову не пришло перепроверять.
Читай это http://getpython3.com/diveintopython3/ , там таких неточностей нет и к тому же научат их делать.



Отредактировано py.user.next (Апрель 6, 2017 14:26:21)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version