Katakanlah saya memiliki fungsi Python yang mengembalikan beberapa nilai dalam sebuah tuple:
def func():
return 1, 2
Apakah ada cara yang baik untuk mengabaikan salah satu hasil daripada hanya menetapkan ke variabel sementara? Katakanlah jika saya hanya tertarik pada nilai pertama, apakah ada cara yang lebih baik dari ini:
x, temp = func()
~
sebagai sintaks untuk mengabaikan variabel pengembalian tertentuJawaban:
Satu konvensi yang umum adalah menggunakan "_" sebagai nama variabel untuk elemen tuple yang ingin Anda abaikan. Misalnya:
sumber
Anda dapat menggunakan
x = func()[0]
untuk mengembalikan nilai pertama,x = func()[1]
untuk mengembalikan nilai kedua, dan seterusnya.Jika Anda ingin mendapatkan beberapa nilai sekaligus, gunakan sesuatu seperti
x, y = func()[2:4]
.sumber
func()[2:4]
jika Anda hanya menginginkan beberapa nilai pengembalian._, _, _, _, _, _, _, _, _, _, _, _, _, a, _, _, _, _, _, _, _, _, _, _, _, b, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, c, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, d, _, _, _, _, _, _, _, _, e, _ = func()
kurang jelas daripada memanggil fungsi beberapa kali, tapi itu hanya pendapat saya. Jika fungsi Anda mengembalikan banyak item, saya pikir menggunakan numpy akan lebih baik:a, b, c, d, e = func()[[13, 25, 58, 89, 98]]
result = func()
a = result[13]
b = result[25]
...x, __, y = func()
Jika Anda menggunakan Python 3, Anda dapat menggunakan bintang sebelum variabel (di sebelah kiri tugas) untuk menjadikannya daftar pembongkaran.
sumber
a, *_ = f()
untuk mengabaikan jumlah nilai yang dikembalikan setelahnyaa
.Ingat, ketika Anda mengembalikan lebih dari satu item, Anda benar-benar mengembalikan tuple. Jadi Anda dapat melakukan hal-hal seperti ini:
sumber
Praktik umum adalah menggunakan variabel dummy
_
(underscore tunggal), seperti yang telah ditunjukkan banyak orang di sini sebelumnya.Namun, untuk menghindari tabrakan dengan penggunaan lain dari nama variabel itu (lihat respons ini ) mungkin lebih baik menggunakan
__
(menggandakan garis bawah) daripada sebagai variabel sekali pakai, seperti yang ditunjukkan oleh ncoghlan . Misalnya:sumber
a, _, _ = 1,8,9
. Sampai saat itu, ia menyimpan hasil dari pernyataan terakhir dieksekusi yang jika Anda ingin menangkap, Anda biasanya akan menggunakan variabel untuk menyimpan nilai itu. Dan inilah sebabnya, '_' adalah nama variabel yang disarankan untuk menangkap nilai sampah. Nilai-nilai '_' ditimpa segera setelah pernyataan lain dieksekusi. Dalam kasus '_ _', nilai akan tetap ada sampai GC membersihkannya.Tiga pilihan sederhana.
Jelas
Mengerikan
Dan ada cara untuk melakukan ini dengan dekorator.
sumber
_
variabel. Sangat jelas bahwa Anda mengabaikan nilaix, _ = func()
mengerikan, danx = func()[0]
jelas. Menetapkan variabel dan kemudian tidak menggunakannya? Fungsi mengembalikan tuple; indeks itu seperti tuple.;)
, daftar pengakses sepertia[0]
,a[:]
(daftar salinan),a[::2]
(setiap dua elemen), dana[i:] + a[:i]
(memutar daftar), memang, juga jelas dan kanonik.Solusi terbaik mungkin adalah memberi nama sesuatu daripada mengembalikan tuple yang tidak berarti. Kecuali ada logika di balik urutan barang yang dikembalikan.
Anda bahkan dapat menggunakan namedtuple jika Anda ingin menambahkan informasi tambahan tentang apa yang Anda kembalikan (ini bukan hanya kamus, ini adalah koordinat):
Jika objek dalam kamus / tuple Anda sangat terikat bersama-sama maka mungkin ide yang baik untuk bahkan menentukan kelas untuk itu. Dengan begitu Anda juga akan dapat mendefinisikan interaksi antara objek-objek jenis ini dan memberikan API tentang cara bekerja dengannya. Pertanyaan alami yang mengikuti: Kapan saya harus menggunakan kelas dengan Python? .
sumber
Ini sepertinya pilihan terbaik bagi saya:
Ini tidak samar atau jelek (seperti metode func () [index]), dan dengan jelas menyatakan tujuan Anda.
sumber
Ini bukan jawaban langsung untuk pertanyaan itu. Melainkan menjawab pertanyaan ini: "Bagaimana saya memilih output fungsi spesifik dari banyak opsi yang mungkin?".
Jika Anda dapat menulis fungsi (mis., Itu tidak ada di perpustakaan yang tidak dapat Anda modifikasi), kemudian tambahkan argumen input yang menunjukkan apa yang Anda inginkan dari fungsi tersebut. Buatlah argumen bernama dengan nilai default sehingga dalam "kasus umum" Anda bahkan tidak harus menentukannya.
Metode ini memberikan fungsi "peringatan lanjutan" tentang output yang diinginkan. Akibatnya ia dapat melewati pemrosesan yang tidak dibutuhkan dan hanya melakukan pekerjaan yang diperlukan untuk mendapatkan hasil yang diinginkan. Juga karena Python melakukan pengetikan dinamis, tipe pengembalian dapat berubah. Perhatikan bagaimana contoh mengembalikan skalar, daftar atau tuple ... apa pun yang Anda suka!
sumber
Jika ini adalah fungsi yang Anda gunakan sepanjang waktu tetapi selalu membuang argumen kedua, saya berpendapat bahwa itu kurang berantakan untuk membuat alias untuk fungsi tanpa menggunakan nilai balik kedua menggunakan
lambda
.sumber
Ketika Anda memiliki banyak output dari suatu fungsi dan Anda tidak ingin menyebutnya berkali-kali, saya pikir cara paling jelas untuk memilih hasilnya adalah:
Sebagai contoh kerja minimum, juga menunjukkan bahwa fungsi ini dipanggil hanya sekali:
Dan nilainya seperti yang diharapkan:
Untuk kenyamanan, indeks daftar Python juga dapat digunakan:
Pengembalian: a = 3 dan b = 12
sumber