返回可迭代的第一个true值。
项目描述
first:Python中您一直缺少的函数
first 是一个MIT许可的Python包,它包含一个简单的函数,用于从可迭代对象中返回第一个true值,如果没有,则返回 None。如果您需要更多功能,还可以提供一个用于判断元素真值的 key 函数或 default 值,如果 None 适用于您的用例。
注意:我在这里使用“true”一词与Python文档中对 any() 和 all() 的描述一致——它意味着值评估为true,例如: True、1、"foo" 或 [None]。但 不是: None、False、[] 或 0。在JavaScript中,它们称之为“truthy”。
示例
一个简单的入门示例
>>> from first import first
>>> first([0, None, False, [], (), 42])
42
然而,它对于处理if/elif/else分支中的正则表达式特别有用
import re
from first import first
re1 = re.compile('b(.*)')
re2 = re.compile('a(.*)')
m = first(regexp.match('abc') for regexp in [re1, re2])
if not m:
print('no match!')
elif m.re is re1:
print('re1', m.group(1))
elif m.re is re2:
print('re2', m.group(1))
可选的 key 函数为您提供了更多的选择能力。如果您想从列表中返回第一个偶数,只需做以下操作
>>> from first import first
>>> first([1, 1, 3, 4, 5], key=lambda x: x % 2 == 0)
4
另一方面,默认值允许您指定一个返回值,如果没有任何元素为真。
>>> from first import first
>>> first([0, None, False, [], ()], default=42)
42
用法
该包包含一个模块,该模块包含一个函数。
from first import first
first(iterable, default=None, key=None)
如果键为 None,则该函数返回可迭代对象的第一个元素。如果没有真元素,则返回默认值,默认值为 None。
如果在键中提供了可调用对象,则使用 key(element) 的结果来判断元素的真值,但返回元素本身。
first 没有依赖关系,应该与任何 Python 版本兼容。
替代方案
first 并没有带来之前不可能实现的功能。然而,现有的解决方案并不适合这种常见且简单的问题。
以下结构等同于 first(seq) 并从 Python 2.6 开始工作
next(itertools.ifilter(None, seq), None)
next(itertools.ifilter(bool, seq), None)
next((x for x in seq if x), None)
它们没有一个是我想要的那么漂亮。上面的 re 例子将如下所示
next(itertools.ifilter(None, (regexp.match('abc') for regexp in [re1, re2])), None)
next((regexp.match('abc') for regexp in [re1, re2] if regexp.match('abc')), None)
next((match for match in itertools.imap(
operator.methodcaller('match', 'abc'), [re1, re2]) if match), None)
请注意,在第二种情况下,您必须调用 regexp.match() 两次。第三种示例“修复”了这个问题,但同时也召唤了克苏鲁。
为了比较,再次是 first 版本
first(regexp.match('abc') for regexp in [re1, re2])
习惯用法、清晰易懂。Pythonic. :)
截至 2015 年的 0.6.5 版本,优秀的 boltons 包包含一个类似于 first 的函数,作为其 iterutils 模块的一部分。
背景
first 的想法源于我与 Łukasz Langa 讨论如何在上面的 re 例子中使 Python 痛苦。我们觉得 Python 缺少这样一个函数,但获得它的可能性很小,即使获得了,它也不会在 3.4 之前获得,而那时距离我写这篇文章已经有几年了。
因此,我决定现在将其发布为一个包。如果它足够受欢迎,它最终可能进入 Python 的 stdlib。
历史
2.0.2 (2019-03-07)
作为 dist 的一部分进行包测试。
更新文档。
从 CI 中删除不受支持的 Python 版本。注意,代码没有变化,first 仍然像以前一样工作。
2.0.1 (2013-08-04)
在默认不支持 UTF-8 的系统上可安装。
不向后兼容:删除对低于 2.6 的 Python 的支持,否则之前的修复会变得过于复杂。请无论如何不要使用 Python < 2.6。我恳求您。注意,这是一个 纯打包/质量保证问题:该模块仍然与旧版本的 Python 完美兼容。
2.0.0 (2012-10-13)
pred 被证明相当无用。更改为 key,它只是一个选择器。这是一个 不向后兼容 的更改,也是为什么版本号是 2.0 的原因。
添加 default 参数,如果在找不到真元素时返回,则返回该参数。
1.0.2 (2012-10-09)
修复打包。我永远不会一开始就做对。:-/
1.0.1 (2012-10-09)
仅文档修复。
1.0.0 (2012-10-09)
初始发布。
致谢
“first”由 Hynek Schlawack 和各种贡献者编写和维护。
Artem Bezsmertnyi
Łukasz Langa
Nick Coghlan
Vincent Driessen
项目详细信息
下载文件
下载您平台上的文件。如果您不确定要选择哪一个,请了解更多关于 安装包 的信息。
源分发
构建发行版
first-2.0.2.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ff285b08c55f8c97ce4ea7012743af2495c9f1291785f163722bd36f6af6d3bf |
|
MD5 | 8a45cda7d3f77f0c5af091d10d406821 |
|
BLAKE2b-256 | b0a278a4e6801fbd789c60888afb8e28ccbe629f9a25137bfafecb363db2fb53 |
first-2.0.2-py2.py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 8d8e46e115ea8ac652c76123c0865e3ff18372aef6f03c22809ceefcea9dec86 |
|
MD5 | 4564ac22c1270c2ab55606459e2469ee |
|
BLAKE2b-256 | 4062eda58db762d4845c971029becfecf6e85ad71c3bcba7d400598013a222a1 |