Tag Archives

14 Articles

Python局部變量的坑

0   10272 轉為簡體

最近碰到這麼個問題,有這麼個函數,用來將HTML轉義字符變回原來的字符:

其中unichr用來將一個整數轉換成Unicode字符,僅在Python2中存在。Python3中,chr可以同時處理ASCII字符和Unicode字符。所以我們在Python3環境中將unichr映射到chr上。

運行這段代碼會在第8行報錯:NameError: free variable ‘unichr’ referenced before assignment in enclosing scope。而且只有Python2會報錯,Python3不會。

 

首先從問題上看,報錯的原因是在閉包replc里unichr沒有定義。

但是Python2明明是有unichr這個內置函數的,為啥就變成未定義呢?

Read More

Python float和decimal

2   10272 轉為簡體

在Windows上打包Python腳本時遇到一個需求,將浮點數轉成字符數組,比如輸入1.001,得到[‘1′,’0′,’0′,’1’]

一開始想當然地用了:

version = 2.001

v = list(str(int(version * 1000)))

發現好像哪裡不對,得到的v是[‘1’, ‘0’, ‘0’, ‘0’]。想了一想應該是浮點數的精度問題,因為一看version * 1000 = 1000.9999999999999

所以有這麼幾種解決方法:

v = list(str(int(round(version * 1000))))

或者:

v = list(str(version).replace(“,”, “”) + “000”)[:4]

或者用decimal模塊,decimal是固定小數點位數的,用的是十進制乘除法,所以(在設定的位數內)不會產生誤差:

from decimal import getcontext, Decimal

getcontext().prec = 4

v = list(str(Decimal(version) * 1000))

需要注意的是decimal會自動轉換科學計數法,可以用”%d” % Decimal(d)來得到原始值。

 

Python中熱補丁(Hot Patching)的實現和一些問題

2   16188 轉為簡體

有時候我們可能需要只修改一部分代碼而且要求修改立即生效,或者為了高可用性不允許停止服務程序,這時我們就需要熱補丁

在debian,red hat等系統(或者vista之後的windows)的軟件更新時,通常使用替換符號鏈接來達到高可用性。

對Python來說,解釋器預先處理了腳本生成位元組碼,並讀入內存;所以之後硬盤上的文件發生了什麼變化,就只能想辦法命令解釋器重新讀入新的腳本。實現這個功能的內建命令是reload

Read More

迅雷快鳥(diǎo)路由器版

557   294602 轉為簡體

可以在路由器或者同一網絡下的任意設備上登陸並心跳,這樣就不用開電腦也不用在手機里裝奇怪的應用了。

對我有潔癖你來打我呀

436919cbgw1erq704m1h4g205k049nfa有問題請留言。如果你要報告一個問題,請同時註明:

  • 所使用的版本 (Python/Shell)
  • 運行的系統環境及版本 (操作系統,Python版本等)
  • 包含錯誤信息的日誌
  • 產生錯誤的操作步驟
  • (可選) 運營商所在地,如:上海電信

Read More

閑扯Python 說說內存

11   18204 轉為簡體

首先,不用解釋器,腦補一下下面這段代碼的結果是什麼

有沒有娃兒和我一樣覺得是[0,1,0]的?

Read More