跳转到主要内容

返回可迭代的第一个true值。

项目描述

first:Python中您一直缺少的函数

CI Status

first 是一个MIT许可的Python包,它包含一个简单的函数,用于从可迭代对象中返回第一个true值,如果没有,则返回 None。如果您需要更多功能,还可以提供一个用于判断元素真值的 key 函数或 default 值,如果 None 适用于您的用例。

注意:我在这里使用“true”一词与Python文档中对 any()all() 的描述一致——它意味着值评估为true,例如: True1"foo"[None]。但 不是NoneFalse[]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 (7.0 kB 查看哈希值)

上传时间 源代码

构建发行版

first-2.0.2-py2.py3-none-any.whl (5.4 kB 查看哈希值)

上传时间 Python 2 Python 3

由以下支持