本系列文章為《撰寫高質量代碼——改善Python程式的91個建議》的精華匯總,
文章首發于公眾號【Python與演算法之路】
理解Pythonic概念
-
什么是 Pythonic?
Pythonic的代碼就是具有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)
需要注意:
- 使用塊或行注釋時,僅僅注釋那些復雜操作、演算法,還有那些難以理解的、不夠一目了然的代碼,
- 注釋和代碼隔開一定距離,
x = x + 1 # 這樣的注釋略近
x = x + 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
- 建議在檔案頭包含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 ...
- 更新代碼之后,注釋要和代碼同步更新,在實際作業中,很容易發生代碼不斷迭代,而忘了更新注釋的情況,需要加以小心,
適當添加空行,使代碼布局更優雅、合理
- 在一組代碼表達完一個完整思路之后,應用空行進行分隔,
- 保持背景關系語意的易理解性, 當一個函式呼叫另一個函式時,盡量將它們放在一起,一般呼叫者在上,被呼叫者在下,
def A():
B()
def B():
pass
- 空格的使用
- 二元運算子(賦值
=,比較(==, <, >, !=, <=, >=, in, not in, is, is not),布爾運算(and, or, not))的左右兩邊,如x == 1 - 逗號和分號前不要使用空格,
- 函式名和左括號之間、序列索引操作時序列名和
[]之間不需要空格,函式的引數=兩側不需要空格,
- 二元運算子(賦值
撰寫函式的4個原則
- 函式設計盡量短小,嵌套層次不宜過深,
- 函式宣告需合理、簡單、易于使用,
- 函式引數設計時,應考慮向下兼容(兼容之前的版本),
- 一個函式只做一件事(解耦合),
- 參考:《撰寫高質量代碼——改善Python程式的91個建議》
本文由博客群發一文多發等運營工具平臺 OpenWrite 發布
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/159122.html
標籤:Python
