1. 程式人生 > >懂一點Python系列——快速入門

懂一點Python系列——快速入門

![](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) 非常感謝各位人才能 **看到這裡**,如果覺得本篇文章寫得不錯,覺得 **「我沒有三顆心臟」有點東西** 的話,**求點贊,求關注,求分享,求留言!** 創作不易,各位的支援和認可,就是我創作的最大動力,我們下篇文