Dalam Python khusus (saya tidak tahu apakah ini digeneralisasi) apakah ada cara "terbaik" untuk mengembalikan beberapa item dari suatu fungsi?
def func1():
return a,b #equivalent to (a,b)
def func2():
return[a,b]
def func3():
return{"valueA":a,"valueB":b}
Yang pertama adalah apa yang saya lihat paling umum, tetapi saya merasa seperti yang terakhir membuat kode lebih mudah dibaca karena Anda telah menamai output, tetapi saya mungkin kehilangan semacam overhead yang dibuat oleh metode ini?
Jawaban:
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?
Daftar dan tuple setara untuk akses, tetapi daftar bisa berubah. Nah, itu tidak masalah bagi saya penelepon jika saya akan segera membongkar hasilnya:
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 :
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.
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
(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:
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.sumber
Jangan pikirkan fungsi yang mengembalikan banyak argumen. Secara konseptual, yang terbaik adalah memikirkan fungsi sebagai menerima dan mengembalikan satu argumen. Fungsi yang tampaknya menerima banyak argumen sebenarnya hanya menerima satu argumen tipe tuple ( produk resmi ). Demikian pula, fungsi yang mengembalikan banyak argumen hanya mengembalikan tuple.
Dengan Python:
dapat ditulis ulang sebagai
untuk membuat perbandingan jelas.
Kasus pertama hanyalah gula sintaksis untuk yang terakhir; keduanya menerima triple sebagai argumen, tetapi pola pertama cocok dengan argumennya untuk melakukan perusakan otomatis ke dalam komponen-komponen penyusunnya. Dengan demikian, bahkan bahasa tanpa pencocokan pola umum penuh mengakui beberapa bentuk pencocokan pola dasar pada beberapa jenisnya (Python mengakui pencocokan pola pada kedua produk dan jenis rekaman).
Untuk kembali ke pertanyaan yang ada: tidak ada jawaban tunggal untuk pertanyaan Anda, karena itu seperti bertanya "apa yang harus menjadi tipe pengembalian dari fungsi arbitrer"? Itu tergantung pada fungsi dan use case. Dan, kebetulan, jika "nilai pengembalian berganda" benar-benar independen, maka mereka mungkin harus dihitung dengan fungsi yang terpisah.
sumber