gpt4 book ai didi

python - Python 列表理解是否与 Perl 中的 map/grep 相同?

转载 作者:IT老高 更新时间:2023-10-28 21:12:21 25 4
gpt4 key购买 nike

我在理解 Python 中的列表解析语法时遇到了一些麻烦,因此我开始考虑如何在我更熟悉的 Perl 中实现相同的功能。我意识到基本示例(取自 this page)都可以在 Perl 中使用 mapgrep 完成。

例如

(python)                            (perl)                  
S = [x**2 for x in range(10)] @S = map { $_**2 } ( 0..9 );
V = [2**i for i in range(13)] @V = map { 2**$_ } ( 0..12 );
M = [x for x in S if x % 2 == 0] @M = grep { $_ % 2 == 0 } @S;

那么“列表理解”只是“映射和/或过滤列表”的一个花哨术语,还是有更多含义?

最佳答案

你是对的:列表推导本质上只是 map 和 filter 的语法糖(来自函数式编程世界的术语)。

希望这个示例代码能证明它们的相等性:

>>> # Python 2
>>> [x**2 for x in range(10)] == map(lambda x: x**2, range(10))
True
>>> [2**i for i in range(13)] == map(lambda x: 2**x, range(13))
True
>>> S = [x**2 for x in range(10)]
>>> [x for x in S if x % 2 == 0] == filter(lambda x: x % 2 == 0, S)
True

请注意,这仅在 Python 2.X 中有效,正如 SilentGhost 在评论中指出的那样。为了使其与 Python 3 兼容,您必须在 list 构造函数中包装对 map 或 filter 的调用,因为 map 和 filter 已更新为返回迭代器,而不是列表。

>>> # Python 3
>>> [x**2 for x in range(10)] == list(map(lambda x: x**2, range(10)))
True
>>> [2**i for i in range(13)] == list(map(lambda x: 2**x, range(13)))
True
>>> S = [x**2 for x in range(10)]
>>> [x for x in S if x % 2 == 0] == list(filter(lambda x: x % 2 == 0, S))
True

关于python - Python 列表理解是否与 Perl 中的 map/grep 相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1418912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com