Saya memiliki kode yang terlihat seperti ini:
thing_index = thing_list.index(thing)
otherfunction(thing_list, thing_index)
ok jadi itu disederhanakan tetapi Anda mendapatkan idenya. Sekarang thing
mungkin tidak benar-benar ada dalam daftar, dalam hal ini saya ingin meneruskan -1 sebagai thing_index
. Dalam bahasa lain, inilah yang Anda harapkan index()
untuk dikembalikan jika tidak dapat menemukan elemennya. Sebenarnya itu melempar ValueError
.
Saya bisa melakukan ini:
try:
thing_index = thing_list.index(thing)
except ValueError:
thing_index = -1
otherfunction(thing_list, thing_index)
Tapi ini terasa kotor, ditambah lagi saya tidak tahu apakah ValueError
bisa dibesarkan karena alasan lain. Saya datang dengan solusi berikut berdasarkan fungsi generator, tetapi tampaknya sedikit rumit:
thing_index = ( [(i for i in xrange(len(thing_list)) if thing_list[i]==thing)] or [-1] )[0]
Adakah cara yang lebih bersih untuk mencapai hal yang sama? Mari kita asumsikan bahwa daftar tersebut tidak diurutkan.
thing_index
." - Ini jelas tidak Pythonic. Meneruskan nilai token (tidak berarti) jika operasi tidak berhasil tidak disukai - pengecualian benar-benar cara yang tepat di sini. Terutama karenathing_list[-1]
merupakan ekspresi yang valid, yang berarti entri terakhir dalam daftar.str.find
metode yang melakukan persis seperti itu: mengembalikan-1
ketika jarum tidak ditemukan dalam subjek.str.index()
tidak melempar pengecualian jika string pencarian tidak ditemukan.Jawaban:
Tidak ada yang "kotor" tentang penggunaan klausa coba-kecuali. Ini adalah cara pythonic.
ValueError
akan dimunculkan oleh.index
metode saja, karena itu satu-satunya kode yang Anda miliki di sana!Untuk menjawab komentar:
Dengan Python, filosofi lebih mudah untuk meminta maaf daripada mendapatkan izin sudah mapan, dan tidak tidak
index
akan meningkatkan jenis kesalahan ini untuk masalah lainnya. Bukannya aku bisa memikirkan apapun.sumber
{}.get(index, '')
lebih pythonic? Belum lagi lebih pendek lebih mudah dibaca.None
bukan -1 akan baik-baik saja, tetapi saat Anda berkomentar sendiri, str.find () mengembalikan -1 jadi mengapa tidak ada list.find () yang melakukan hal yang sama? Saya tidak membeli argumen "pythonic"otherfunction
. Di sisi lain, jika tidak rusak, ...Satu baris. Sederhana. Tidak ada pengecualian.
sumber
for
.indexOf = lambda item,list_ : list_.index(item) if item in list_ else -1 # OR None
The
dict
jenis memilikiget
fungsi , di mana jika kunci tidak ada dalam kamus, argumen 2 untukget
adalah nilai yang harus kembali. Demikian pula adasetdefault
, yang mengembalikan nilai dalamdict
jika kunci ada, jika tidak, menetapkan nilai sesuai dengan parameter default Anda dan kemudian mengembalikan parameter default Anda.Anda bisa memperluas
list
tipe untuk memilikigetindexdefault
metode.Yang kemudian bisa digunakan seperti:
sumber
Tidak ada yang salah dengan kode yang Anda gunakan
ValueError
. Berikut satu baris lain jika Anda ingin menghindari pengecualian:sumber
next()
fungsi ada di Python 2.6+. Tetapi mudah diimplementasikan untuk 2.5, lihat implementasi fungsi next () untuk Python 2.5Masalah ini adalah salah satu filosofi bahasa. Di Jawa misalnya, selalu ada tradisi bahwa pengecualian seharusnya hanya digunakan dalam "keadaan luar biasa" yaitu ketika kesalahan terjadi, bukan untuk kontrol aliran. . Pada awalnya ini untuk alasan kinerja karena pengecualian Java lambat tetapi sekarang ini telah menjadi gaya yang diterima.
Sebaliknya Python selalu menggunakan pengecualian untuk menunjukkan aliran program normal, seperti menaikkan a
ValueError
seperti yang kita bahas di sini. Tidak ada yang "kotor" tentang ini dalam gaya Python dan masih banyak lagi dari mana asalnya. Contoh yang lebih umum adalahStopIteration
pengecualian yang dimunculkan oleh metode iterator untuknext()
memberi sinyal bahwa tidak ada nilai lebih lanjut.sumber
StopIteration
karena sudah jelas apa arti pengecualiannya.ValueError
sedikit terlalu umum.Jika Anda sering melakukan ini, maka lebih baik untuk membakarnya di dalam fungsi pembantu:
sumber
Bagaimana dengan ini 😃:
sumber
Bagaimana dengan ini:
Daripada mengekspos sesuatu yang sangat tergantung pada implementasi seperti indeks daftar di antarmuka fungsi, teruskan koleksi dan hal tersebut dan biarkan fungsi lain menangani masalah "uji keanggotaan". Jika fungsi lain ditulis menjadi collection-type-agnostic, maka mungkin akan dimulai dengan:
yang akan berfungsi jika thing_collection adalah list, tuple, set, atau dict.
Ini mungkin lebih jelas dari:
yang merupakan kode yang sudah Anda miliki di fungsi lain.
sumber
Bagaimana dengan seperti ini:
sumber
Saya memiliki masalah yang sama dengan metode ".index ()" di daftar. Saya tidak memiliki masalah dengan fakta bahwa ini melontarkan pengecualian tetapi saya sangat tidak setuju dengan fakta bahwa ini adalah ValueError yang tidak deskriptif. Aku bisa mengerti jika itu adalah IndexError.
Saya dapat melihat mengapa mengembalikan "-1" akan menjadi masalah juga karena ini adalah indeks yang valid dalam Python. Tapi secara realistis, saya tidak pernah mengharapkan metode ".index ()" untuk mengembalikan angka negatif.
Ini dia satu baris (ok, ini adalah baris yang agak panjang ...), melewati daftar tepat sekali dan mengembalikan "Tidak ada" jika item tidak ditemukan. Akan mudah untuk menulis ulang untuk mengembalikan -1, jika Anda menginginkannya.
Cara Penggunaan:
sumber
Saya tidak tahu mengapa Anda harus berpikir itu kotor ... karena pengecualian? jika Anda ingin oneliner, ini dia:
tetapi saya akan menyarankan agar tidak menggunakannya; Menurut saya solusi Ross Rogers adalah yang terbaik, gunakan objek untuk merangkum perilaku Anda yang diinginkan, jangan mencoba memaksakan bahasa hingga batasnya dengan mengorbankan keterbacaan.
sumber
find()
fungsi dan semuanya akan bersih;)Saya sarankan:
sumber