Подтвердить что ты не робот

Типы объектов Python() и zip()

Я понимаю, как такие функции, как range() и zip(), могут использоваться в цикле for. Однако я ожидал, что range() выведет список - во многом как seq в оболочке unix. Если я запустил следующий код:

a=range(10)
print(a)

Вывод range(10), предлагая ему не список, а другой тип объекта. zip() имеет аналогичное поведение при печати, выводя что-то вроде

<zip object at "hexadecimal number">

Итак, мой вопрос в том, каковы они, какие преимущества есть для их создания, и как я могу получить их вывод в списки, не зацикливая на них?

4b9b3361

Ответ 1

Вы должны использовать Python 3.

В Python 2 объекты zip и range ведут себя так, как вы предлагали, возвращая списки. Они были изменены на generator-подобные объекты, которые производят элементы по требованию, а не расширяют весь список в памяти. Одним из преимуществ было повышение эффективности в их типичных случаях использования (например, повторение их).

"ленивые" версии также существуют в Python 2.x, но они имеют разные имена, т.е. xrange и itertools.izip.

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

>>> list(range(3))
[0, 1, 2]
>>> list(zip(range(3), 'abc'))
[(0, 'a'), (1, 'b'), (2, 'c')]

Ответ 2

В Python 3.x., range возвращает объект диапазона, а не список, как в Python 2.x. Аналогично, zip теперь возвращает zip-объект вместо списка.

Чтобы получить эти объекты в виде списков, поместите их в list:

>>> range(10)
range(0, 10)
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> zip('abc', 'abc')
<zip object at 0x01DB7120>
>>> list(zip('abc', 'abc'))
[('a', 'a'), ('b', 'b'), ('c', 'c')]
>>>

Пока это может показаться бесполезным, это изменение поведения range и zip фактически повышает эффективность. Это связано с тем, что объекты zip и range производят элементы по мере необходимости, а не создают список для их одновременного хранения. Это экономит потребление памяти и повышает скорость работы.

Ответ 3

Диапазон (xrange в объектах python 2. *) неизменяемые последовательности, тогда как zip (itertools.izip repectively) является объект генератора. Чтобы составить список из генератора или последовательности, просто переведите в список. Например:

>>> x = range(10) 
>>> list(x)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Но они различаются способом генерации элементов. Нормальные генераторы являются изменяемыми и превосходят их содержимое, если они повторяются, а диапазон неизменен и не выполняется:

>>> list(x) # x is a range-object
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # second cast to list, contents is the same
>>> y = zip('abc', 'abc')
>>> list(y) # y is a generator
[('a', 'a'), ('b', 'b'), ('c', 'c')]
>>> list(y) 
[] # second cast to list, content is empty!