Effective Python - 用pythonic方式思考

Effective Python

1.確認本身所用的Python版本

優先使用python3,拋棄python2python

查看python版本信息: python --versiones6

 

2.遵循PEP8風格指南

採用一致的編碼風格令代碼更加易讀,利於多人協做app

絕對應該遵照的規則ide

 

空格函數

(1)使用space來表示縮進,而不要使用tabui

(2)和語法相關的每一層縮進都用4個空格來表示編碼

(3)每行的字符不該超過79es5

(4)對於多行長表達式,除了首行以外的其他各行都應該在一般的縮進級別之上再加4個空格spa

(5)文件中的函數與類之間應該用兩個空行隔開3d

(6)同一個類中的兩個方法之間應該用一個空行隔開

(7)在使用下標獲取列表元素、調用函數或給關鍵字參數賦值時,不要在兩旁添加空格

(8)爲變量賦值時,賦值符號兩邊各添加一個空格

 

命名

(1)函數、變量及屬性應該用小寫字母來拼寫,各單詞間用下劃線鏈接,如bub_sort

(2)受保護的實例屬性,應以單下劃線開頭,如_name

(3)私有的實例屬性,應以雙下劃線開頭,如__name

(4)類與異常,應以每一個單詞首字母大寫的形式命名,如Note

(5)模塊級別的常量,應所有采用大寫字母拼寫,單詞之間用下劃線鏈接,如ERR_CODE

(6)類中實例方法的首個參數,應該命名爲self,表示該對象自身

(7)類方法的首個參數,應該命名爲cls,表示該類自身

 

表達式和語句

(1)採用內聯形式的否認詞,不要把否認詞放在整個表達式的前面,例如應該是 if a is not b 而不是if not a is b

(2)不要經過檢測長度的辦法,如len(list1) == 0來判斷list1是否爲[]或「」等空值,而是採用if not list1來判斷,它會假定空值將自動評估爲False

(3)檢測list1是否爲[1]或‘hi’等非空值,應用if list1語句會默認把非空的值判斷爲True

(4)不要編寫單行的if語句、for循環、while循環及except複合語句,而是應該把這些語句分紅多行來書寫,以示清晰

(5)import語句應該老是放在文件開頭

(6)引入模塊的時候,老是應該使用絕對的名稱,而不該該根據當前模塊的路徑來使用相對名稱

  例如,引入bar包中的foo模塊時,應該完整的寫出from bar import foo,而不該該寫import foo

(7)若是必定要用相對名稱來編寫import語句,應該採用明確的寫法:from .import foo

(8)文件中的import語句應該按順序劃分紅三個部分,分別表示標準模塊、第三方模塊以及自用模塊。

  在每個部分中,各import'語句應該按模塊的順序來排列

 

5.瞭解切割序列的辦法

(1)不要寫多餘的代碼;當從索引開頭獲取元素,應把起始索引留空;當一直取到索引末尾,應把終止索引留空。

nums = [0, 1, 2, 3, 4, 5]
res1 = nums[:] #[0, 1, 2, 3, 4, 5]
res2 = nums[:3] #[0, 1, 2]
res3 = nums[3:] #[3, 4, 5]
res4 = nums[1:3] #[1, 2]
res5 = nums[2:-1] #[2, 3, 4]
res6 = nums[:-1] #[0, 1, 2, 3, 4]
res7 = nums[-2:] #[4, 5]
res8 = nums[-3:-1] #[3, 4]

 

(2)切片操做不計較開始索引和結束索引是否越界。

 利用這一特性,咱們能夠限定輸入序列的最大長度

nums = [_ for _ in range(30)]
first_ten_items = nums[:10]
#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
last_ten_items = nums[-10:]
#[20, 21, 22, 23, 24, 25, 26, 27, 28, 29]

 

(3)對列表賦值時,若是使用切片操做,會把原列表中在相關範圍內的值替換成新值,

位於切片以前和以後的值不變,列表會根據新值的個數相應的擴張和收縮。

nums = [0, 1, 2, 3, 4, 5]
nums_temp = nums
nums[:3] = ['a']
print(nums, nums is nums_temp) #['a', 3, 4, 5] True

 

來看個特殊的

nums = [0, 1, 2, 3, 4, 5]
nums_temp = nums
nums[:] = ['a', 'b', 'c']
print(nums, nums is nums_temp) #['a', 'b', 'c'] True

說明:把右側的新值賦值一份去替換左側列表的所有元素,但不會從新分配新的列表,這個從nums is nums_temp爲True可知。

 

10.儘可能用enumerate取代range

1)range經常使用在一系列整數上的迭代

1 for i in range(10):
2     print(i)
View Code

 

2)對於字符串列表,可直接使用for...in迭代

1 fruits = ["apple", "banana", "pear"]
2 for ele in fruits:
3     print(ele)
View Code

 

3)對於迭代列表時,須要知道當前元素的索引

方式一:range

1 fruits = ["apple", "banana", "pear"]
2 for i in range(len(fruits)):
3     print("%d: %s" % (i, fruits[i]))
View Code

說明:代碼有些生硬,必須先得到序列的長度,再經過下標訪問元素,代碼不免有些臃腫

 

方式二:enumerate

1 fruits = ["apple", "banana", "pear"]
2 for i, ele in enumerate(fruits):
3     print("%d: %s" % (i, ele))
View Code

 

要點:

1.再須要用到所遍歷序列的索引時,通常用enumerate遍歷

2.enumerate可指定開始計數的索引

 

11.用zip函數同時遍歷兩個迭代器

栗子:平行的迭代兩個長度相等的列表,並求fruits中長度最長的元素

fruits = ["apple", "banana", "pear"]
letters = [len(fruit) for fruit in fruits]

 

方式一:經過某個列表的長度來執行循環

 1 fruits = ["apple", "banana", "pear"]
 2 letters = [len(fruit) for fruit in fruits]
 3 
 4 longest_name = None
 5 max_letters = 0
 6 
 7 for i in range(len(fruits)):
 8     if letters[i] > max_letters:
 9         max_letters = letters[i]
10         longest_name = fruits[i]
11 
12 print(max_letters)
13 print(longest_name)
View Code

 

方式二:經過enumerate來執行循環

 1 fruits = ["apple", "banana", "pear"]
 2 letters = [len(fruit) for fruit in fruits]
 3 
 4 longest_name = None
 5 max_letters = 0
 6 
 7 for i, fruit in enumerate(fruits):
 8     if letters[i] > max_letters:
 9         max_letters = letters[i]
10         longest_name = fruit
11 
12 print(max_letters)
13 print(longest_name)
View Code

 

方式三:用zip函數來執行循環

 1 fruits = ["apple", "banana", "pear"]
 2 letters = [len(fruit) for fruit in fruits]
 3 
 4 longest_name = None
 5 max_letters = 0
 6 
 7 for fruit, length in zip(fruits, letters):
 8     if length > max_letters:
 9         max_letters = length
10         longest_name = fruit
11 
12 print(max_letters)
13 print(longest_name)
View Code
相關文章
相關標籤/搜索