Python'un LBYL stili üzerinde EAFP stilini (" izin vermekten daha affetmek daha kolay") teşvik ettiğini duyuyorsunuz (" atlamadan önce bak"). Bana göre bu bir verimlilik ve okunabilirlik meselesi.
Örneğinizde (bir liste veya boş bir dize döndürmek yerine, işlevin bir liste döndürmesi None
gerektiğini söyleyin veya ), zamanın% 99'unun result
gerçekten yinelenebilir bir şey içereceğini düşünüyorsanız, try/except
yaklaşımı kullanacağım . İstisnalar gerçekten istisnai ise daha hızlı olacaktır. Eğer result
bir None
o kullanarak, zamanın% 50'den fazla if
, muhtemelen daha iyidir.
Bunu birkaç ölçümle desteklemek için:
>>> import timeit
>>> timeit.timeit(setup="a=1;b=1", stmt="a/b") # no error checking
0.06379691968322732
>>> timeit.timeit(setup="a=1;b=1", stmt="try:\n a/b\nexcept ZeroDivisionError:\n pass")
0.0829463709378615
>>> timeit.timeit(setup="a=1;b=0", stmt="try:\n a/b\nexcept ZeroDivisionError:\n pass")
0.5070195056614466
>>> timeit.timeit(setup="a=1;b=1", stmt="if b!=0:\n a/b")
0.11940114974277094
>>> timeit.timeit(setup="a=1;b=0", stmt="if b!=0:\n a/b")
0.051202772912802175
Yani, bir if
ifade her zaman size mal olurken , bir try/except
blok oluşturmak neredeyse ücretsizdir . Ancak Exception
gerçekte meydana geldiğinde, maliyet çok daha yüksektir.
Ahlaki:
try/except
Akış kontrolü için kullanmak tamam (ve "pitonik") ,
- ancak
Exception
s gerçekten istisnai olduğunda en mantıklıdır .
Python belgelerinden:
EAFP
Affetmek, izin vermekten daha kolaydır. Bu yaygın Python kodlama stili, geçerli anahtarların veya niteliklerin varlığını varsayar ve varsayımın yanlış olduğunu kanıtlarsa istisnaları yakalar. Bu temiz ve hızlı stil, birçok try
ve except
ifadenin varlığı ile karakterizedir
. Teknik
, C gibi diğer birçok dilde ortak olan LBYL stiliyle zıttır .