Saya memahami bagaimana fungsi seperti range()
dan zip()
dapat digunakan untuk loop. Namun yang saya harapkan range()
untuk menampilkan daftar - seperti seq
di shell unix. Jika saya menjalankan kode berikut:
a=range(10)
print(a)
Output adalah range(10)
, menunjukkan hal itu's tidak daftar tapi jenis objek yang berbeda. zip()
telah serupa perilaku ketika dicetak, keluaran sesuatu seperti
<zip object at "hexadecimal number">
Jadi pertanyaan saya adalah apa yang mereka, apa keuntungan yang ada untuk membuat mereka ini, dan bagaimana saya bisa mendapatkan output mereka ke daftar tanpa perulangan di atas mereka?
Anda harus menggunakan Python 3.
Di Python 2, benda-benda zip
dan range
tidak berperilaku seperti yang anda menunjukkan, kembali daftar. Mereka berubah menjadi generator-seperti benda-benda yang menghasilkan unsur-unsur pada permintaan daripada memperluas seluruh daftar ke memori. Salah satu keuntungan adalah efisiensi yang lebih besar dalam khas mereka menggunakan kasus (misalnya iterasi mereka).
"malas" versi ini juga ada di Python 2.x, tapi mereka memiliki nama yang berbeda yaitu xrange
dan itertools.izip
.
Untuk mengambil semua output sekaligus menjadi akrab daftar objek, anda hanya dapat memanggil daftar
untuk iterate dan mengkonsumsi isinya:
>>> list(range(3))
[0, 1, 2]
>>> list(zip(range(3), 'abc'))
[(0, 'a'), (1, 'b'), (2, 'c')]
Di Python 3.x., range
kembali berbagai objek bukan daftar seperti itu dalam Python 2.x. Demikian pula, zip
sekarang kembali zip objek bukan dari daftar.
Untuk mendapatkan benda-benda ini sebagai daftar, menempatkan mereka di klik disini
:
>>> 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')]
>>>
Sementara itu mungkin tampak membantu pada awalnya, perubahan dalam perilaku range
dan zip
benar-benar meningkatkan efisiensi. Hal ini karena resleting dan berbagai benda yang menghasilkan barang-barang yang mereka butuhkan, daripada membuat daftar untuk menahan mereka semua sekaligus. Demikian menghemat pemakaian memori dan meningkatkan kecepatan operasi.
Range (xrange
di python 2.*) benda-benda berubah urutan, sementara pos (itertools.izip
repectively) adalah generator objek. Untuk membuat daftar dari generator atau urutan, hanya melemparkan ke daftar. Misalnya:
>>> x = range(10)
>>> list(x)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Tetapi mereka berbeda dalam cara bagaimana unsur-unsur yang dihasilkan. Normal generator yang bisa berubah dan exaust konten mereka jika iterasi, sedangkan range adalah kekal, dan don't:
>>> 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!