編寫高質量Python程序(一)基本準則

本系列文章爲《編寫高質量代碼——改善Python程序的91個建議》的精華彙總。

理解Pythonic概念

  • 什麼是 Pythonic?

    Pythonic的代碼就是具備Python獨特風格的代碼。通俗說來,就是在保證代碼可讀性的前提下,儘量地簡潔、優雅,看起來像僞代碼同樣。python

  • 具備 Python 代碼風格的例子算法

    • 交換兩個變量。其餘語言交換兩個變量時,通常須要一個臨時的中間變量,而Python中能夠用一行代碼直接交換。
    • for循環直接遍歷容器。其餘語言中,須要根據索引下標i對容器進行遍歷,而Python能夠用for循環直接遍歷容器。
    • 使用 str.format() 格式化字符串,是最Pythonic的字符串格式化方法。
# 交換兩個變量
a, b = b, a

# for循環遍歷容器
for elem in alist:
    do_sth_with(elem)

# format格式化字符串
print("{greet} from {language}!".format(greet="hello, world!", language="Python"))
  • Python的庫和框架:現有的框架就比如現有的「輪子」,學會利用這些框架,不重複造輪子。

編寫Pythonic代碼

注意要避免的事:框架

  • 避免只用大小寫來區分不一樣的對象。
  • 避免使用容易混淆的名稱。
  • 不要懼怕過長的變量名。能表達清楚變量表明的含義便可。

深刻理解Pythonic的幾個途徑:函數

  • 學習語言特性和庫特性時,從官方文檔入手, 仿照他們的書寫規範。
  • Python的版本更新快,跟進前言,掌握新特性。
  • 學習業界公認的Pythonic代碼,如Flask、gevent和requests等。

理解Python和C語言的不一樣之處

  • 「縮進」和「{}」: C語言用花括號{}分隔代碼塊,Python中用縮進分隔,避免混用空格和Tab鍵。
  • '" 在C語言中,單引號'表示單個的字符型數據(char),雙引號"表示字符串,默認以\0結尾;在Python中,'"無明顯區別。
  • 三元操做符?: C語言中的三元操做符 C?X:Y,表示當條件C爲True的時候,取值X,不然取值Y。在Python中的等價形式爲 X if C else Y
  • switch...case: C語言中的switch...case分支語句,Python中可使用if...elif...else...代替。

在代碼中添加註釋

Python中有3種形式註釋:工具

  • 塊註釋
  • 行註釋
  • 文檔註釋(dostring)

須要注意:佈局

  1. 使用塊或行註釋時,僅僅註釋那些複雜操做、算法,還有那些難以理解的、不夠一目瞭然的代碼。
  2. 註釋和代碼隔開必定距離。
x = x + 1  # 這樣的註釋略近
x = x + 1       # 更好的註釋位置
  1. 給外部可訪問的函數或方法添加文檔註釋。描述其功能、參數、返回值及可能的異常等信息。例如:
def get_lines(name, lines):
    """Return lines that begin with name.
    Lines are expected to look like:
        name: space separated values
    Args:
        name: string, parameter name.
        lines: iterable of string, lines in the file.
    Returns:
        List of values in the lines that match.
    """
    retval = []
    matches = itertools.ifilter(lambda x: x.startswith(name + ":"), lines)
    for line in matches:
        retval.extend(line[len(name) + 1 :].split())
    return retval
  1. 建議在文件頭包含copyright聲明、模塊描述,有必要的話還能夠加入做者信息。例如:
#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# Copyright 2014 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not ...
  1. 更新代碼以後,註釋要和代碼同步更新。在實際工做中,很容易發生代碼不斷迭代,而忘了更新註釋的狀況,須要加以當心。

適當添加空行,使代碼佈局更優雅、合理

  1. 在一組代碼表達完一個完整思路以後,應用空行進行分隔。
  2. 保持上下文語義的易理解性。 當一個函數調用另外一個函數時,儘可能將它們放在一塊兒,通常調用者在上,被調用者在下。
def A():
    B()

def B():
    pass
  1. 空格的使用學習

    • 二元運算符(賦值=,比較(==, <, >, !=, <=, >=, in, not in, is, is not),布爾運算(and, or, not))的左右兩邊。如x == 1
    • 逗號和分號前不要使用空格。
    • 函數名和左括號之間、序列索引操做時序列名和[]之間不須要空格,函數的參數=兩側不須要空格。

編寫函數的4個原則

  1. 函數設計儘可能短小,嵌套層次不宜過深。
  2. 函數聲明需合理、簡單、易於使用。
  3. 函數參數設計時,應考慮向下兼容(兼容以前的版本)。
  4. 一個函數只作一件事(解耦合)。

  • 參考:《編寫高質量代碼——改善Python程序的91個建議》
本文由博客羣發一文多發等運營工具平臺 OpenWrite 發佈
相關文章
相關標籤/搜索