Poin penting adalah bahwa pemahaman daftar membuat daftar baru. Generator menciptakan objek yang dapat diubah yang akan "memfilter" bahan sumber saat Anda mengkonsumsi bit.
Bayangkan Anda memiliki file log 2TB yang disebut "hugefile.txt", dan Anda menginginkan konten dan panjang untuk semua baris yang dimulai dengan kata "ENTRY".
Jadi Anda mencoba memulai dengan menulis daftar pemahaman:
logfile = open("hugefile.txt","r")
entry_lines = [(line,len(line)) for line in logfile if line.startswith("ENTRY")]
Ini menyeruput seluruh file, memproses setiap baris, dan menyimpan baris yang cocok dalam array Anda. Oleh karena itu array ini dapat memuat konten hingga 2TB. Itu banyak RAM, dan mungkin tidak praktis untuk keperluan Anda.
Jadi alih-alih, kita dapat menggunakan generator untuk menerapkan "filter" ke konten kita. Tidak ada data yang benar-benar dibaca sampai kita mulai mengulangi hasilnya.
logfile = open("hugefile.txt","r")
entry_lines = ((line,len(line)) for line in logfile if line.startswith("ENTRY"))
Bahkan satu baris pun belum dibaca dari file kami. Bahkan, katakanlah kami ingin memfilter hasil kami lebih jauh:
long_entries = ((line,length) for (line,length) in entry_lines if length > 80)
Masih belum ada yang dibaca, tetapi kami telah menentukan sekarang dua generator yang akan bertindak berdasarkan data kami seperti yang kami inginkan.
Mari kita menulis baris yang difilter ke file lain:
outfile = open("filtered.txt","a")
for entry,length in long_entries:
outfile.write(entry)
Sekarang kita membaca file input. Ketika for
loop kami terus meminta jalur tambahan, long_entries
generator meminta jalur dari entry_lines
generator, hanya mengembalikan yang panjangnya lebih dari 80 karakter. Dan pada gilirannya, entry_lines
generator meminta baris (difilter seperti yang ditunjukkan) dari logfile
iterator, yang pada gilirannya membaca file.
Jadi, alih-alih "mendorong" data ke fungsi output Anda dalam bentuk daftar yang terisi penuh, Anda memberikan fungsi output cara untuk "menarik" data hanya saat dibutuhkan. Ini dalam kasus kami jauh lebih efisien, tetapi tidak cukup fleksibel. Generator adalah satu arah, satu lintasan; data dari file log yang telah kita baca segera dibuang, jadi kita tidak bisa kembali ke baris sebelumnya. Di sisi lain, kita tidak perlu khawatir tentang menyimpan data setelah kita selesai dengan itu.
[exp for x in iter]
hanya bisa menjadi gula untuklist((exp for x in iter))
? atau apakah ada perbedaan eksekusi?