Python: EAFP在检查一个空的可收集的iterable中的作用

问题描述 投票:0回答:1

我有一些其他语言的编程经验,但我一直在学习Pluralsight的核心Python课程,以对比语言特点。在课程的iterables部分,老师创建了这样一个函数,利用EAFP原理,如果iterable参数为空,就会引发异常。

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]

在写这篇文章的时候,我发现了这个 Stack Overflow 问题 关于 隐性布尔性 的空列表,我想我可以重构我的代码,使其更加pythonic。

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

它们的工作方式似乎是一样的 我的代码仍然使用EAFP原理,对吗?是第一种更快?还是只是演示一下iter()和next()函数?

python iteration iterable
1个回答
0
投票
def first(iterable):
    if(len(iterable) == 0):
        raise ValueError("iterable is empty")
    else:
        return iterable[0]

这个函数假设iterable有一个有意义的长度(也就是说,它有一个 __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

有用的阅读:

© www.soinside.com 2019 - 2024. All rights reserved.