- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在我的代码中经常使用 python 的函数 zip(主要是为了创建如下所示的字典)
dict(zip(list_a, list_b))
我发现它真的很有用,但有时它会让我感到沮丧,因为我最终会遇到 list_a 与 list_b 的长度不同的情况。 zip 只是继续并将两个列表压缩在一起,直到它获得一个与较短列表长度相同的压缩列表,忽略较长列表的其余部分。在大多数情况下,这似乎应该被视为错误,根据 python 的禅宗,它永远不应该默默地通过。
鉴于这是一个不可或缺的功能,我很好奇为什么要这样设计?如果您尝试将两个不同长度的列表压缩在一起,为什么不将其视为错误?
最佳答案
zip
允许不等长参数,因为它旨在通过允许 不等长参数改进 map
。这种行为是 zip
存在的原因。
这是在 zip
存在之前你是如何做的:
>>> a = (1, 2, 3)
>>> b = (4, 5, 6)
>>> for i in map(None, a, b): print i
...
(1, 4)
(2, 5)
(3, 6)
>>> map(None, a, b)
[(1, 4), (2, 5), (3, 6)]
这非常不直观,并且不支持不等长列表。这是一个主要的设计问题,您可以在 the official RFC proposing zip
for the first time 中一目了然。 :
While the map() idiom is a common one in Python, it has several disadvantages:
It is non-obvious to programmers without a functional programming background.
The use of the magic
None
first argument is non-obvious.It has arbitrary, often unintended, and inflexible semantics when the lists are not of the same length - the shorter sequences are padded with
None
:
>>> c = (4, 5, 6, 7)
>>> map(None, a, c)
[(1, 4), (2, 5), (3, 6), (None, 7)]
所以,不,这种行为不会被视为错误 - 这就是它最初设计的原因。
因为它非常有用,明确指定并且根本不必将其视为错误。
通过允许不等长度,zip
只要求其参数符合 iterator protocol .这允许 zip
扩展到生成器、元组、字典键以及世界上任何实现 __next__()
和 __iter__()
的东西,正是因为它不询问长度。
这很重要,因为生成器不支持len()
,因此无法事先检查长度。添加一个长度检查,你就会破坏 zip
在生成器上工作的能力,而这正是应该的时候。这是一个相当严重的劣势,你不同意吗?
Guido van Rossum 希望这样:
Optional padding. An earlier version of this PEP proposed an optional pad keyword argument, which would be used when the argument sequences were not the same length. This is similar behavior to the map(None, ...) semantics except that the user would be able to specify pad object. This has been rejected by the BDFL in favor of always truncating to the shortest sequence, because of the KISS principle. If there's a true need, it is easier to add later. If it is not needed, it would still be impossible to delete it in the future.
亲吻胜过一切。
关于python - Zen of Python : Errors should never pass silently. 为什么 zip 会这样工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39628456/
本文实例讲述了zen cart实现订单中增加paypal中预留电话的方法。分享给大家供大家参考,具体如下: 在PayPal的IPN返回值中联系电话是 contact_phone, 前提是你帐户设定
zencart新进商品的随机排序修改方法第一步:首先,新进商品可以自己定义时间段:商店设置-最大值-新进商品的定义 zencart新进商品的随机排序修改方法第二步: 修改首
Closed. This question is off-topic。它当前不接受答案。 想要改善这个问题吗? Update the question,所以它是用于堆栈溢出的on-topic。 已关闭
我已多次尝试在 Ubuntu 11.10 中安装适用于 Gedit 的 Zen Coding 插件。 (我安装了所有最新更新。)我知道我做得正确,因为我在其他安装上完成了它,没有任何问题,但由于某种原
css在我看来是一套技巧。每当我读到一些css技术,它看起来更像是技巧。当我写css时,我经常需要调整html结构,我感觉很糟糕。 你们中的一些人有一些启蒙和享受css禅吗?你是怎么达到css禅的?
我正在尝试了解如何向 Notepad++ 的 Zen Coding (ZC) 插件添加自定义片段。我找到了 ZC 存储其片段的文件 C:\Program Files\Notepad++\plugins
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 10年前关闭。 Improve this
Closed. This question needs to be more focused 。它目前不接受答案。 想改善这个问题吗?更新问题,使其仅通过 editing this post 关注一个
vscode-screenshot 我很确定一切都井然有序,但它在运行服务器或刷新服务器(通过保存 python 文件)时不断显示这首诗。请帮忙,这很烦人。 最佳答案 Python 之禅打印为 by
vscode-screenshot 我很确定一切都井然有序,但它在运行服务器或刷新服务器(通过保存 python 文件)时不断显示这首诗。请帮忙,这很烦人。 最佳答案 Python 之禅打印为 by
我正在编写一个 JavaScript 单元测试套件,我想添加的功能之一是能够断言某个元素及其子元素与给定的 HTML 结构匹配。 我的第一个想法是使用 jQuery(好吧,Sizzle)并要求用户写
在主产品信息页面中,它显示了完整的产品描述,我试图放入超长的 HTML 代码来进行打包交易。在编写了大约 1200 行 html 后,我遇到了困难。 我可以做一些改变来扩大产品描述的最大字符长度吗?
假设您有禅宗片段: div#container>(div.panel>h2{this is the header inside panel $})*3 它将评估为: thi
我在尝试为 Drupal 7 创建 Zen 子主题时感到困惑。首先,如果这是一个愚蠢的问题,我很抱歉,但我不是 CSS 专家。 基本上我想为下图所示的导航菜单设置一个固定的高度:(带有主页链接的那个)
zen coding 是一个很好的工具。但是zen coding还能回到之前的水平吗?看这个例子: 首先,我写p>span.footnote$所以我进入了的水
我刚刚发现了禅宗编码。 我有以下要生成的代码片段。 有没有办法用一行 zen-co
这个问题在这里已经有了答案: List comprehension vs map (14 个答案) 关闭 8 年前。 这个问题听起来可能是主观的,但正如“禅宗”所说,(几乎总是)有一种首选方式,最后
使用 ul>li*3 我实现了 但我想要的是这
本文整理了Java中org.elasticsearch.discovery.zen.ZenDiscovery类的一些代码示例,展示了ZenDiscovery类的具体用法。这些代码示例主要来源于Gith
本文整理了Java中org.elasticsearch.discovery.zen.ZenPing类的一些代码示例,展示了ZenPing类的具体用法。这些代码示例主要来源于Github/Stackov
我是一名优秀的程序员,十分优秀!