简介👾
非常高兴大家能够订阅这个专栏,在这里我将会给大家分享一些Python相关源码的剖析 在接下来的这段日子里,我会一同带各位pythonista探索Python的奥秘
hello world 👾
hello world, hello python, hello golang等等也许是你的第一行代码 __hello__是一个冻结模块,作为冻结模块支持的一个测试样例 source code link
$ python -c "import __hello__"
Hello world!
$ ipython
Python 3.9.1 (tags/v3.9.1:1e5d33e, Dec 7 2020, 17:
Type 'copyright', 'credits' or 'license' for more i
IPython 7.27.0 -- An enhanced Interactive Python. T
In [1]: import __hello__
Hello world!
In [2]: import __hello__ # 一个模块只会被导入一次,所以不会打印hello world
In [3]: __hello__.initialized
Out[3]: True
In [4]: __hello__
Out[4]: <module '__hello__' (frozen)>
In [5]: help(__hello__)
Help on module __hello__:
NAME
__hello__
DATA
initialized = True
FILE
(built-in)
In [6]: dir(__hello__)
Out[6]:
['__builtins__',
'__doc__',
'__loader__',
'__name__',
'__package__',
'__spec__',
'initialized']
In [7]: __hello__.__doc__
In [8]: import __phello__
Hello world!
In [9]: import __phello__
In [10]: __phello__
Out[10]: <module '__phello__' (frozen)>
In [11]: quit
在Unix系统中生成frozen程序参考如下 Freeze Utility
braces(花括号)👾
对于大多数语言,使用的是{}, 而Python是以缩进来代替 如果想要使用{}的话,不可能!
$ ipython
In [1]: from __future__ import braces
File "<ipython-input-1-6d5c5b2f0daf>", line 1
from __future__ import braces
^
SyntaxError: not a chance
Uncle Barry(尖括号) 👾
在Python的演进中, 有不等式运算符!=和<>的争论, !=获胜,以避免歧义并且提高可读性 Barry Warsaw成为了FLUFL(Friendly Language Uncle For Life) 你可以使用此语句from future import barry_as_FLUFL用<>作为不等运算符 这明显是个愚蠢的决定, 可以看看2009/04/01的PEP PEP 401
$ ipython
In [1]: 1 != 1
Out[1]: False
In [2]: from __future__ import barry_as_FLUFL
In [3]: 1 != 1
File "<ipython-input-3-a91d0d3dd7a4>", line 1
1 != 1
^
SyntaxError: with Barry as BDFL, use '<>' instead of '!='
In [4]: 1 <> 1
Out[4]: False
Hash(哈希)👾
正无穷和负无穷的哈希 可以看到正无穷和负无穷的哈希(±10^5 x pi)与314159哈希冲突了 python中万物皆对象, 相同的哈希也可能是不同的对象
$ ipython
In [1]: import sys
In [2]: sys.float_info.max
Out[2]: 1.7976931348623157e+308
In [3]: hash(float('inf')) # hash(float('infinity'))
Out[3]: 314159
In [4]: hash(float('nan')) # hash(float('-inf')) 或 hash(float('-infinity'))
Out[4]: 0
In [5]: hash(31419), hash(0)
Out[5]: (31419, 0)
__peg_parser__(关键字)👾
__peg_parser__是python 3.9的一个关键字,使用会抛出SyntaxError
$ ipython
In [1]: import keyword
In [2]: keyword.iskeyword("__peg_parser__")
Out[2]: True
In [3]: keyword.kwlist
Out[3]:
['False',
'None',
'True',
'__peg_parser__',
'and',
'as',
'assert',
'async',
'await',
'break',
'class',
'continue',
'def',
'del',
'elif',
'else',
'except',
'finally',
'for',
'from',
'global',
'if',
'import',
'in',
'is',
'lambda',
'nonlocal',
'not',
'or',
'pass',
'raise',
'return',
'try',
'while',
'with',
'yield']
In [4]: len(keyword.kwlist)
Out[4]: 36
In [5]: __peg_parser__
File "<ipython-input-5-367c45f0f1f4>", line 1
__peg_parser__
^
SyntaxError: You found it!
antigravity(抗重力)👾
如下将会重定向你到xkcd 353
import antigravity
webbrowser模块是一个启动和远程控制浏览器的接口 在接下来的内置库(为了方便起见,我不在区分模块和库,接下来都是称之为模块)源码分析中会讲解到
作为一个户外探险的游戏, 参与者可以到达一个随机的位置(GPS信息), 然后讲述旅行故事 geohashing 有游戏的详细描述 xkcd 426 使用漫画的形式来说明了此算法的原理
$ ipython
In [1]: from antigravity import geohash
In [2]: geohash(37.421542, -122.085589, b'2005-05-26-10458.68')
37.857713 -122.544543
源码如下:
import hashlib
def geohash(latitude, longitude, datedow):
'''Compute geohash() using the Munroe algorithm.
>>> geohash(37.421542, -122.085589, b'2005-05-26-10458.68')
37.857713 -122.544543
'''
h = hashlib.md5(datedow, usedforsecurity=False).hexdigest()
p, q = [('%f' % float.fromhex('0.' + x)) for x in (h[:16], h[16:32])]
print('%d%s %d%s' % (latitude, p[1:], longitude, q[1:]))
上图显示将输入的字节序列也就是日期加道格拉斯指数用md5生成128位(32个十六进制数字表示)字符串 float.fromhex(argx)可以返回由十六进制字符串s表示的浮点数 (h[:16], h[16:32])将h分成了两半 '%f’没有给定精度会保留小数点后6位 %s是十进制整数类型, 以10为底的数字 输出经纬度的整数部分%d: 输入的经纬度整数部分分别组成 输出经纬度的小数部分%s: 是由p和q的小数部分分别组成的
结束语👾
如果有什么不足的地方,请在下方留言 我是江湖狗哥,我们下期再见
|