今天要介绍的是在 Github 上一个非常非常有趣的 Python 项目。
这个项目从名字开始,就给人一种有趣,搞怪的感觉。
这个项目名为:
What the f*ck Python!
看吧,这项目名就是这么简单粗暴。
再来看看项目介绍。
他说 Python 是一个设计优美的解释型高级语言,但有时候,Python 的一些输出结果对于初学者来说,并不是那么一目了然。
因此,他就弄了这个有趣的项目,意在收集 Python 那些
难以理解
,
反人类直觉
的例子和鲜为人知的特性,并讨论这些现象背后的真正原理。
我也看了下这个项目,这个项目主要介绍 Python 上那些奇奇怪怪的坑,而且每个坑都带有示例解说,解析的也非常的有趣。
虽然并不是每个例子都让你觉得 WTFs,但还是能学到很多东西的,还能获得很多乐趣。
就拿第一个示例来说吧。
Strings can be tricky sometimes/微妙的字符串
给了 3 个示例:
1.
当在同一行将 a 和 b 的值设置为
正因为这个项目非常有趣,知识点也是满满的,所以
star 数很多
。
这个项目有中文版和英文版两个版本。
中文版有 10.6k 的 star ,英文版有 21.3k 的 star 。
>>> a = "some_string"
>>> id(a)
140420665652016
>>> id("some" + "_" + "string") # 注意两个的id值是相同的.
140420665652016
2.
>>> a = "wtf"
>>> b = "wtf"
>>> a is b
True
>>> a = "wtf!"
>>> b = "wtf!"
>>> a is b
False
>>> a, b = "wtf!", "wtf!"
>>> a is b
True # 3.7 版本返回结果为 False.
3.
>>> 'a' * 20 is 'aaaaaaaaaaaaaaaaaaaa'
True
>>> 'a' * 21 is 'aaaaaaaaaaaaaaaaaaaaa'
False # 3.7 版本返回结果为 True
最后给出说明:
说明:
这些行为是由于 Cpython 在编译优化时, 某些情况下会尝试使用已经存在的不可变对象而不是每次都创建一个新对象. (这种行为被称作字符串的驻留[string interning])
发生驻留之后, 许多变量可能指向内存中的相同字符串对象. (从而节省内存)
在上面的代码中, 字符串是隐式驻留的. 何时发生隐式驻留则取决于具体的实现. 这里有一些方法可以用来猜测字符串是否会被驻留:
1、所有长度为 0 和长度为 1 的字符串都被驻留.
2、字符串在编译时被实现 ('wtf' 将被驻留, 但是 ''.join(['w', 't', 'f']) 将不会被驻留)
3、字符串中只包含字母,数字或下划线时将会驻留. 所以 'wtf!' 由于包含 ! 而未被驻留. 可以在这里找到 CPython 对此规则的实现.
![f4b30fba7e2889c9b28f3c4b63a1f24f.png](https://i-blog.csdnimg.cn/blog_migrate/7c097861ae674e374efa3313d8492069.png)
wtf!
的时候, Python 解释器会创建一个新对象, 然后同时引用第二个变量(译: 仅适用于3.7以下). 如果你在不同的行上进行赋值操作, 它就不会“知道”已经有一个
wtf!
对象 (因为
wtf!
不是按照上面提到的方式被隐式驻留的). 它是一种编译器优化, 特别适用于交互式环境.
常量折叠(constant folding) 是 Python 中的一种 窥孔优化(peephole optimization) 技术. 这意味着在编译时表达式
'a'*20
会被替换为
'aaaaaaaaaaaaaaaaaaaa'
以减少运行时的时钟周期. 只有长度小于 20 的字符串才会发生常量折叠. (为啥? 想象一下由于表达式
'a'*10**10
而生成的
.pyc
文件的大小).
如果你是使用 3.7 版本中运行上述示例代码, 会发现部分代码的运行结果与注释说明相同. 这是因为在 3.7 版本中, 常量折叠已经从窥孔优化器迁移至新的 AST 优化器, 后者可以以更高的一致性来执行优化.
但是在最新的 3.8 版本中, 结果又变回去了.
看完之后,知识点是不是又增加了呢?
像这样的示例,这个 Github 项目还有很多。
![a39cbbe20098f96a617fe92c58cf8d01.png](https://i-blog.csdnimg.cn/blog_migrate/6b3d58229f5974c36b403a626888e484.png)
中文版 Github 地址:https://github.com/leisurelicht/wtfpython-cn
英文版 Github 地址:https://github.com/satwikkansal/wtfpython
这个项目的原作者是名为 Satwik Kansal 的印度少年。
我找到了他的个人博客,他是这样介绍自己的。
![5be1a0422c5812fbf35dc735e9e7aa95.png](https://i-blog.csdnimg.cn/blog_migrate/1e2159d0962299333c9d453368f5d0bd.png)
也是一个有趣,有创意的技术人员。