Untuk objek yang dapat diindeks, pendekatan saat ini untuk iterasi terbalik rawan kesalahan, tidak alami, dan tidak dapat dibaca secara khusus
for i in xrange(n-1, -1, -1): print seqn[i]
Satu pendekatan lain saat ini melibatkan membalik daftar sebelum mengulanginya. Teknik itu menghabiskan siklus komputer, memori, dan baris kode
rseqn = list(seqn) rseqn.reverse() for value in rseqn: print value _
Extended Slicing adalah pendekatan ketiga yang meminimalkan overhead kode tetapi tidak melakukan apa pun untuk efisiensi, keindahan, atau kejelasan memori
Iterasi mundur jauh lebih jarang daripada iterasi maju, tetapi dalam praktiknya hal itu muncul secara teratur. Lihat di bawah
Tambahkan fungsi bawaan yang disebut reversed() yang membuat iterator terbalik di atas objek urutan yang mendukung __getitem__() dan __len__()
Contoh di atas kemudian disederhanakan menjadi
for i in reversed(xrange(n)): print seqn[i]
for elem in reversed(seqn): print elem
Ide intinya adalah bahwa cara yang paling jelas, paling tidak rawan kesalahan untuk menentukan iterasi terbalik adalah dengan menentukannya dalam arah maju dan kemudian mengatakan terbalik
Implementasinya bisa sesederhana
def reversed(x): if hasattr(x, 'keys'): raise ValueError("mappings do not support reverse iteration") i = len(x) while i > 0: i -= 1 yield x[i] _
Tidak diperlukan perubahan sintaks bahasa. Proposal sepenuhnya kompatibel ke belakang
Implementasi AC dan pengujian unit ada di. https. //bug. python. org/masalah834422
PEP ini telah diterima secara bersyarat untuk Py2. 4. Kondisi tersebut berarti bahwa jika fungsi tersebut ternyata tidak berguna, maka dapat dihapus sebelum Py2. 4b1
- reviter – Saran Jeremy Fincher cocok dengan penggunaan iter()
- ireverse – menggunakan konvensi penamaan itertools
- terbalik - sepertinya tidak ada yang menyukai ini kecuali saya
Nama terbalik bukan kandidat karena menduplikasi nama daftar. reverse() yang memutasi daftar yang mendasarinya
Kasus terhadap adopsi PEP adalah keinginan untuk menjaga agar jumlah fungsi bawaan tetap kecil. Ini perlu ditimbang dengan kesederhanaan dan kenyamanan memilikinya sebagai bawaan alih-alih disimpan di beberapa ruang nama lain
Berikut adalah beberapa contoh iterasi terbalik yang diambil dari perpustakaan standar dan komentar tentang mengapa iterasi terbalik diperlukan
- atexit. exit_handlers() menggunakan
while _exithandlers: func, targs, kargs = _exithandlers.pop() . . .
Dalam aplikasi ini diperlukan popping, jadi fungsi baru tidak akan membantu
- timbunanq. heapify() menggunakan for i in xrange(n//2 - 1, -1, -1) karena urutan tingkat yang lebih tinggi lebih mudah dibentuk dari pasangan urutan tingkat yang lebih rendah. Versi maju dari algoritme ini dimungkinkan; . Kode pengganti for i in reversed(xrange(n//2)) memperjelas rentang yang dicakup dan berapa banyak iterasi yang diperlukan
- mhlib. tes() menggunakan
testfolders.reverse(); for t in testfolders: do('mh.deletefolder(%s)' % `t`) _
Kebutuhan akan iterasi terbalik muncul karena ekor dari list yang mendasari diubah selama iterasi
- peron. _dist_try_harder() menggunakan rseqn = list(seqn) rseqn.reverse() for value in rseqn: print value 0 karena loop menghapus elemen yang dipilih dari verfiles tetapi perlu membiarkan sisa daftar tetap utuh untuk iterasi lebih lanjut
- acak. shuffle() menggunakan rseqn = list(seqn) rseqn.reverse() for value in rseqn: print value 1 karena algoritme paling mudah dipahami sebagai elemen yang dipilih secara acak dari kumpulan yang semakin berkurang. Faktanya, algoritme dapat dijalankan dengan arah maju tetapi kurang intuitif dan jarang disajikan seperti itu dalam literatur. Kode pengganti rseqn = list(seqn) rseqn.reverse() for value in rseqn: print value _2 jauh lebih mudah diverifikasi secara visual
- rfc822. Pesan. __delitem__() menggunakan
list.reverse() for i in list: del self.headers[i]
Kebutuhan akan iterasi terbalik muncul karena ekor dari list yang mendasari diubah selama iterasi
Beberapa varian diajukan yang mencoba menerapkan reversed() ke semua iterables dengan menjalankan iterable hingga selesai, menyimpan hasilnya, dan kemudian mengembalikan iterator terbalik pada hasilnya. Sambil memenuhi beberapa pengertian umum penuh, menjalankan input sampai akhir bertentangan dengan tujuan penggunaan iterator sejak awal. Juga, bencana kecil terjadi jika iterator yang mendasarinya tidak terbatas
Menempatkan fungsi di modul lain atau melampirkannya ke objek tipe tidak dipertimbangkan. Seperti sepupunya, zip() dan enumerate(), fungsi ini harus dapat diakses langsung dalam pemrograman sehari-hari. Masing-masing memecahkan masalah perulangan dasar. iterasi kunci-langkah, penghitungan loop, dan iterasi terbalik. Membutuhkan beberapa bentuk akses bertitik akan mengganggu kesederhanaan, utilitas harian, dan aksesibilitasnya. Mereka adalah konstruksi perulangan inti, terlepas dari satu domain aplikasi apa pun