Python 之禪python
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
優美勝於醜陋(Python以編寫優美的代碼爲目標)
Explicit is better than implicit.
明瞭勝於晦澀(優美的代碼應當是明瞭的,命名規範,風格類似)
Simple is better than complex.
簡潔勝於複雜(優美的代碼應當是簡潔的,不要有複雜的內部實現)
Complex is better than complicated.
複雜勝於凌亂(若是複雜不可避免,那代碼間也不能有難懂的關係,要保持接口簡潔)
Flat is better than nested.
扁平勝於嵌套(優美的代碼應當是扁平的,不能有太多的嵌套)
Sparse is better than dense.
間隔勝於緊湊(優美的代碼有適當的間隔,不要奢望一行代碼解決問題)
Readability counts.
可讀性很重要(優美的代碼是可讀的)
Special cases aren"t special enough to break the rules.
Although practicality beats purity.
即使假借特例的實用性之名,也不可違背這些規則(這些規則至高無上)
Errors should never pass silently.
Unless explicitly silenced.
不要包容全部錯誤,除非你肯定須要這樣作(精準地捕獲異常,不寫except:pass風格的代碼)
In the face of ambiguity, refuse the temptation to guess.
當存在多種可能,不要嘗試去猜想
There should be one-- and preferably only one --obvious way to do it.
而是儘可能找一種,最好是惟一一種明顯的解決方案(若是不肯定,就用窮舉法)
Although that way may not be obvious at first unless you"re Dutch.
雖然這並不容易,由於你不是 Python 之父(這裏的Dutch是指Guido)
Now is better than never.
Although never is often better than right now.
作也許好過不作,但不假思索就動手還不如不作(動手以前要細思量)
If the implementation is hard to explain, it"s a bad idea.
If the implementation is easy to explain, it may be a good idea.
若是你沒法向人描述你的方案,那確定不是一個好方案;反之亦然(方案測評標準)
Namespaces are one honking great idea -- let"s do more of those!
命名空間是一種絕妙的理念,咱們應當多加利用(倡導與號召)編程
一、python編程空格和縮進數據結構
一、每次縮進使用4個空格
二、不要使用Tab,更不要Tab和空格混用
三、兩個方法之間使用一個空行,兩個Class之間使用兩個空行
四、添加一個空格在字典、列表、序列、參數列表中的「,「後,以及在字典中的」:「以後,而不是以前
五、在賦值和比較兩邊放置一個空格(參數列表中除外)
六、緊隨括號後面或者參數列表前一個字符不要存在空格app
二、使用以下方式交換pyhton的值less
b, a = a, b # 其餘例子 In [1]: people = ["David", "Pythonista", "15145551234"] In [2]: name, title, phone = people In [3]: name Out[3]: "David" In [4]: title Out[4]: "Pythonista" In [5]: phone Out[5]: "15145551234" 這種語法在For循環中很是實用: In [6]: people = [["David", "Pythonista", "15145551234"], ["Wu", "Student", "15101365547"]] In [7]: for name, title, phone in people: ...: print name, phone ...: David 15145551234 Wu 15101365547 PS:在使用這種語法時,須要確保左邊的變量個數和右邊tuple的個數一致,不然,Python會拋出ValueError異常。
三、合併字符串的值
result = ",".join(colors)
這樣的效率要比使用for循環進行拼接的效率高,當list元素越多的時候,約明顯ide
四、使用關鍵字in
當要判斷一個key是否在字典中的時候,ui
d = {"a": 1, "b": 2} if "c" in d: print True # DO NOT USE if d.has_key("c"): print True for key in d: print key # DO NOT USE for key in d.keys(): print key
Python的dict對象是對KEY作過hash的,而keys()方法會將dict中全部的KEY做爲一個list對象;因此,直接使用in的時候執行效率會比較快,代碼也更簡潔。idea
五、字典
dict是Python內置的數據結構,在寫Python程序時會常常用到。這裏介紹一下它的get方法和defaultdict方法。
a、get
在獲取dict中的數據時,咱們通常使用index的方式,可是若是KEY不存在的時候會拋出KeyError。這時候你可使用get方法,使用方法:dict.get(key, default=None),能夠避免異常。例如:spa
d = {"a": 1, "b": 2} print d.get("c") # None print d.get("c", 14) # 14
b、fromkeys
dict自己有個fromkeys方法,能夠經過一個list生成一個dict,不過得提供默認的value,例如:code
# ⽤序列作 key,並提供默認value >>> dict.fromkeys(["a", "b", "c"], 1) # {"a": 1, "c": 1, "b": 1}請輸入代碼
c、有些狀況下,咱們須要給dict的KEY一個默認值,你能夠這樣寫:
equities = {} for (portfolio, equity) in data: equities.setdefault(portfolio, []).append(equity)
setdefault方法至關於"get, or set & get",或者至關於"set if necessary, then get"
六、defaultdict
defaultdict()和namedtuple()是collections模塊裏面2個很實用的擴展類型。一個繼承自dict系統內置類型,一個繼承自tuple系統內置類型.
七、字典操做
在Python中,你可使用zip方法將兩個list組裝成一個dict,其中一個list的值做爲KEY,另一個list的值做爲VALUE:
>>> given = ["John", "Eric", "Terry", "Michael"] >>> family = ["Cleese", "Idle", "Gilliam", "Palin"] >>> pythons = dict(zip(given, family)) >>> print pythons {"John": "Cleese", "Michael": "Palin", "Eric": "Idle", "Terry": "Gilliam"}
相反的,你可使用dict的keys()和values()方法來獲取KEY和VALUE的列表:
>>> pythons.keys() ["John", "Michael", "Eric", "Terry"] >>> pythons.values() ["Cleese", "Palin", "Idle", "Gilliam"]
八、python的True
在Python中,判斷一個變量是否爲True的時候,你能夠這樣作:
False True
False (== 0) True (== 1)
"" (空字符串) 除 "" 以外的字符串(" ", "anything")
0, 0.0 除 0 以外的數字(1, 0.1, -1, 3.14)
[], (), {}, set() 非空的list,tuple,set和dict ([0], (None,), [""])
None 大部分的對象,除了明確指定爲False的對象
對於本身聲明的class,若是你想明確地指定它的實例是True或False,你能夠本身實現class的nonzero或len方法。當你的class是一個container時,你能夠實現len方法,以下:
class MyContainer(object): def __init__(self, data): self.data = data def __len__(self): """ Return my length. """ return len(self.data)
若是你的class不是container,你能夠實現nonzero方法,以下:
class MyClass(object): def __init__(self, value): self.value = value def __nonzero__(self): """ Return my truth value (True or False). """ # This could be arbitrarily complex: return bool(self.value)
在Python 3.x中,nonzero方法被bool方法替代。考慮到兼容性,你能夠在class定義中加上如下的代碼:
__bool__ = __nonzero__