懂一點Python系列——快速入門
阿新 • • 發佈:2020-03-23
![](https://upload-images.jianshu.io/upload_images/7896890-71e6f0dcd9d841a5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
> 本文面相有 **一定程式設計基礎** 的朋友學習,所以略過了 *環境安裝*、*IDE 搭建* 等一系列簡單繁瑣的事情。
# 一、Python 簡介
**Python** 英文原意為 **“蟒蛇”**,直到 `1989` 年荷蘭人 **Guido van Rossum** (簡稱 Guido)發明了一種 **面向物件** 的 **解釋型** 程式語言,並將其命名為 Python,才賦予了它表示一門程式語言的含義。
![](https://upload-images.jianshu.io/upload_images/7896890-8cc9b31907c8afca.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
> 說到 Python 的誕生,極具戲劇色彩,據 Guido 的自述記載,Python 語言是他在聖誕節期間為了打發時間開發出來的,之所以會選擇 Python 作為該程式語言的名字,是因為他是一個叫 Monty Python 戲劇團體的忠實粉絲。
## 解釋型 vs 編譯型
作為電子元器件的 **計算機**,實際上 **只能** 識別某些 **特定的二進位制指令** *(特殊的 `01` 組合)*,但由於 **人類閱讀** 這些 **指令** 非常難以閱讀,加上使用這些指令編寫程式的 **耗時** 太過於 **冗長**,所以,人們在此基礎上再次制定了一套規範,採用特定的 **人類可閱讀** 的程式碼編寫,待到要執行時再 **翻譯** 回特定二進位制指令,這樣就幫助了人們更加輕鬆地理解和閱讀程式邏輯了。
![](https://upload-images.jianshu.io/upload_images/7896890-4b5f50ce1ddc7077.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
這也就是所謂現在的 **"高階程式語言"** 了。
上述 **翻譯** 這個過程 *(其實相當複雜,涉及語法分析、語義分析、效能優化等等..)* 其實也是由一個特定程式來執行的,那 **什麼時候將原始碼翻譯成二進位制指令呢?**,不同的程式語言有不同的規定:
- **編譯型語言**:必須 **提前** 將所有原始碼 **一次性** 轉換成二進位制指令,生成一個可執行檔案 *(例如 Windows 下的 `.exe`)* 比如:C 語言、C++、Golang、彙編等。使用的轉換工具我們稱為 **編譯器**。
- **解釋型語言**:允許程式 **一邊執行一邊轉換**,並且不會生成可執行程式,比如 Python、JavaScript、PHP 等。使用的轉換工具我們稱為 **直譯器**。
> **Java** 和 **C#** 是一種比較奇葩的存在,它們是 **半編譯半解釋型** 的語言,原始碼需要先轉換成一種中間檔案 *(位元組碼檔案)*,然後再把中間檔案拿到 **虛擬機器** 中執行。Java 引領了這種風潮,它的初衷是在跨平臺的同時兼顧執行效率。
![](https://upload-images.jianshu.io/upload_images/7896890-e0d8266f6398eb03.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
*上圖* 就展示了兩種不同型別語言的執行流程的不同,兩種方式對比起來總結如下:
- **編譯型語言一般不能跨平臺**:對於不同的 CPU 來說,它們的指令集是有差異的,這就導致了 **可執行檔案** *(翻譯後的指令)* 不能跨平臺,另外不同的系統之間的命令也會存在差異,例如 Linux 中睡眠是 `sleep()` 引數是毫秒,而 Windows 中是 `Sleep()` *(首字母大寫)* 引數是秒,這就導致了 **原始碼也不能跨平臺**;
- **解釋型語言可跨平臺**:這一切都歸功於 **直譯器**,它本身就是一個可執行檔案,官方只要針對不同的平臺開發不同的直譯器,那麼直譯器就能夠根據相同的語法解析出同樣功能的指令;
- **編譯型一般比解釋型效率高**:由於解釋型是採取一邊執行一邊翻譯的做法,所以會慢上一些,再加上我們強大的 **編譯器** 會幫我們做許多程式碼優化的工作。
#### 關於 Python
**Python** 屬於典型的解釋型語言,所以執行 Python 程式需要直譯器的支援,只要你在不同的平臺安裝了不同的直譯器,你的程式碼就可以隨時執行,不用擔心任何相容性問題,真正的 **“一次編寫,到處執行”**。
**Python** 幾乎支援所有常見的平臺,比如 Linux、Windows、Mac OS、Android、FreeBSD、Solaris、PocketPC 等,你所寫的 Python 程式碼無需修改就能在這些平臺上正確執行。也就是說,Python 的 **可移植性** 是很強的。
## 面向物件 vs 面向過程
**面向物件** 和 **面向過程** 是我們使用計算機程式設計解決問題的兩種不同方式的方案。
**面向過程** 可以說是一種 **基於事件 or 過程** 來描述的編碼方式,譬如「把大象放進冰箱」就可以描述成那經典的三個步驟,「把牛放進冰箱」又是另一個相似的經典三步,只是這樣單獨的事件 or 過程多了之後,隨著專案複雜度的增加,專案會變得非常難以維護。
> 軟體危機最典型的例子莫過於 IBM 的 `System/360` 的作業系統開發。佛瑞德·布魯克斯(Frederick P. Brooks, Jr.)作為專案主管,率領 `2000` 多個程式設計師夜以繼日的工作,共計花費了 `5000` 人一年的工作量,寫出將近 `100` 萬行的原始碼,總共投入 `5` 億美元,是美國的 “曼哈頓” 原子彈計劃投入的 `1/4`。儘管投入如此巨大,但專案進度卻一再延遲,軟體質量也得不到保障。布魯克斯後來基於這個專案經驗而總結的《人月神話》一書,成了史上最暢銷的軟體工程書籍。
>
> - 引用自:http://www.kancloud.cn:8080/yunhua_lee/oobaodian/110880
儘管 **結構化的程式設計** *(將一個大問題逐步劃分成一個一個的小問題)* 能夠幫助我們解決一部分問題,但 **面向過程** 仍然有一些不符合人類慣有的思考方式,譬如說:我今天想去存錢,我不會說「請拿走我的銀行卡和錢,然後在我卡上充值上相應的數目,最後把銀行卡還給我謝謝」,而我只會說「存錢,謝謝」,因為人大部分時間都是基於 **物件** *(或者可以說角色)* 來思考的。
對於 **面向過程** 最好的總結可能是:**「程式 = 演算法 + 資料結構」**,而對於 **面向物件** 來說則可以更改為:**「程式 = 物件 + 互動」**。
## Why Python?
![](https://upload-images.jianshu.io/upload_images/7896890-8f4e79f34df177e6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
上面的 *漫畫* 很好地說明了 Python 快速構建工具的能力,這也是 `Why Python` 的一大理由。下面根據慣例列舉一些讓我們足以選擇 Python 的原因。
#### 初學者友善 | 容易明白且功能強大
Python 的設計足夠簡單和易於使用,這樣使得初學者能夠從中不斷得獲取到樂趣以繼續 Python 之旅。
另外作為一種非常高階的語言,Python 讀起來像英語,這減輕了編碼初學者的許多語法學習壓力。Python 為您處理了很多複雜性,因此它非常適合初學者,因為它使初學者可以專注於學習程式設計概念,而不必擔心過多的細節。
Python 還一度被爆納入高考,收編到小學課本。
![](https://upload-images.jianshu.io/upload_images/7896890-451180aa92102c5b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
#### 非常靈活
作為一種 **動態型別** 的語言,Python 確實非常靈活。這意味著沒有關於如何構建特徵的硬性規則,並且使用不同的方法來解決問題將具有更大的靈活性 *(儘管 Python 哲學鼓勵使用明顯的方法來解決問題)*。此外,Python 也更寬容錯誤,因此您仍然可以編譯並執行程式,直到遇到問題為止。
#### 越來越火爆
Python 在誕生之初,因為其功能不好,運轉功率低,不支援多核,根本沒有併發性可言,在計算功能不那麼好的年代,一直沒有火爆起來,甚至很多人根本不知道有這門語言。
隨著時代的發展,物理硬體功能不斷提高,而軟體的複雜性也不斷增大,開發效率越來越被企業重視。因此就有了不一樣的聲音,在軟體開發的初始階段,效能並沒有開發效率重要,沒必然為了節省不到 `1ms` 的時間卻讓開發量增加好幾倍,這樣劃不過來。也就是開發效率比機器效率更為重要,那麼 Python 就逐漸得到越來越多開發者的親睞了。
在 `12-14` 年,雲端計算升溫,大量創業公司和網際網路巨頭擠進雲端計算領域,而最著名的雲核算開源渠道 OpenStack 就是基於 Python 開發的。
隨後幾年的備受關注的人工智慧,機器學習首選開發語言也是 Python。
至此,Python 已經成為網際網路開發的焦點。在 *「Top 10 的程式語言走勢圖」* 可以看到,Python 已經躍居第三位,而且在 `2017` 年還成為了最受歡迎的語言。
![](https://upload-images.jianshu.io/upload_images/7896890-e92d013f1190a7ca.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
#### 工作機會 | 薪資待遇高
- 來自 [gooroo.io](gooroo.io) 的薪資資訊:
![](https://upload-images.jianshu.io/upload_images/7896890-501633340f69b855.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
在天使榜上,Python 是需求第二高的技能,也是提供最高平均薪水的技能。
隨著大資料的興起,Python 開發人員需要作為資料科學家,尤其是因為 Python 可以輕鬆整合到 Web 應用程式中以執行需要機器學習的任務。
## 快速體驗 | No Hello World !
`Hello World` 似乎是學習程式設計繞不過去的東西,但使用 **Python**,我們來換點兒別的,Emmm.. 比如,一個 **查詢天氣** 的小程式 *(效果如下圖)*:
![](https://upload-images.jianshu.io/upload_images/7896890-627c3e77b32f2db0.gif?imageMogr2/auto-orient/strip)
#### 原始碼 & 解釋
`http://wthrcdn.etouch.cn/weather_mini?city=xxx` 這個網址可以返回任意城市昨日以及 5 天內的天氣預報,包括氣溫、指數、空氣質量、風力等,你可以用瀏覽器試著訪問一下,你會得到一個 `weather_mini` 的檔案,裡面就包含了我們想要的一些資料。
不過這裡由於我們發起了網路請求用到了第三方庫 `requests`,所以在執行之前還需要使用 `pip install requests` 命令把該庫下載到 Python 的安裝目錄下。
```python
# -*- coding: utf-8 -*-
import requests
while True:
city = input('請輸入城市,回車退出:\n')
if not city:
break
req = requests.get('http://wthrcdn.etouch.cn/weather_mini?city=%s' % city)
print(req.text)
```
#### 執行你的程式碼
你可以在 **當前資料夾** 下執行命令: `python hello_python.py`,或是使用 `python <原始檔路徑>` 執行也行,例如,如果我是 Windows 使用者並且將上述原始檔儲存在了 `D` 盤下面,那就可以執行 `python D:\hello_python.py`,然後你就可以看到上面的效果了。當然如果使用 IDE 將更加方便。
## Python vs Java
引入一張比較著名的圖吧,可以很明顯地感受到 Python 在寫法上要簡潔一些吧:
![](https://upload-images.jianshu.io/upload_images/7896890-60e9032d6e669f4c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
# 二、Python 基本語法簡介
Python 與其他語言最大的區別就是,Python 的程式碼塊不使用大括號 `{}` 來控制類,函式以及其他邏輯判斷。Python 最具特色的就是用 **縮排** 來寫模組。
## 2.0 註釋
```python
# 第一個註釋
# 第二個註釋
'''
第三註釋
第四註釋
'''
"""
第五註釋
第六註釋
"""
print("Hello, Python!")
```
## 2.1 資料型別
Python 中的變數賦值不需要型別宣告。Python 有五個標準的資料型別:
1. **Numbers(數字)**:Python3 中有四種數字型別 *(沒有 Python2 中的 Long)*,分別是 `int` 長整型、`bool` 布林、`float` 浮點數、`complex` 複數 *(1 + 2j)*;
2. **String(字串)**:Python 中字串不能改變,並且沒有單獨的字元型別,一個字元就是長度為 1 的字串;
3. **Tuple(元組)**:類似於 List,但不能二次賦值,相當於只讀列表。eg:`('test1', 'test2')`
3. **List(列表)**:類似 Java 中的 Array 型別。eg:`[1, 2, ,3]`
4. **Dictionary(字典)**:類似於 Java 的 Map 型別。eg:`{a: 1, b: 2}`
> `set` 集合也屬於資料結構,它是一個 **無序** 且 **不重複** 的元素序列。可以使用大括號 `{ }` 或者 `set()` 函式建立集合,注意:建立一個空集合必須用 `set()` 而不是 `{ }`,因為 `{ }` 是用來建立一個空字典。
```python
str = 'Hello World!'
print str[2:5] # 輸出字串中第三個至第五個之間的字串
list = [ 'runoob', 786 , 2.23, 'john', 70.2 ]
print list[1:3] # 輸出第二個至第三個元素
tuple = ( 'runoob', 786 , 2.23, 'john', 70.2 )
print tuple[1:3] # 輸出第二個至第三個的元素
tinydict = {'name': 'john','code':6734, 'dept': 'sales'}
print tinydict['name'] # 輸出鍵為 2 的值
```
## 2.2 條件語句
```python
# 當判斷條件為 1 個值時
flag = False
name = 'luren'
if name == 'python': # 判斷變數否為'python'
flag = True # 條件成立時設定標誌為真
print 'welcome boss' # 並輸出歡迎資訊
else:
print name # 條件不成立時輸出變數名稱
# 當判斷條件為多個值時
num = 5
if num == 3: # 判斷num的值
print 'boss'
elif num == 2:
print 'user'
else:
print 'roadman' # 條件均不成立時輸出
```
## 2.3 迴圈
#### while 迴圈
在 Python 中沒有 `do..while` 的迴圈
```python
count = 0
while count < 5:
print (count, " 小於 5")
count = count + 1
else:
print (count, " 大於或等於 5")
```
#### for..in 迴圈
`for..in` 適用於 `list/ dict/ set` 資料型別,如果需要遍歷數字序列,我們也可以藉助 `range(min, max, step)` 函式來生成數列。
```python
sites = ["Baidu", "Google","Runoob","Taobao"]
for site in sites:
if site == "Runoob":
print("菜鳥教程!")
break
print("迴圈資料 " + site)
else:
print("沒有迴圈資料!")
print("完成迴圈!")
# 輸出 0/ 3/ 6/ 9
for i in range(0, 10, 3) :
print(i)
# 替換成 range(5) 則輸出 0/ 1/ 2/ 3/ 4
# 替換成 range(5,9) 則輸出 5/ 6/ 7/ 8
```
## 2.4 函式
#### 函式基本定義和使用
```python
# 計算面積函式
def area(width, height):
return width * height
def print_welcome(name):
print("Welcome", name)
print_welcome("Runoob")
w = 4
h = 5
print("width =", w, " height =", h, " area =", area(w, h))
```
#### 引數傳遞
在 Python 中,型別屬於物件,變數是沒有型別的,例如 `name = "wmyskxz"`,則 `"wmyskxz"` 是 String 型別,而變數 `name` 僅僅是一個物件的引用。
Python 中一切都是物件,嚴格意義我們 **不能說值傳遞還是引用傳遞**,我們應該說傳 **不可變物件** *(string、tuples、number 不可變)* 和 **傳可變物件** *(list、dict 可變)*。
```python
############################################
# 傳遞不可變物件
def ChangeInt(a):
a = 10
b = 2
ChangeInt(b)
print b # 結果是 2
############################################
# 傳遞可變物件
def changeme( mylist ):
"修改傳入的列表"
mylist.append([1,2,3,4])
print ("函式內取值: ", mylist) # [10, 20, 30, [1, 2, 3, 4]]
return
# 呼叫changeme函式
mylist = [10,20,30]
changeme( mylist )
print ("函式外取值: ", mylist) # [10, 20, 30, [1, 2, 3, 4]]
# 函式內外值一致,因為都同屬於同一個引用
```
## 2.5 class 類
#### 基本定義
```python
class people:
#定義基本屬性
name = ''
age = 0
#定義私有屬性,私有屬性在類外部無法直接進行訪問
__weight = 0
#定義構造方法
def __init__(self,n,a,w):
self.name = n
self.age = a
self.__weight = w
def speak(self):
print("%s 說: 我 %d 歲。" %(self.name,self.age))
# 例項化類
p = people('wmyskxz', 24, 120)
p.speak() # wmyskxz 說: 我 10 歲。
```
#### 繼承 & 多繼承 & 方法重寫
```python
# 單繼承
class DerivedClassName(BaseClassName1):
.
# 多繼承
class DerivedClassName(Base1, Base2, Base3):
.
.
.
# 方法重寫演示
class Parent: # 定義父類
def myMethod(self):
print ('呼叫父類方法')
class Child(Parent): # 定義子類
def myMethod(self):
print ('呼叫子類方法')
c = Child() # 子類例項
c.myMethod() # 子類呼叫重寫方法
super(Child,c).myMethod() #用子類物件呼叫父類已被覆蓋的方法
# 先輸出 "呼叫子類方法" 再輸出 "呼叫父類方法"
```
## 2.6 module 模組
一個 `.py` 檔案就是一個模組,想要使用其他 `.py` 檔案中的方法就需要引入進來。
1. `import [module]`
```python
# 匯入整個random模組,可以是內建/當前路徑
import random
# 使用 `random` 模組下的 `randint` 方法
print(random.randint(0, 5))
```
2. `from [module] import [name1, name2, ...]`
```python
# 從 `random` 模組裡匯入其中一個方法 `randint`
from random import randint
# 不一樣的是,使用 `randint` 的就不需要先寫 `random` 了
print(randint(0, 5))
```
3. `import [module] as [new_name]`
```python
# 但這個名字可能跟其他地方有衝突,因此改名成 `rd`
import random as rd
# 使用 `rd` 這個名稱取代原本的 `random`
print(rd.randint(0, 5))
```
4. `from [module] import *`
**不推薦**,容易造成名稱衝突,降低可讀性和可維護性。
```python
# Import 所有 `random` module 底下的東西
from random import *
# 使用 `randint` 的時候也不需要先寫 `random`
print(randint(0, 5))
```
#### module 搜尋路徑
當你匯入一個模組,Python 解析器對模組位置的搜尋順序是:
1. 當前目錄
2. 如果不在當前目錄,Python 則搜尋在 shell 變數 `PYTHONPATH` 下的每個目錄。
3. 如果都找不到,Python 會察看預設路徑。UNIX 下,預設路徑一般為 `/usr/local/lib/python/`。
## 2.7 package 包
把兩個 module 放在一個新的目錄 `sample_package`,再新增 `_init__.py` *(可以是空,但不能沒有)*,宣稱自己是一個 package :
```
sample_package
|-- __init__.py
|-- 1.py
|-- 2.py
```
```python
# package_runoob 同級目錄下建立 test.py 來呼叫 package_runoob 包
# 匯入包
from package_runoob.runoob1 import runoob1
from package_runoob.runoob2 import runoob2
runoob1()
runoob2()
```
> 單個py檔案就是一個 module,而當多個 `.py` 檔案 + `__init__.py` 檔案時,就等於 package。
# 三、基本程式碼規範
**程式碼規範** 再怎麼強調也不為過:
![](https://upload-images.jianshu.io/upload_images/7896890-6467610c0eb161a8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 圖片來源:https://codingpy.com/article/programmers-daily-what-idiot-wrote-this-crappy-code/
## 3.1 命名規範
#### 模組
- 模組儘量使用 **小寫命名**,首字母保持小寫,儘量不要用下劃線(除非多個單詞,且數量不多的情況)
```python
# 正確的模組名
import decoder
import html_parser
# 不推薦的模組名
import Decoder
```
#### 類名
- 類名使用 **駝峰** (CamelCase)命名風格,首字母大寫,私有類可用一個下劃線開頭
```python
class Farm():
pass
class AnimalFarm(Farm):
pass
class _PrivateFarm(Farm):
pass
```
#### 函式
- 函式名 **一律小寫**,如有多個單詞,用下劃線隔開
```python
def run():
pass
def run_with_env():
pass
```
- 私有函式在函式前加一個下劃線 `_`
```python
class Person():
def _private_func():
pass
```
#### 變數名
- 變數名儘量 **小寫**, 如有多個單詞,用下劃線隔開
```python
if __name__ == '__main__':
count = 0
school_name = ''
```
- 常量使用以下劃線分隔的 **大寫** 命名
```python
MAX_CLIENT = 100
MAX_CONNECTION = 1000
CONNECTION_TIMEOUT = 600
```
## 3.2 基本編碼規範
#### 縮排
- 統一使用 4 個空格進行縮排
#### 行寬
每行程式碼儘量不超過 `80` 個字元(在特殊情況下可以略微超過 `80` ,但最長不得超過 `120`)
理由:
- 這在檢視 `side-by-side` 的 `diff` 時很有幫助
- 方便在控制檯下檢視程式碼
- 太長可能是設計有缺陷
#### 引號
簡單說,自然語言使用雙引號,機器標示使用單引號,因此 **程式碼裡** 多數應該使用 **單引號**
- **自然語言** 使用雙引號 `"..."`,例如錯誤資訊;很多情況還是 unicode,使用u"你好世界"
- **機器標識** 使用單引號 '`...'`,例如 dict 裡的 key
- **正則表示式** 使用原生的雙引號 `r"..."`
- **文件字串** (docstring) 使用三個雙引號 `"""......"""`
#### import 語句
- import 語句應該分行書寫
```python
# 正確的寫法
import os
import sys
# 不推薦的寫法
import sys,os
# 正確的寫法
from subprocess import Popen, PIPE
```
- import 語句應該使用 absolute import
```python
# 正確的寫法
from foo.bar import Bar
# 不推薦的寫法
from ..bar import Bar
```
- import 語句應該放在檔案頭部,置於模組說明及 `DocString` 之後,於全域性變數之前;
- import 語句應該按照順序排列,每組之間用一個空行分隔
```python
import os
import sys
import msgpack
import zmq
import foo
```
- 匯入其他模組的類定義時,可以使用相對匯入
```python
from myclass import MyClass
```
- 如果發生命名衝突,則可使用名稱空間
```python
import bar
import foo.bar
bar.Bar()
foo.bar.Bar()
```
#### DocString
DocString 的規範中最其本的兩點:
1. 所有的公共模組、函式、類、方法,都應該寫 DocString 。私有方法不一定需要,但應該在 `def` 後提供一個塊註釋來說明。
2. DocString 的結束"""應該獨佔一行,除非此 DocString 只有一行。
```python
"""Return a foobar
Optional plotz says to frobnicate the bizbaz first.
"""
"""Oneline docstring"""
```
## 3.3 註釋規範
#### 建議
- 在程式碼的 **關鍵部分**(或比較複雜的地方), 能寫註釋的要儘量寫註釋
- 比較重要的註釋段, 使用多個等號隔開, 可以更加醒目, **突出** 重要性
```python
app = create_app(name, options)
# =====================================
# 請勿在此處新增 get post等app路由行為 !!!
# =====================================
if __name__ == '__main__':
app.run()
```
#### 文件註釋(DocString)
- 文件註釋以 """ 開頭和結尾, 首行不換行, 如有多行, 末行必需換行, 以下是Google的docstring風格示例
```python
# -*- coding: utf-8 -*-
"""Example docstrings.
This module demonstrates documentation as specified by the `Google Python
Style Guide`_. Docstrings may extend over multiple lines. Sections are created
with a section header and a colon followed by a block of indented text.
Example:
Examples can be given using either the ``Example`` or ``Examples``
sections. Sections support any reStructuredText formatting, including
literal blocks::
$ python example_google.py
Section breaks are created by resuming unindented text. Section breaks
are also implicitly created anytime a new section starts.
"""
```
- 不要在文件註釋複製函式定義原型, 而是具體描述其具體內容, 解釋具體引數和返回值等
```python
# 不推薦的寫法(不要寫函式原型等廢話)
def function(a, b):
"""function(a, b) -> list"""
... ...
# 正確的寫法
def function(a, b):
"""計算並返回a到b範圍內資料的平均值"""
... ...
```
- 對函式引數、返回值等的說明採用 `numpy` 標準, 如下所示
```python
def func(arg1, arg2):
"""在這裡寫函式的一句話總結(如: 計算平均值).
這裡是具體描述.
引數
----------
arg1 : int
arg1的具體描述
arg2 : int
arg2的具體描述
返回值
-------
int
返回值的具體描述
參看
--------
otherfunc : 其它關聯函式等...
示例
--------
示例使用doctest格式, 在`>>>`後的程式碼可以被文件測試工具作為測試用例自動執行
>>> a=[1,2,3]
>>> print [x + 3 for x in a]
[4, 5, 6]
"""
```
> 更多細緻詳細的規範可以參考:
>
> 1. **Google 開源專案指南** - [https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/contents/](https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/contents/)
> 2. **官方 PEP 8 程式碼規範** - [https://www.python.org/dev/peps/pep-0008/](https://www.python.org/dev/peps/pep-0008/)
# 推薦閱讀
1. Redis(9)——史上最強【叢集】入門實踐教程 - [https://juejin.im/post/5e7429a16fb9a07ccc460fe7](https://juejin.im/post/5e7429a16fb9a07ccc460fe7)
2. React入門學習 - [https://juejin.im/post/5da5e9e8e51d4525292d2ed7](https://juejin.im/post/5da5e9e8e51d4525292d2ed7)
# 參考資料
1. WhyStudyPython.md | TwoWater - [https://github.com/TwoWater/Python/blob/master/Article/PythonBasis/python0/WhyStudyPython.md](https://github.com/TwoWater/Python/blob/master/Article/PythonBasis/python0/WhyStudyPython.md)
2. C 語言中文網 | Python 系列教程 - [http://c.biancheng.net/python/](http://c.biancheng.net/python/)
3. Crossin的程式設計教室 - [https://python666.cn/](https://python666.cn/)
4. 計算機和程式語言的發展歷史 - [https://blog.csdn.net/abc6368765/article/details/83990756](https://blog.csdn.net/abc6368765/article/details/83990756)
5. 面向物件葵花寶典 - [http://www.kancloud.cn:8080/yunhua_lee/oobaodian/110879](http://www.kancloud.cn:8080/yunhua_lee/oobaodian/110879)
6. RUNOOB | Python3 系列教程 - [ttps://www.runoob.com/python3](ttps://www.runoob.com/python3)
7. Python 基礎語法 | springleo'sblog - [https://lq782655835.github.io/blogs/tools/python-grammar.html#_1-%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B](https://lq782655835.github.io/blogs/tools/python-grammar.html#_1-%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B)
> - 本文已收錄至我的 Github 程式設計師成長系列 **【More Than Java】,學習,不止 Code,歡迎 star:[https://github.com/wmyskxz/MoreThanJava](https://github.com/wmyskxz/MoreThanJava)**
> - **個人公眾號** :wmyskxz,**個人獨立域名部落格**:wmyskxz.com,堅持原創輸出,下方掃碼關注,2020,與您共同成長!
![](https://upload-images.jianshu.io/upload_images/7896890-fca34cfd601e7449.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
非常感謝各位人才能 **看到這裡**,如果覺得本篇文章寫得不錯,覺得 **「我沒有三顆心臟」有點東西** 的話,**求點贊,求關注,求分享,求留言!**
創作不易,各位的支援和認可,就是我創作的最大動力,我們下篇文