pyc是由.py文件經(jīng)過編譯后生成的字節(jié)碼文件居砖,其加載速度相對于之前的.py文件有所提高,而且還可以實現(xiàn)源碼隱藏顽频,以及一定程度上的反編譯。比如圆兵,Python3.3編譯生成的.pyc文件,Python3.4就別想著去運行啦枢贿!一般來說import 別的 py 文件時殉农,那個 py 文件會被存一份 pyc 加速下次裝載。
pyc反編譯恢復到python代碼局荚,通過uncompyle6包就可以實現(xiàn)超凳,在線的反編譯工具也靠很方便,pyo文件也屬于py編譯的中間文件,所以也可以通過以上方式實現(xiàn)反編譯耀态,但是需要注意的是:有些時候需要滿足后綴名是滿足pyd,pyc,pyd的轮傍。但現(xiàn)在反編譯得到的python的代碼中一般不是完整的,或增加防護首装,或者有一些加密修改创夜,又或者利用一些函數(shù)復雜嵌套,例如lambda函數(shù)的嵌套使用仙逻,使得python的代碼變得比較難讀驰吓。
lambda是一個匿名函數(shù),表示一種運算系奉,lambda [ arg1 [arg2, arg3, … argN] ] : expression
例如:
map(lambda x : x*x, [y for y in range(10)])
lambda后寫的事函數(shù)變量x以及對x的操作檬贰,逗號之后表示x取值的方式。另外一種寫法類似與如下表示缺亮,使用括號來分割各個部分:
map( (lambda (x)(x*x)) (list 2 3 4) )
還有類似與下圖的式子翁涤,定義了一個參數(shù)為x的函數(shù)g,返回值是一個lambda函數(shù)萌踱,在lambda函數(shù)里葵礼,對x和y的大小進行比較并返回一個布爾值。使用((g ?(2))3)就可以實現(xiàn)返回3與2比較的布爾結(jié)果并鸵。
嵌套lambda還可以寫成(lambdaN:(lambdax:N>x))(2)(3)類似的函數(shù)章咧,第一個2是N的表示,3是x能真。
lambda : [ (fout.write(sssss), (fout.close(), None)[1])[1] for None in [open('key.enc', 'wb+')] ][0]
上面的語句中使用for None in XXX赁严,相當于fout=open('key.enc', 'wb+')。
(getattr(__old, '__ior__', (lambda other: NotImplemented))value
上面的語句則是使用getattr函數(shù)來實現(xiàn)或運算的函數(shù)功能粉铐。
另外在一些lambda函數(shù)中也可能使用數(shù)組來表示一個變量的名字對應使用變量的內(nèi)容疼约,如:
__l['data'][__l['i']]表示的是data[i]的值,其中__l是符號表的集合蝙泼。編譯過程中會將一些變量存在符號表中程剥,通過符號表索引到對應的地址和值。__l['i'][0]就是對應的值。
但是這些還不夠织鲸,嘗試分析一下:((lambda x: x(x)),)((lambda y: (f,)((lambda : y(y)()))))函數(shù)是在干什么舔腾。。搂擦。稳诚。還是不會。