您有一个 N 大小的集合,但想使用单个项目(概念上是一个 0 或 1 大小的集合)这样的问题是很常见的.
我可以写出传统的 if:
def singular_item(collection):
if collection:
return collection[0]
else:
return None
并简化为:
def singular_item(collection):
return collection[0] if collection else None
但它不适用于可迭代对象,只能用于具有定义大小的集合。例如传递生成器会失败:
singular_item((_ for _ in range(10)))
=> TypeError: 'generator' object has no attribute '__getitem__'
所以我通常做的是:
def singular_item(collection):
return next((_ for _ in collection), None)
singular_item([1]) -> 1
singular_item([1,2,3]) -> 1
singular_item([]) -> None
这适用于任何集合(或可迭代对象),但创建一个仅获取一个项目的生成器感觉有些笨拙。此外,它的可读性也有所降低:另外两个示例更明确地说明了代码试图做什么。
所以我的问题是:
- 是否有更好的方法来做到这一点,也许是使用内置函数?
- 您是否在创建仅获取一个项目的生成器时浪费资源?
请您参考如下方法:
使用 iter() function而是创建一个可迭代对象:
def singular_item(collection):
return next(iter(collection), None)
iter() 调用collection.__iter__() 获取一个可迭代对象供next() 循环,可以是collection 对象本身。
否则迭代器非常高效,这种方法是处理任何可迭代对象或序列的正确方法。
