Ви часто чуєте, що Python заохочує стиль EAFP ("простіше просити пробачення, ніж дозволу") над стилем LBYL ("дивись, перш ніж стрибнути"). Для мене це питання ефективності та читабельності.
У вашому прикладі (скажіть, що замість повернення списку чи порожнього рядка функцією було повернення списку або None), якщо ви очікуєте, що 99% часу resultнасправді буде містити щось ітерабельне, я використовував би такий try/exceptпідхід. Це буде швидше, якщо справді винятки будуть винятковими. Якщо resultце Noneбільш ніж на 50% часу, то з допомогоюif , напевно , краще.
Щоб підтримати це за допомогою декількох вимірювань:
>>> 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
Отже, хоча ifзаява завжди коштує вам, налаштовувати try/exceptблок майже безкоштовно . Але коли Exceptionнасправді відбувається, вартість значно вища.
Мораль:
- Це абсолютно добре (і "пітонічний") у використанні
try/except для контролю потоку,
- але це має сенс, коли
Exceptions насправді виняткові.
З документів Python:
ЄАФП
Простіше просити пробачення, ніж дозволу. Цей загальний стиль кодування Python передбачає існування дійсних ключів або атрибутів і виловлює винятки, якщо припущення виявиться помилковим. Цей чистий і швидкий стиль характеризується наявністю багатьох
tryі exceptвисловлювань. Метод контрастує зі
стилем LBYL, поширеним для багатьох інших мов, таких як C.