加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 移动互联 > 正文

Python的51个“秘密”被曝光,GitHub获2万星

发布时间:2019-06-21 19:18:48 所属栏目:移动互联 来源:七月在线
导读:Python,是一个设计优美的解释型高级语言,它提供了很多能让程序员感到舒适的功能特性。 但有的时候,Python一些特性导致的输出结果,对于初学者就很难理解了。 一个解析51项堪称是秘密的Python特性项目,在GitHub上彻底火了。 英文原版已经拿到了近15000
副标题[/!--empirenews.page--]

 Python的51个“秘密”被曝光,GitHub获2万星

Python,是一个设计优美的解释型高级语言,它提供了很多能让程序员感到舒适的功能特性。

但有的时候,Python一些特性导致的输出结果,对于初学者就很难理解了。

一个解析51项堪称是“秘密”的Python特性项目,在GitHub上彻底火了。

英文原版已经拿到了近15000星,中文翻译版也获得了7500+星。

Python的51个“秘密”被曝光,GitHub获2万星 Python的51个“秘密”被曝光,GitHub获2万星

项目中的部分内容,也许你听说过,但依然可能会透露一些你所不知道的Python有趣特性。

我觉得这是学习编程语言内部原理的好机会,而且我相信你也会从中获得乐趣!

如果你是一位经验比较丰富的Python程序员,你可以试试能否一次就找到正确答案。

也许你对其中的一些例子比较熟悉,那这些案例能唤起你当年踩坑时的甜蜜回忆。

这个项目的中文版全文大约2万字,干货多的快要溢出来了,大家可以先看一下目录。

Python的51个“秘密”被曝光,GitHub获2万星

示例结构

所有示例的结构都如下所示:

> 一个精选的标题

# 准备代码.

# 释放魔法...

Output (Python version):

>>> 触发语句

出乎意料的输出结果

(可选): 对意外输出结果的简短描述。

说明:

简要说明发生了什么以及为什么会发生。

如有必要,举例说明

Output:

>>>触发语句#一些让魔法变得容易理解的例子

#一些正常的输入

注意:所有的示例都在Python3.5.2版本的交互解释器上测试过,如果不特别说明应该适用于所有Python版本。

用法

我个人建议,最好依次阅读下面的示例,并仔细阅读设置例子最开始的代码。

阅读输出结果

  • 确认结果是否如你所料.

  • 确认你是否知道这背后的原理

示例

微妙的字符串

1.

  1. >>> a = "some_string" 
  2. >>> id(a) 
  3. 140420665652016 
  4. >>> id("some" + "_" + "string") # 注意两个的id值是相同的. 
  5. 140420665652016 

2.

  1. >>> a = "wtf" 
  2. >>> b = "wtf" 
  3. >>> a is b 
  4. True 
  5.  
  6. >>> a = "wtf!" 
  7. >>> b = "wtf!" 
  8. >>> a is b 
  9. False 
  10.  
  11. >>> a, b = "wtf!", "wtf!" 
  12. >>> a is b 
  13. True 

3.

  1. >>> 'a' * 20 is 'aaaaaaaaaaaaaaaaaaaa' 
  2. True 
  3. >>> 'a' * 21 is 'aaaaaaaaaaaaaaaaaaaaa' 
  4. False 

说明:

这些行为是由于 Cpython 在编译优化时,某些情况下会尝试使用已经存在的不可变对象,而不是每次都创建一个新对象。(这种行为被称作字符串的驻留[string interning])

发生驻留之后,许多变量可能指向内存中的相同字符串对象。(从而节省内存)

在上面的代码中,字符串是隐式驻留的。何时发生隐式驻留则取决于具体的实现。这里有一些方法可以用来猜测字符串是否会被驻留:

所有长度为 0 和长度为 1 的字符串都被驻留。

字符串在编译时被实现。('wtf' 将被驻留, 但是 ''.join(['w', 't', 'f'] 将不会被驻留)

字符串中只包含字母,数字或下划线时将会驻留。所以 'wtf!' 由于包含!而未被驻留。可以在这里找CPython对此规则的实现。

Python的51个“秘密”被曝光,GitHub获2万星

当在同一行将 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.

  1. some_dict = {} 
  2. some_dict[5.5] = "Ruby" 
  3. some_dict[5.0] = "JavaScript" 
  4. some_dict[5] = "Python" 
  5.  
  6. Output: 
  7.  
  8. >>> some_dict[5.5] 
  9. "Ruby" 
  10. >>> some_dict[5.0] 
  11. "Python" 
  12. >>> some_dict[5] 
  13. "Python" 
  14.  
  15. "Python" 消除了 "JavaScript" 的存在? 

说明:

Python 字典通过检查键值是否相等和比较哈希值来确定两个键是否相同。

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读