Python

安装python

1
sudo apt-get install python

咦?好像一般的linux发行版自带。呃,忘了。

终端里键入python。

函数定义及函数对象

1
2
3
4
5
6
7
8
9
10
11
def foo(a):
x = 3
return x + a

foo #函数对象!可以不调用函数而直接使用
foo(2) #函数调用!
foo.func_code #代码对象
dir(foo.func_code) #显示代码对象的属性
foo.func_code.co_varnames #foo函数变量名
foo.func_code.co_consts #foo函数常量
foo.func_code.co_argcount #foo函数参数个数

字节码

生成代码对象的指令叫字节码(由一组字节组成)。它也是代码对象的一个属性,包含了各种作用于解释器的指令。

1
foo.func_code.co_code

通过ord查看字节码:

1
[ord(b) for b in foo.func_code.co_code]

解释器循环接收各个字节,查找每个字节的指令并执行。字节码本身并不包含任何python对象,或引用任何对象。

通过dis模块了解字节码的意思–反汇编字节码

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> def foo(a):
... x = 3
... return x + a
...
>>> import dis
>>> dis.dis(foo.func_code)
2 0 LOAD_CONST 1 (3)
3 STORE_FAST 1 (x)

3 6 LOAD_FAST 1 (x)
9 LOAD_FAST 0 (a)
12 BINARY_ADD
13 RETURN_VALUE
  • 最左列是源代码行号
  • 第二列是字节码的偏移量
  • 中间列是字节的名字--供程序员看
  • 第四列为参数本身--表示一个指向代码对象其它属性的索引。LOAD_CONST的参数指向列表co_consts,STORE_FAST的参数指向co_varnames。dis在第四列所指向的的地方查找常数或者名称, 最后在第五列返回给我们它找到的数据。
1
2
3
4
>>> foo.func_code.co_consts[1]
3
>>> foo.func_code.co_varnames[1]
'x'