Python常見編程規範總結

來源:互聯網
上載者:User

標籤:

Pythonic定義

Python最常用的編碼風格還是PEP8,詳見:http://jython.cn/dev/peps/pep-0008/

Pythonic確實很難定義,先簡單引用下《Python之禪》中的幾句經典闡釋:

優美勝於醜陋(Python 以編寫優美的代碼為目標)明了勝於晦澀(優美的代碼應當是明了的,命名規範,風格相似)簡潔勝於複雜(優美的代碼應當是簡潔的,不要有複雜的內部實現)複雜勝於淩亂(如果複雜不可避免,那代碼間也不能有難懂的關係,要保持介面簡潔)扁平勝於嵌套(優美的代碼應當是扁平的,不能有太多的嵌套)間隔勝於緊湊(優美的代碼有適當的間隔,不要奢望一行代碼解決問題)可讀性很重要(優美的代碼是可讀的)

舉個簡單的例子,使用Pythonic風格編碼的快速排序演算法代碼如下所示:

def quicksort(array):    less = [];    greater = [];    if len(array) <= 1:        return array    pivot = array.pop()    for x in array:        if x <= pivot:            less.append(x)        else:            greater.append(x)    return quicksort(less) + [pivot] + quicksort(greater)
Pythonic代碼風格
  • 交換兩個變數

C語言代碼如下:

 1 int a = 1, b = 2; 2 int tmp = a; 3 a = b; 4 b = tmp; 5  6 //如果兩個變數都為整數類型,當然也可使用: 7  8 int a = 1, b = 2; 9 a = a^b;10 b = a^b;11 a = a^b;12 13 //這樣的形式,可以不用引入第三個變數

Pythonic代碼如下:

1 a, b = b, a
  • Python可以靈活的使用迭代器,安全的關閉檔案描述符,如下:
1 for i in alist:2     do_sth_with(i)3 4 with open(path, ‘r‘) as f:5     do_sth_with(f)

Pythonic追求的是對Python文法的充分發揮,寫出的代碼帶Python味兒,而不是看著向C或JAVA代碼;

  • 不應過分提示
1 a = [1, 2, 3, 4]2 b = ‘abcdef‘3 print a[::-1]4 print b[::-1]

使用Python比較多的人可以比較容易看出其作用,就是輸出逆序的a和b,但還是比較晦澀,Pythonic追求的是充分利用Python文法,上面代碼可寫為:

1 a = [1, 2, 3, 4]2 b = ‘abcdef‘3 print list(reversed(a))4 print list(reversed(b))
  • 字串格式化

我們很多人一般這樣寫,比較簡潔:

1 name = ‘Tom‘2 age = ‘20‘3 print ‘Hello %s, your age is %s !‘ % (name, age)

其實,%s是比較影響可讀性的,尤其是數量多了之後,很難清楚哪個預留位置對應哪個實參,比較Pythonic的代碼如下:

1 value = {‘name‘: ‘Tom‘, ‘age‘: ‘20‘}2 print ‘Hello %(name)s, your age is %(age)s !‘ % value

使用%預留位置的形式,依舊不是Python最推薦的,最具Pythonic風格的代碼如下:

1 print ‘Hello {name}, your age is {age} !‘.format(name = ‘Tom‘, age = ‘20‘)

str.format()是Python最為推薦的字串格式化方法;

  • 包和模組

包和模組的命名採用小寫、單數形式,而且短小;

包通常僅作為命名空間,可以只包含空的__init__.py檔案;

  • 過多的if...elif...elif......else...應使用字典來實現
 1 if n == 0: 2     print "You typed zero..." 3 elif n == 1: 4     print "You are in top..." 5 elif n == 2: 6     print "n is even number..." 7 else: 8     print "Default value" 9 10 # 使用字典來實現更好一些11 12 def f(x):13     return {14         0: "You typed zero...",15         1: "You are in top...",16         2: "n is even number...",17     }.get(x, "Default value")
編寫Pythonic代碼避免劣化代碼
  • 避免只用大小寫來區分不同的對象;
  • 避免使用容易引起混淆的名稱,變數名應與所解決的問題域一致;
  • 不要害怕過長的變數名;
代碼中添加適當注釋
  • 行注釋僅注釋複雜的操作、演算法,難理解的技巧,或不夠一目瞭然的代碼;
  • 注釋和代碼要隔開一定的距離,無論是行注釋還是塊注釋;
  • 給外部可訪問的函數和方法(無論是否簡單)添加文檔注釋,注釋要清楚地描述方法的功能,並對參數,傳回值,以及可能發生的異常進行說明,使得外部調用的人僅看docstring就能正確使用;
  • 推薦在檔案頭中包含copyright申明,模組描述等;
  • 注釋應該是用來解釋代碼的功能,原因,及想法的,不該對代碼本身進行解釋;
  • 對不再需要的代碼應該將其刪除,而不是將其注釋掉;
適當添加空行使代碼布局更為優雅、合理
  • 在一組代碼錶達完一個完整的思路之後,應該用空白行進行間隔,推薦在函數定義或者類定義之間空兩行,在類定義與第一個方法之間,或需要進行語義分隔的地方空一行,空行是在不隔斷代碼之間的內在聯絡的基礎上插入的;
  • 盡量保證上下文語義的易理解性,一般是調用者在上,被調用者在下;
  • 避免過長的程式碼,每行最好不要超過80字元;
  • 不要為了保持水平對齊而使用多餘的空格;
編寫函數的幾個原則
  • 函數設計要盡量短小,嵌套層次不宜過深;
  • 函數申明應做到合理、簡單、便於使用,函數名應能正確反映函數大體功能,參數設計應簡潔明了,參數個數不宜過多;
  • 函數參數設計應考慮向下相容;
  • 一個函數只做一件事,盡量保證函數語句粒度的一致性;
將常量集中到一個檔案

Python沒有提供定義常量的直接方式,一般有兩種方法來使用常量;

  • 通過命名風格來提醒使用者該變數代表的意義為常量,如常量名所有字母大寫,用底線串連各個單詞,如MAX_NUMBER,TOTLE等;
  • 通過自訂的類實現常量功能,常量要求符合兩點,一是命名必須全部為大寫字母,二是值一旦綁定便不可再修改;
 1 class _const: 2  3     class ConstError(TypeError): pass 4     class ConstCaseError(ConstError): pass 5  6     def __setattr__(self, name, value): 7         if name in self.__dict__: 8             rasie self.ConstError, "Can‘t change const.%s" % name 9         if not name.isupper():10             raise self.ConstCaseError, "const name ‘%s‘ is not all uppercase" % name11 12         self.__dict__[name] = value13 14 import sys15 sys.modules[__name__] = _const()

無論是用哪種方式,都應該將常量集中到一個檔案中,便於維護管理;

 

——《編寫高品質代碼》讀後總結

Python常見編程規範總結

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.