Python的51个“秘密”被曝光,GitHub获2万星
副标题[/!--empirenews.page--]
Python,是一个设计优美的解释型高级语言,它提供了很多能让程序员感到舒适的功能特性。 但有的时候,Python一些特性导致的输出结果,对于初学者就很难理解了。 一个解析51项堪称是“秘密”的Python特性项目,在GitHub上彻底火了。 英文原版已经拿到了近15000星,中文翻译版也获得了7500+星。 ![]() ![]() 项目中的部分内容,也许你听说过,但依然可能会透露一些你所不知道的Python有趣特性。 我觉得这是学习编程语言内部原理的好机会,而且我相信你也会从中获得乐趣! 如果你是一位经验比较丰富的Python程序员,你可以试试能否一次就找到正确答案。 也许你对其中的一些例子比较熟悉,那这些案例能唤起你当年踩坑时的甜蜜回忆。 这个项目的中文版全文大约2万字,干货多的快要溢出来了,大家可以先看一下目录。 ![]() 示例结构 所有示例的结构都如下所示: > 一个精选的标题 # 准备代码. # 释放魔法... Output (Python version): >>> 触发语句 出乎意料的输出结果 (可选): 对意外输出结果的简短描述。 说明: 简要说明发生了什么以及为什么会发生。 如有必要,举例说明 Output: >>>触发语句#一些让魔法变得容易理解的例子 #一些正常的输入 注意:所有的示例都在Python3.5.2版本的交互解释器上测试过,如果不特别说明应该适用于所有Python版本。 用法 我个人建议,最好依次阅读下面的示例,并仔细阅读设置例子最开始的代码。 阅读输出结果
示例 微妙的字符串 1.
2.
3.
说明: 这些行为是由于 Cpython 在编译优化时,某些情况下会尝试使用已经存在的不可变对象,而不是每次都创建一个新对象。(这种行为被称作字符串的驻留[string interning]) 发生驻留之后,许多变量可能指向内存中的相同字符串对象。(从而节省内存) 在上面的代码中,字符串是隐式驻留的。何时发生隐式驻留则取决于具体的实现。这里有一些方法可以用来猜测字符串是否会被驻留: 所有长度为 0 和长度为 1 的字符串都被驻留。 字符串在编译时被实现。('wtf' 将被驻留, 但是 ''.join(['w', 't', 'f'] 将不会被驻留) 字符串中只包含字母,数字或下划线时将会驻留。所以 'wtf!' 由于包含!而未被驻留。可以在这里找CPython对此规则的实现。 ![]() 当在同一行将 a 和 b 的值设置为 "wtf!" 的时候, Python 解释器会创建一个新对象, 然后同时引用第二个变量。 如果你在不同的行上进行赋值操作, 它就不会“知道”已经有一个 wtf! 对象 (因为 "wtf!" 不是按照上面提到的方式被隐式驻留的)。 它是一种编译器优化,特别适用于交互式环境。 常量折叠(constant folding) 是 Python 中的一种窥孔优化(peephole optimization) 技术。 这意味着在编译时表达式 'a'*20 会被替换为 'aaaaaaaaaaaaaaaaaaaa' 以减少运行时的时钟周期。 只有长度小于 20 的字符串才会发生常量折叠。(为啥? 想象一下由于表达式'a'*10**10 而生成的 .pyc 文件的大小)相关的源码: https://github.com/python/cpython/blob/3.6/Python/peephole.c#L288 是时候来点蛋糕了! 1.
说明: Python 字典通过检查键值是否相等和比较哈希值来确定两个键是否相同。 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |