Python: EAFP при проверке пустой коллекции / повторяемая - PullRequest
1 голос
/ 26 апреля 2020

У меня есть некоторый опыт программирования на других языках, но я изучаю курс Core Python от Pluralsight, чтобы противопоставить языковые возможности. В разделе итерируемых предметов преподаватель создал эту функцию, которая использует принцип EAFP, чтобы вызвать исключение, если итеративный аргумент пуст:

def first(iterable):
    iterator = iter(iterable)
    try:
        return next(iterator)
    except StopIteration:
        raise ValueError("iterable is empty")

Я видел это и думал: «Разве я не мог просто поднять это исключение в предложении else? Итак, я написал эту функцию:

def first(iterable):
    if(len(iterable) == 0):
        raise ValueError("iterable is empty")
    else:
        return iterable[0]

При написании этого поста я обнаружил вопрос переполнения стека о неявной глупости пустого списка и думал, что я мог бы реорганизовать свой код, чтобы сделать его еще более pythoni c:

def first(iterable):
    if not iterable:
        raise ValueError("iterable is empty")
    else:
        return iterable[0]

Они, кажется, работают так же, и мой по-прежнему использует принцип EAFP, верно? первый быстрее? Или это просто демонстрация функций iter () и next ()?

1 Ответ

0 голосов
/ 27 апреля 2020
def first(iterable):
    if(len(iterable) == 0):
        raise ValueError("iterable is empty")
    else:
        return iterable[0]

Эта функция предполагает, что итерация имеет значимую длину (то есть, у нее есть метод __len__). Это не сработает, например, для выражений генератора

>>> len(x for x in  range(4))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'generator' has no len()

Значительно, эта функция

def first(iterable):
    if not iterable:
        raise ValueError("iterable is empty")
    else:
        return iterable[0]

предполагает, что bool(iterable) будет иметь значение False, если оно пустое. Опять же, это может быть неверно:

>>> bool(x for x in  [])
True

Полезное чтение:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...