Saya pikir pilihan perlu dipertimbangkan secara ketat dari sudut pandang pemanggil: apa yang paling mungkin perlu dilakukan oleh konsumen?
Dan apa saja fitur menonjol dari setiap koleksi?
- Tuple diakses dalam urutan dan tidak berubah
- Daftar ini diakses secara berurutan dan dapat diubah
- Dict diakses dengan kunci
Daftar dan tuple setara untuk akses, tetapi daftar bisa berubah. Nah, itu tidak masalah bagi saya penelepon jika saya akan segera membongkar hasilnya:
score, top_player = play_round(players)
# or
idx, record = find_longest(records)
Tidak ada alasan di sini bagi saya untuk peduli apakah itu daftar atau tupel, dan tupel lebih sederhana di kedua sisi.
Di sisi lain, jika koleksi yang dikembalikan akan disimpan utuh dan digunakan sebagai koleksi :
points = calculate_vertices(shape)
points.append(another_point)
# Make a new shape
maka mungkin masuk akal jika kembalinya bisa berubah. Homogenitas juga merupakan faktor penting di sini. Katakanlah Anda telah menulis fungsi untuk mencari urutan untuk pola yang berulang. Informasi yang saya dapatkan kembali adalah indeks dalam urutan instance pertama dari pola, jumlah pengulangan, dan pola itu sendiri. Itu bukan hal yang sama. Meskipun saya mungkin menyimpan potongan-potongan itu, tidak ada alasan saya ingin mengubah koleksi . Ini bukan list
.
Sekarang untuk kamus.
yang terakhir membuat kode lebih mudah dibaca karena Anda telah menamai keluaran
Ya, memiliki kunci untuk bidang membuat data heterogen lebih eksplisit, tetapi juga dilengkapi dengan beberapa pembebanan. Sekali lagi, untuk kasus "Saya hanya akan membongkar barang", ini
round_results = play_round(players)
score, top_player = round_results["score"], round_results["top_player"]
(bahkan jika Anda menghindari string literal untuk kunci), adalah pekerjaan yang tidak perlu dibandingkan dengan versi tuple.
Pertanyaannya ada tiga: seberapa rumit koleksinya, berapa lama koleksinya akan disatukan, dan apakah kita perlu menggunakan koleksi yang sama di banyak tempat yang berbeda?
Saya menyarankan bahwa nilai balik akses-kunci mulai lebih masuk akal daripada tuple ketika ada lebih dari sekitar tiga anggota, dan terutama di mana ada sarang:
shape["transform"]["raw_matrix"][0, 1]
# vs.
shape[2][4][0, 1]
Itu mengarah ke pertanyaan berikutnya: apakah koleksi akan meninggalkan ruang lingkup ini utuh, di suatu tempat jauh dari panggilan yang membuatnya? Akses kunci di sana benar-benar akan membantu pemahaman.
Pertanyaan ketiga - penggunaan kembali - menunjuk ke tipe data kustom sederhana sebagai opsi keempat yang tidak Anda presentasikan.
Apakah struktur semata-mata dimiliki oleh fungsi yang satu ini? Atau apakah Anda membuat tata letak kamus yang sama di banyak tempat? Apakah banyak bagian lain dari program perlu beroperasi pada struktur ini? Tata letak kamus yang berulang harus difaktorkan ke kelas. Bonus di sana adalah Anda dapat melampirkan perilaku: mungkin beberapa fungsi yang beroperasi pada data dienkapsulasi sebagai metode.
Opsi kelima bagus, ringan, adalah namedtuple()
. Ini pada dasarnya adalah bentuk yang tidak berubah dari nilai pengembalian kamus.