我有一些其他语言的编程经验,但我一直在学习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()函数?
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
有用的阅读: