python內建了decimal模組,主要解決日常精度,預設提供了28個小數字進行數學計算。
decimal中decimal 類解決了ieee 754浮點數產生的精度問題,並且可以進行更為準確捨入行為。
所以我們在涉及重要場合比如貨幣金額計算情況,非常合適。
當然我們也可以進行把小數轉化為整數計算,只是會更麻煩一些,不夠靈活應對。
遇到特殊情況是,應該丟擲異常,而不是返回none,比如除法分子為0的情況,當呼叫者看到異常就知道如何修正**。
舉乙個錯誤的例子
def divide(a, b):
try:
return a/b
except zerodivisonerror
return none
返回none的話,由於我們有空字串,0,空字典,空列表等都表示false,容易誤導我們寫出錯誤的**。
另外就算我們意識到這個問題,我們**中也會充斥許多檢查none值的判斷語句,變相增加了我們工作量
緊接上一條,在傳遞可變引數我們引數應該使用none,因為函式的預設值,只會在程式載入模組並讀到本函式的定義時進行評估。
如果預設值用空字典,空列表,往往會導致前後共用乙個預設值,發生奇怪行為。
我們可以使用none作為形式上的預設值,在中途重新賦值,改變這種行為。
通過列表、字典推導可以讓我們**看起來更為簡單明瞭,比如下面例子:
a = [1,2,3,4,5,6]上面一對比一下就知道那個更容易理解了,列表推導雖好,但不建議多個列表推導式,雖然最終看起來節約了**,但是給人難以理解,增加理解成本。把filter函式和map結合起來也能做到,但是**變得更為複雜難懂
畢竟**是給人看的,只是順帶給機器執行一下而已。:)
除錯過程中,雖然有 print,logger,單元測試幫助我們查詢問題原因,但是面對更為複雜的問題除錯,往往需要更強大的除錯工具進行互動操作,列印區域性變數,程式狀態,檢視上下文,單步除錯等等。
ipdb是pdb的公升級版,非常靈活支援**變數輸入補全,非常方便,類似ipython和python的功能對比,推薦大家去使用使用。
經常看到一些新手開發的時候,在進行環境引數配置匯入匯出的時候喜歡用層層疊加的方式覆蓋,每次開發過程把配置檔名pro_config.py 改為 pro_config.py.bak來進行環境變數控制等等。
try:
from local_config import *
from dev_config import *
from pro_config import *
except:
pass
python有對應的包importlib
,結合os
模組,我們可以通過export
進行環境變數的控制,
import importlib
import os
config_file = os.getenv('***_api_settings')
if not config_file:
config_file = '***.config.test'
config_module = importlib.import_module(config_file)
編寫高質量的CSS
我們應用css的能力應該分成兩部分 一部分是css的api,重點是如何用css控制頁面內元素的樣式 另一部分是css框架,重點是如何對css進行組織。base層 reset功能 通用類 common層 元件級別的css類 page層 頁面級別css樣式 舉個例子,有兩個列表,列表條目1字型14px紅...
高質量CSS編寫規範
id和class的命名在保持語義性的同時盡可能的短.可以縮寫單詞,但縮寫後務必能讓人明白其含義。比如author縮寫成atr就非常費解。屬性書寫順序,首先定義顯示屬性 推薦的寫法 selector 不推薦的寫法 selector 這樣,就可以從css 規則中靠前的定義獲得顯示版式。框架為先,細節次之...
java 編寫高質量的equals
1,使用 操作符檢查 引數是否為這個物件的引用 是則返回true 2,使用instanceof 操作符檢查 引數是否為正確的型別 如果不是返回false 3,把引數轉換為正確的型別 4,對於該類中的每個 關鍵 域,檢查引數中的域是否與物件中對應的域相匹配 5,當你編寫完成了equals方法後,應該問...