本文以 Eric Matthes 的《Python編程:從入門到實踐》爲基礎,以有必定其餘語言經驗的程序員視角,對書中內容提煉總結,化繁爲簡,將這本書的精髓融合成一篇10分鐘能讀完的文章。python
讀完本篇文章後,可對 Python 語言特性、編碼風格有必定了解,並可寫出簡單的 Python 程序。程序員
各個系統的 Python 安裝教程請自行查閱資料,這裏再也不贅述。編程
檢查 Python 版本,在命令行輸入 python
便可,同時會進入命令行交互模式,能夠在這裏執行 python 命令。json
若是電腦中安裝了 python2.x 和 python3.x 兩個版本,輸入 python
運行的是 2.x 版本。想運行 3.x,則需輸入 python3
。python3.x
在命令行輸入 python
:數據結構
Solo-mac:~ solo$ python Python 2.7.10 (default, Aug 17 2018, 19:45:58) [GCC 4.2.1 Compatible Apple LLVM 10.0.0 (clang-1000.0.42)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>>
在命令行輸入 python3
:app
Solo-mac:~ solo$ python3 Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 26 2018, 23:26:24) [Clang 6.0 (clang-600.0.57)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>>
輸入 exit()
便可退出命令行模式。python2.7
若是是寫好了一個 python 文件,想經過命令行運行它,進入這個目錄,在命令行輸入 python 文件名.py
便可。編程語言
好比桌面上有個文件 hello.py
,內容是打印一句話:ide
print("Hello, Python")
想運行它,先進入 Desktop 目錄,再在命令行輸入 python hello.py
就能運行:
Solo-mac:Desktop solo$ python hello.py Hello, Python
變量名應該是小寫的,雖然沒有強制規定,可是約定俗稱的規則。
字符串就是一系列字符。在Python中,用引號括起的都是字符串,其中的引號能夠是單引號,也能夠是雙引號,還能夠同時使用。如:
"This is a string." 'This is also a string.' "I love 'python'"
下面介紹字符串的簡單運算。
title()以首字母大寫的方式顯示每一個單詞,即將每一個單詞的首字母都改成大寫。
>>> name = 'solo coder' >>> name.title() 'Solo Coder'
將字符串改成所有大寫或所有小寫。
>>> name 'solo coder' >>> name.upper() 'SOLO CODER' >>> name.lower() 'solo coder' >>> name 'solo coder'
注意:title()、upper()、lower() 均不改變原字符串,只是輸出了一個新的字符串。
Python使用加號(+)來合併字符串。
>>> first = 'solo' >>> last = 'coder' >>> full = first + ' ' + last >>> full 'solo coder'
在編程中,空白泛指任何非打印字符,如空格、製表符和換行符。
要在字符串中添加製表符,可以使用字符組合 \t
,要在字符串中添加換行符,可以使用字符組合 \n
。
>>> print('\tPython') Python >>> print('Hello,\nPython') Hello, Python
rstrip()
刪除右側空白,lstrip()
刪除左側空白,strip()
刪除兩端空白。
>>> msg = ' Python ' >>> msg ' Python ' >>> msg.rstrip() ' Python' >>> msg.lstrip() 'Python ' >>> msg.strip() 'Python' >>> msg ' Python '
注意執行完去空格命令後,再打印出 msg,仍是原來的字符串,這說明 strip()
也不改變原來的字符串。
在Python 2中,print語句的語法稍有不一樣:
>>> python2.7 >>> print "Hello Python 2.7 world!" Hello Python 2.7 world!
在Python 2中,無需將要打印的內容放在括號內。從技術上說,Python 3中的print是一個函數,所以括號必不可少。有些Python 2 print語句也包含括號,但其行爲與Python 3中稍有不一樣。簡單地說,在Python 2代碼中,有些print語句包含括號,有些不包含。
在Python中,可對整數執行加(+)減(-)乘(*)除(/)運算。
>>> 2 + 3 5 >>> 3 - 2 1 >>> 2 * 3 6 >>> 3 / 2 1.5
Python還支持運算次序,所以你可在同一個表達式中使用多種運算。你還可使用括號來修 改運算次序,讓Python按你指定的次序執行運算,以下所示:
>>> 2 + 3*4 14 >>> (2 + 3) * 4 20
Python將帶小數點的數字都稱爲浮點數。大多數編程語言都使用了這個術語,它指出了這樣一個事實:小數點可出如今數字的任何位置。
從很大程度上說,使用浮點數時都無需考慮其行爲。你只需輸入要使用的數字,Python一般都會按你指望的方式處理它們:
>>> 0.1 + 0.1 0.2 >>> 0.2 + 0.2 9 0.4 >>>2 * 0.1 0.2 >>>2 * 0.2 0.4
但須要注意的是,結果包含的小數位數多是不肯定的:
>>> 0.2 + 0.1 0.30000000000000004 >>> 3 * 0.1 0.30000000000000004
全部語言都存在這種問題,沒有什麼可擔憂的。Python會盡力找到一種方式,以儘量精確地表示結果,但鑑於計算機內部表示數字的方式,這在有些狀況下很難。後面將會學習更多的處理方式。
若是用數字跟字符串拼接,就會出現類型錯誤。爲避免這個問題,可使用 str()
將數字轉換爲字符串再進行操做。
>>> age = 18 >>> print('my age is ' + age) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can only concatenate str (not "int") to str >>> print('my age is ' + str(age)) my age is 18
在Python 2中,將兩個整數相除獲得的結果稍有不一樣:
>>> python2.7 >>> 3 / 2 1
Python返回的結果爲1,而不是1.5。在Python 2中,整數除法的結果只包含整數部分,小數部 分被刪除。請注意,計算整數結果時,採起的方式不是四捨五入,而是將小數部分直接刪除。
在Python 2中,若要避免這種狀況,務必確保至少有一個操做數爲浮點數,這樣結果也將爲 浮點數:
>>> 3 / 2 1 >>> 3.0 / 2 1.5 >>> 3 / 2.0 1.5 >>> 3.0 / 2.0 1.5
從Python 3轉而用Python 2或從Python 2轉而用Python 3時,這種除法行爲經常會使人迷惑。使用或編寫同時使用浮點數和整數的代碼時,必定要注意這種異常行爲。
在Python中,註釋用井號(#)標識。井號後面的內容都會被Python解釋器忽略。如
# 向你們問好 print("Hello Python people!")
列表由一系列按特定順序排列的元素組成。
在Python中,用方括號([])來表示列表,並用逗號來分隔其中的元素。
>>> list = [] >>> list.append('haha') >>> list.append('heihei') >>> list.append('hehe') >>> list ['haha', 'heihei', 'hehe'] >>> list[0] 'haha'
獲取最後一個元素能夠用 -1,如 list[-1] 是獲取最後一個元素,list[-2] 是獲取倒數第二個元素。
修改元素直接用索引修改
>>> list[0] = 'nihao' >>> list ['nihao', 'heihei', 'hehe']
能夠在末尾添加,也能夠在任意位置插入。
在末尾添加:append
>>> list.append('wa') >>> list ['nihao', 'heihei', 'hehe', 'wa']
插入:insert
>>> list.insert(1, 'hello') >>> list ['nihao', 'hello', 'heihei', 'hehe', 'wa']
刪除有三種方式:
>>> list ['nihao', 'hello', 'heihei', 'hehe', 'wa'] >>> del list[1] >>> list ['nihao', 'heihei', 'hehe', 'wa'] >>> list.pop() 'wa' >>> list.remove('hehe') >>> list ['nihao', 'heihei']
給 pop()
傳索引刪除其餘位置的值
>>> list ['nihao', 'heihei'] >>> list.pop(0) 'nihao' >>> list ['heihei']
注意:
方法remove()只刪除第一個指定的值。若是要刪除的值可能在列表中出現屢次,就須要使用循環來判斷是否刪除了全部這樣的值。
若是你不肯定該使用del語句仍是pop()方法,下面是一個簡單的判斷標準:若是你要從列表中刪除一個元素,且再也不以任何方式使用它,就使用del語句;若是你要在刪除元素後還能繼續使用它,就使用方法pop()。
本節將介紹列表的排序、反轉、計算長度等操做。
列表的排序主要有兩種方式:
使用 sort()
方法將改變原列表。若是要反轉排序,只需向sort()方法傳遞參數 reverse=True。
>>> list ['zhangsan', 'lisi', 'bob', 'alex'] >>> list.sort() >>> list ['alex', 'bob', 'lisi', 'zhangsan'] >>> list.sort(reverse=True) >>> list ['zhangsan', 'lisi', 'bob', 'alex']
函數 sorted()
讓你可以按特定順序顯示列表元素,同時不影響它們在列表中的原始排列順序。
若是要反轉排序,只需向 sorted()
傳遞參數 reverse=True。
>>> list = ['douglas','alex','solo','super'] >>> sorted(list) ['alex', 'douglas', 'solo', 'super'] >>> list ['douglas', 'alex', 'solo', 'super'] >>> sorted(list, reverse=True) ['super', 'solo', 'douglas', 'alex'] >>> list ['douglas', 'alex', 'solo', 'super']
要反轉列表元素的排列順序,可以使用方法 reverse()
。 reverse()
也會改變原始列表。
reverse()
只會按原來的順序反轉,不會進行額外的按字母排序。
>>> list ['douglas', 'alex', 'solo', 'super'] >>> list.reverse() >>> list ['super', 'solo', 'alex', 'douglas']
使用函數len()可快速獲悉列表的長度。
>>> list ['super', 'solo', 'alex', 'douglas'] >>> len(list) 4
使用 for…in
循環。
python 以縮進來區分代碼塊,因此須要正確的縮進
>>> cats ['super', 'solo', 'alex', 'douglas'] >>> for cat in cats: ... print(cat) ... super solo alex douglas
Python函數range()讓你可以輕鬆地生成一系列的數字。
>>> for value in range(1,5): ... print(value) ... 1 2 3 4
注意:range() 會產生包含第一個參數但不包含第二個參數的一系列數值。
使用 range()
建立列表
>>> numbers = list(range(1,6)) >>> numbers [1, 2, 3, 4, 5]
range()
還能夠指定步長。下面的例子生成了從0開始,到11的偶數:
>>> nums = list(range(0,11,2)) >>> nums [0, 2, 4, 6, 8, 10]
有幾個專門用於處理數字列表的Python函數。
>>> numbers [1, 2, 3, 4, 5] >>> min(numbers) 1 >>> max(numbers) 5 >>> sum(numbers) 15
列表解析將for循環和建立新元素的代碼合併成一行,並自動附加新元素。
>>> squares = [value**2 for value in range(1,11)] >>> squares [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
要使用這種語法,首先指定一個描述性的列表名,如squares;而後,指定一個左方括號, 並定義一個表達式,用於生成你要存儲到列表中的值。在這個示例中,表達式爲 value ** 2,它計 算平方值。接下來,編寫一個for循環,用於給表達式提供值,再加上右方括號。在這個示例中, for循環爲for value in range(1,11),它將值1~10提供給表達式 value ** 2。請注意,這裏的for 語句末尾沒有冒號。
要建立切片,可指定要使用的第一個元素和最後一個元素的索引。與函數range()同樣,Python在到達你指定的第二個索引前面的元素後中止。要輸出列表中的前三個元素,須要指定索引0~3,這將輸出分別爲0、1和2的元素。
>>> names = ['aa','bb','cc','dd'] >>> print(names[1:4]) ['bb', 'cc', 'dd']
若是你沒有指定第一個索引,Python將自動從列表開頭開始:
>>> print(names[:4]) ['aa', 'bb', 'cc', 'dd']
若是沒有指定終止索引,將自動取到列表末尾
>>> print(names[2:]) ['cc', 'dd']
也可使用負數索引,好比返回最後三個元素
>>> print(names[-3:]) ['bb', 'cc', 'dd']
遍歷切片
>>> for name in names[1:3]: ... print(name) ... bb cc
可使用切片來快速複製列表,不指定開始索引和結束索引。
>>> names ['aa', 'bb', 'cc', 'dd'] >>> names2 = names[:] >>> names2 ['aa', 'bb', 'cc', 'dd']
用切片複製出來的新列表,跟原來的列表是徹底不一樣的列表,改變其實一個不會影響另外一個列表。
>>> names.append('ee') >>> names ['aa', 'bb', 'cc', 'dd', 'ee'] >>> names2 ['aa', 'bb', 'cc', 'dd']
而若是簡單的經過賦值將 names 賦值給 names2,就不能獲得兩個列表,實際上它們都指向了同一個列表。若是改變其中一個,另外一個也將被改變。
>>> names ['aa', 'bb', 'cc', 'dd'] >>> names2 = names >>> names2 ['aa', 'bb', 'cc', 'dd'] >>> names.append('ee') >>> names ['aa', 'bb', 'cc', 'dd', 'ee'] >>> names2 ['aa', 'bb', 'cc', 'dd', 'ee']
Python將不能修改的值稱爲不可變的,而不可變的列表被稱爲元組。
元組看起來猶如列表,但使用圓括號而不是方括號來標識。定義元組後,就可使用索引來訪問其元素,就像訪問列表元素同樣。
>>> food = ('apple', 'orange') >>> food[0] 'apple' >>> food[1] 'orange' >>> food[1] = 'banana' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment
遍歷用法跟列表一致。
每條if語句的核心都是一個值爲True或False的表達式,這種表達式被稱爲條件測試。
檢查是否相等,用 ==
檢查是否不相等,用 !=
數字比較 >
、 <
、 >=
、 <=
多個條件與 and
多個條件或 or
判斷列表是否包含某元素 in
>>> names ['aa', 'bb', 'cc', 'dd', 'ee'] >>> 'bb' in names True
判斷列表是否不包含某元素
>>> names ['aa', 'bb', 'cc', 'dd', 'ee'] >>> 'ff' not in names True
簡單的 if-else
>>> a = 10 >>> if a > 10: ... print('hello') ... else: ... print('bye') ... bye
if-elif-else
>>> if a<5: ... print(a<5) ... elif 5<a<10: ... print('5<a<10') ... else: ... print('a>10') ... a>10
在Python中,字典是一系列鍵-值對。每一個鍵都與一個值相關聯,你可使用鍵來訪問與之相關聯的值。與鍵相關聯的值能夠是數字、字符串、列表乃至字典。事實上,可將任何Python對象用做字典中的值。
在Python中,字典用放在花括號{}中的一系列鍵-值對錶示。
>>> user = {'name':'bob', 'sex':'male', 'age':20} >>> user {'name': 'bob', 'sex': 'male', 'age': 20}
要獲取與鍵相關聯的值,可依次指定字典名和放在方括號內的鍵。
>>> user {'name': 'bob', 'sex': 'male', 'age': 20} >>> user['name'] 'bob' >>> user['age'] 20
字典是一種動態結構,可隨時在其中添加鍵—值對。
>>> user['city']='beijing' >>> user {'name': 'bob', 'sex': 'male', 'age': 20, 'city': 'beijing'}
要修改字典中的值,可依次指定字典名、用方括號括起的鍵以及與該鍵相關聯的新值。
>>> cat = {} >>> cat['color'] = 'white' >>> cat['age'] = 4 >>> cat {'color': 'white', 'age': 4} >>> cat['age'] = 6 >>> cat {'color': 'white', 'age': 6}
對於字典中再也不須要的信息,可以使用del語句將相應的鍵—值對完全刪除。使用del語句時,必須指定字典名和要刪除的鍵。
>>> del cat['color'] >>> cat {'age': 6}
字典可用於以各類方式存儲信息,所以有多種遍歷字典的方式:可遍歷字典的全部鍵—值對、鍵或值。
items()
>>> cat {'age': 6, 'color': 'white', 'city': 'beijing'} >>> for k,v in cat.items(): ... print(k + '-' + str(v)) ... age-6 color-white city-beijing
經過 for k,v in cat.items()
的方式遍歷全部的鍵值對,k
表明鍵,v
表明值。
注意:即使遍歷字典時,鍵—值對的返回順序也與存儲順序不一樣。Python不關心鍵—值對的存儲順序,而只跟蹤鍵和值之間的關聯關係。
keys()
若是不須要用值,能夠用 keys()
遍歷出全部的鍵。
>>> cat {'age': 6, 'color': 'white', 'city': 'beijing'} >>> for k in cat.keys(): ... print(k.title()) ... Age Color City
上面的例子打印出了 cat
的全部鍵,用字符串的 title()
方法使每一個單詞的首字母大寫。
遍歷字典時會默認遍歷全部的鍵,for k in cat.keys()
和 for k in cat
的效果同樣。
按順序遍歷全部鍵,可用 sorted()
排序,這讓Python列出字典中的全部鍵,並在遍歷前對這個列表進行排序。
>>> for k in sorted(cat.keys()): ... print(k.title()) ... Age City Color
values()
>>> for value in cat.values(): ... print(str(value)) ... 6 white beijing
若是須要剔除重複項,可使用 set()
>>> cat {'age': 6, 'color': 'white', 'city': 'beijing', 'city2': 'beijing'} >>> for value in cat.values(): ... print(str(value)) ... 6 white beijing beijing >>> for value in set(cat.values()): ... print(str(value)) ... beijing white 6
能夠在列表中嵌套字典、在字典中嵌套列表以及在字典中嵌套字典。這裏就不演示了。
函數input()讓程序暫停運行,等待用戶輸入一些文本。獲取用戶輸入後,Python將其存儲在一個變量中,以方便你使用。
>>> msg = input('Please input your name: ') Please input your name: solo >>> msg 'solo'
若是你使用的是Python 2.7,應使用函數raw_input()來提示用戶輸入。這個函數與Python 3中的input()同樣,也將輸入解讀爲字符串。
Python 2.7也包含函數input(),但它將用戶輸入解讀爲Python代碼,並嘗試運行它們。若是你使用的是Python 2.7,請使用raw_input()而不是input()來獲取輸入。
若是想將輸入的內容轉換爲數字,能夠用 int()
來轉換。
for循環用於針對集合中的每一個元素都一個代碼塊,而while循環不斷地運行,直到指定的條件不知足爲止。
>>> num = 1 >>> while num <= 5: ... print(str(num)) ... num += 1 ... 1 2 3 4 5
要當即退出while循環,再也不運行循環中餘下的代碼,也無論條件測試的結果如何,可以使用break語句。break語句用於控制程序流程,可以使用它來控制哪些代碼行將執行,哪些代碼行不執行,從而讓程序按你的要求執行你要執行的代碼。
要返回到循環開頭,並根據條件測試結果決定是否繼續執行循環,可以使用continue語句,它不像 break 語句那樣再也不執行餘下的代碼並退出整個循環。
Python 用關鍵字 def
來定義函數,函數名以冒號 :
結尾,冒號以後的縮進裏的內容都是函數體。
>>> def greet(): ... print('Hello World!') ... >>> greet() Hello World!
能夠向函數傳遞參數。下面的例子向函數 greet()
傳遞了個參數 name
。其中 name
是形參,solo
是實參。
>>> def greet(name): ... print('Hello,' + name) ... >>> greet('solo') Hello,solo
向函數傳遞實參的方式不少,可以使用位置實參,這要求實參的順序與形參的順序相同;也可以使用關鍵字實參,其 中每一個實參都由變量名和值組成;還可以使用列表和字典。
你調用函數時,Python必須將函數調用中的每一個實參都關聯到函數定義中的一個形參。爲此,最簡單的關聯方式是基於實參的順序。這種關聯方式被稱爲位置實參。
>>> def student(name, age): ... print('Hello, My name is ' + name + ', I am ' + str(age) + ' years old') ... >>> student('solo', 18) Hello, My name is solo, I am 18 years old
按照形參定義的順序傳遞的實參就稱爲位置實參。
關鍵字實參是傳遞給函數的名稱—值對。關鍵字實參讓你無需考慮函數調用中的實參順序,還清楚地指出了函數調用中各個值的用途。
>>> student(age=18, name='solo') Hello, My name is solo, I am 18 years old
接着位置實參中的例子,student(name, age)
方法第一個參數是 name
,第二個參數是 age
。咱們用關鍵字實參指明傳遞的是哪個,即便順序寫亂了獲得的結果也不會亂。
編寫函數時,可給每一個形參指定默認值。在調用函數中給形參提供了實參時,Python將使用指定的實參值;不然,將使用形參的默認值。所以,給形參指定默認值後,可在函數調用中省略相應的實參。使用默認值可簡化函數調用,還可清楚地指出函數的典型用法。
>>> def student(name, age=18): ... print('Hello, My name is ' + name + ', I am ' + str(age) + ' years old') ... >>> student('bob') Hello, My name is bob, I am 18 years old >>> student('nicole') Hello, My name is nicole, I am 18 years old >>> student('bob', 20) Hello, My name is bob, I am 20 years old
如上,給 student()
函數定義的第二個參數 age
設置了默認值 18
,若是調用時只傳一個參數,不管傳的是什麼 age
都是 18。當傳兩個參數時,傳遞的實參就會覆蓋掉默認值。
注意:使用默認值時,在形參列表中必須先列出沒有默認值的形參,再列出有默認值的實參。這讓Python依然可以正確地解讀位置實參。
函數並不是老是直接顯示輸出,相反,它能夠處理一些數據,並返回一個或一組值。函數返回 的值被稱爲返回值。在函數中,可以使用return語句將值返回到調用函數的代碼行。返回值讓你可以將程序的大部分繁重工做移到函數中去完成,從而簡化主程序。
>>> def student(name): ... return name ... >>> name = student('solo') >>> name 'solo'
函數可返回任何類型的值,包括列表和字典等較複雜的數據結構。例如,下面的函數接受姓名和年齡,並返回一個表示人的字典:
>>> def build_person(name,age): ... person = {'name':name, 'age':age} ... return person ... >>> p = build_person('solo',18) >>> p {'name': 'solo', 'age': 18}
有時候,你預先不知道函數須要接受多少個實參,好在Python容許函數從調用語句中收集任意數量的實參。
>>> def person(*args): ... print(args) ... >>> person('name','age','address') ('name', 'age', 'address')
上面定義了一個函數 person()
,只有一個形參 *args
。形參名 *args
中的星號讓 Python 建立一個名爲 args
的空元組,並將收到的全部值都封裝到這個元組中。
若是要讓函數接受不一樣類型的實參,必須在函數定義中將接納任意數量實參的形參放在最後。Python 先匹配位置實參和關鍵字實參,再將餘下的實參都收集到最後一個形參中。
>>> def person(city, *args): ... print('city: ' + city + ', other args:') ... for value in args: ... print(value) ... >>> person('beijing', 'name', 'age', 'tel') city: beijing, other args: name age tel
函數 person()
有兩個形參,第一個 city
是普通的位置實參,第二個 *args
是可變參數。
有時候,須要接受任意數量的實參,但預先不知道傳遞給函數的會是什麼樣的信息。在這種狀況下,可將函數編寫成可以接受任意數量的鍵—值對——調用語句提供了多少就接受多少。一個這樣的示例是建立用戶簡介:你知道你將收到有關用戶的信息,但不肯定會是什麼樣的信息。
def build_profile(first, last, **user_info): profile = {} profile['first_name'] = first profile['last_name'] = last for key,value in user_info.items(): profile[key] = value return profile user = build_profile('steven', 'bob', city='beijing', age=18) print(user)
執行代碼,輸出結果是:
{'first_name': 'steven', 'last_name': 'bob', 'city': 'beijing', 'age': 18}
能夠將函數存儲在被稱爲模塊的獨立文件中,再將模塊導入到主程序中。import語句容許在當前運行的程序文件中使用模塊中的代碼。
模塊是擴展名爲.py的文件,包含要導入到程序中的代碼。
def eat(food): print('I am cat, I eat ' + food)
import cat cat.eat('fish')
控制檯輸出
I am cat, I eat fish
你還能夠導入模塊中的特定函數,這種導入方法的語法以下:
from module_name import function_name
經過用逗號分隔函數名,可根據須要從模塊中導入任意數量的函數:
from module_name import function_0, function_1, function_2
上面的例子只導入 cat.py
中的 eat()
方法
from cat import eat eat('fish')
獲得相同的結果。
若是要導入的函數的名稱可能與程序中現有的名稱衝突,或者函數的名稱太長,可指定簡短而獨一無二的別名——函數的另外一個名稱,相似於外號。要給函數指定這種特殊外號,須要在導入它時這樣作。
from cat import eat as cat_eat cat_eat('fish')
將 cat.py
中的 eat()
方法導入並指定了別名 cat_eat
,使用時能夠直接用別名使用。
你還能夠給模塊指定別名。經過給模塊指定簡短的別名,讓你 可以更輕鬆地調用模塊中的函數。
通用語法:import module_name as mn
import cat as c c.eat('fish')
使用星號(*)運算符可以讓Python導入模塊中的全部函數:
def eat(food): print('I am cat, I eat ' + food) def run(): print('cat run')
from cat import * eat('fish') run()
輸出結果
I am cat, I eat fish cat run
因爲導入 了每一個函數,可經過名稱來調用每一個函數,而無需使用句點表示法。然而,使用並不是本身編寫的 大型模塊時,最好不要採用這種導入方法:若是模塊中有函數的名稱與你的項目中使用的名稱相 同,可能致使意想不到的結果: Python 可能遇到多個名稱相同的函數或變量,進而覆蓋函數,而 不是分別導入全部的函數。
最佳的作法是,要麼只導入你須要使用的函數,要麼導入整個模塊並使用句點表示法。這能 讓代碼更清晰,更容易閱讀和理解。
應給函數指定描述性名稱
函數名應只包含小寫字母和下劃線
每一個函數都應包含簡要地闡述其功能的註釋,該註釋應緊跟在函數定義後面,並採用文檔字符串格式。
給形參指定默認值時,等號兩邊不要有空格:
def function_name(parameter_0, parameter_1='default value')
對於函數調用中的關鍵字實參,也應遵循這種約定:
function_name(value_0, parameter_1='value')
若是程序或模塊包含多個函數,可以使用兩個空行將相鄰的函數分開,這樣將更容易知道前一個函數在什麼地方結束,下一個函數從什麼地方開始。
全部的import語句都應放在文件開頭,惟一例外的情形是,在文件開頭使用了註釋來描述整個程序。
class Cat(): def __init__(self, name, color): self.name = name self.color = color def eat(self): print('cat ' + self.name + ' color ' + self.color + ', now eat') def run(self): print('cat ' + self.name + ' color ' + self.color + ', now run') my_cat = Cat('Spring', 'white') print(my_cat.name) print(my_cat.color) my_cat.eat() my_cat.run()
上面建立了類 Cat
,並實例化了 my_cat
,而後調用了類的方法 eat()
和 run()
。輸出結果:
Spring white cat Spring color white, now eat cat Spring color white, now run
類中的函數稱爲方法。__init__()
是函數的構造方法,每檔建立新實例時 Python 都會自動運行它。注意構造方法名字必須是這個,是規定好的。
上面的例子中__init__(self, name, color)
有三個形參,第一個形參 self
必不可少,還必須位於其餘形參的前面。其餘的形參能夠根據須要調整。self
是一個指向實例自己的引用,讓實例可以訪問類中的屬性和方法。
還能夠經過實例直接訪問屬性:my_cat.name
。但在其餘語言中並不建議這樣作。
在Python 2.7中建立類時,須要作細微的修改——在括號內包含單詞object:
class ClassName(object):
類中的每一個屬性都必須有初始值,哪怕這個值是0或空字符串。在有些狀況下,如設置默認值時,在方法__init__()
內指定這種初始值是可行的;若是你對某個屬性這樣作了,就無需包含爲它提供初始值的形參。
從新定義 Cat
,在構造方法中給屬性 age
設置默認值。
class Cat(): def __init__(self, name, color): self.name = name self.color = color self.age = 3 def eat(self): print('cat ' + self.name + ' color ' + self.color + ', now eat') def run(self): print('cat ' + self.name + ' color ' + self.color + ', now run') def print_age(self): print('cat`s age is ' + str(self.age))
能夠以三種不一樣的方式修改屬性的值:直接經過實例進行修改,經過方法進行設置。
要修改屬性的值,最簡單的方式是經過實例直接訪問它。
class Cat(): def __init__(self, name, color): self.name = name self.color = color self.age = 3 def eat(self): print('cat ' + self.name + ' color ' + self.color + ', now eat') def run(self): print('cat ' + self.name + ' color ' + self.color + ', now run') def print_age(self): print('cat`s age is ' + str(self.age)) my_cat = Cat('Spring', 'white') my_cat.print_age() my_cat.age = 4 my_cat.print_age()
輸出結果爲
cat`s age is 3 cat`s age is 4 複製代碼
上例直接經過 my_cat.age = 4
修改了 age
屬性的值。
再來更新代碼,加入 update_age()
方法來修改 age
的屬性。
class Cat(): def __init__(self, name, color): self.name = name self.color = color self.age = 3 def eat(self): print('cat ' + self.name + ' color ' + self.color + ', now eat') def run(self): print('cat ' + self.name + ' color ' + self.color + ', now run') def print_age(self): print('cat`s age is ' + str(self.age)) def update_age(self, age): self.age = age my_cat = Cat('Spring', 'white') my_cat.print_age() my_cat.update_age(10) my_cat.print_age()
運行代碼輸出:
cat`s age is 3 cat`s age is 10
一個類繼承另外一個類時,它將自動得到另外一個類的全部屬性和方法;原有的類稱爲父類,而新類稱爲子類。子類繼承了其父類的全部屬性和方法,同時還能夠定義本身的屬性和方法。
class Animal(): def __init__(self, name, age): self.name = name self.age = age def run(self): print('Animal ' + self.name + ' run') class Cat(Animal): def __init__(self, name, age): super().__init__(name, age) cat = Cat('Tony', 2) cat.run()
運行程序,輸出:
Animal Tony run
先定義了類 Animal
,又定義了 Cat
繼承自 Animal
。 Animal
稱爲父類, Cat
稱爲子類。經過輸出能夠驗證,子類繼承了父類的方法。
在子類的構造方法中要先實現父類的構造方法:super().__init__(name, age)
。
還能夠給子類定義本身的方法,或者重寫父類的方法。
class Animal(): def __init__(self, name, age): self.name = name self.age = age def run(self): print('Animal ' + self.name + ' run') class Cat(Animal): def __init__(self, name, age): super().__init__(name, age) def play(self): print('Cat ' + self.name + ' play') def run(self): print('Cat ' + self.name + ' run') cat = Cat('Tony', 2) cat.run() cat.play()
咱們來修改下程序,Animal
類不變,Cat
類仍是繼承了 Animal
,但定義了本身的方法 play()
並重寫了父類方法 run()
。運行程序,獲得輸出:
Cat Tony run Cat Tony play
在Python 2.7中,繼承語法稍有不一樣,ElectricCar類的定義相似於下面這樣:
class Car(object): def __init__(self, make, model, year): --snip-- class ElectricCar(Car): def __init__(self, make, model, year): super(ElectricCar, self).__init__(make, model, year) --snip--
函數super()須要兩個實參:子類名和對象self。爲幫助Python將父類和子類關聯起來,這些實參必不可少。另外,在Python 2.7中使用繼承時,務必在定義父類時在括號內指定object。
當一個文件過長時,能夠將其中一部分代碼抽離出去,而後導入到主文件中。
導入方式有多種:
導入單個類
假如 car.py
裏定義了類 Car
from car import Car
從一個模塊中導入多個類
假如 car.py
包含了三個類 Car
, Battery
和 ElectricCar
。
只導入一個類:
from car import ElectricCar
導入多個類,中間用逗號隔開:
from car import Car, ElectricCar
導入整個模塊
還能夠導入整個模塊,再使用句點表示法訪問須要的類。這種導入方法很簡單,代碼也易於閱讀。因爲建立類實例的代碼都包含模塊名,所以不會與當前文件使用的任何名稱發生衝突。
import car my_car = car.Car()
導入模塊中的全部類
要導入模塊中的每一個類,可以使用下面的語法:
from module_name import *
不推薦使用這種導入方式,其緣由有二。
首先,若是隻要看一下文件開頭的import語句,就 能清楚地知道程序使用了哪些類,將大有裨益;但這種導入方式沒有明確地指出你使用了模塊中 的哪些類。這種導入方式還可能引起名稱方面的困惑。若是你不當心導入了一個與程序文件中其 他東西同名的類,將引起難以診斷的錯誤。這裏之因此介紹這種導入方式,是由於雖然不推薦使 用這種方式,但你可能會在別人編寫的代碼中見到它。
須要從一個模塊中導入不少類時,最好導入整個模塊,並使用module_name.class_name語法 來訪問類。這樣作時,雖然文件開頭並無列出用到的全部類,但你清楚地知道在程序的哪些地 方使用了導入的模塊;你還避免了導入模塊中的每一個類可能引起的名稱衝突。
要使用文本文件中的信息,首先須要將信息讀取到內存中。爲此,你能夠一次性讀取文件的所有內容,也能夠以每次一行的方式逐步讀取。
with open('test.txt') as file_obj: contents = file_obj.read() print(contents)
open()
用於打開一個文件,參數爲文件的路徑。
關鍵字 with
在再也不須要訪問文件後將其關閉。有了 with
你只管打開文件,並在須要時使用它,Python自會 在合適的時候自動將其關閉。
相比於原始文件,該輸出惟一不一樣的地方是末尾多了一個空行。爲什麼會多出這個空行呢?由於 read()
到達文件末尾時返回一個空字符串,而將這個空字符串顯示出來時就是一個空行。要刪除多出來的空行,可在print語句中使用 rstrip()
。
文件路徑能夠是相對路徑,也能夠是絕對路徑。
with open('test.txt') as file_obj: for line in file_obj: print(line.rstrip())
要以每次一行的方式檢查文件,可對文件對象使用for循環。
with open('test.txt', 'w') as file_obj: file_obj.write("I love python")
在這個示例中,調用open()時提供了兩個實參,第一個實參也是要打開的文件的名稱;第二個實參(‘w’)告訴Python,咱們要以寫入模式打開這個文件。
可選模式:
r
:只讀。w
: 只寫。若是文件不存在則建立,若是文件存在則先清空,再寫入。a
:附加模式,寫入的內容追加到原始文件後面。若是文件不存在則建立。r+
:可讀可寫。若是你省略了模式實參,Python將以默認的只讀模式打開文件。
異常是使用try-except代碼塊處理的。try-except代碼塊讓Python執行指定的操做,同時告訴Python發生異常時怎麼辦。
try: print(5/0) except ZeroDivisionError: print("You can't divide by zero!")
try: print(5/0) except ZeroDivisionError: print("You can't divide by zero!") else: print("no exception")
若是 try
中的代碼運行成功,沒有出現異常,則執行 else
代碼塊中的代碼。
Python 中使用 json.dump()
和 json.load()
來存儲和讀取 json 文件。
import json userInfo = {'username': 'jack', 'age': 18} with open('test.txt', 'w') as obj: json.dump(userInfo, obj) with open('test.txt') as obj: content = json.load(obj) print(content)
上例中用 json.dump()
把數據存入到了 test.txt
中,又用 json.load()
把數據從文件中取出並打印。
注意使用前先導入 json 模塊。叉車出租
先定義一個拼接名字的函數 name_function.py
def get_formatted_name(first, last): full_name = first + ' ' + last return full_name.title()
再寫測試類來測試這個函數
import unittest from name_function import get_formatted_name class NamesTestCase(unittest.TestCase): def test_name_function(self): full_name = get_formatted_name('david', 'alex') self.assertEqual(full_name, 'David Alex') unittest.main()
測試類要繼承 unittest.TestCase
,經過 self.assertEqual
斷言是否獲得的結果和預期相等。
方法 | 用途 |
---|---|
assertEqual(a, b) | 覈實a == b |
assertNotEqual(a, b) | 覈實a != b |
assertTrue(x) | 覈實x爲True |
assertFalse(x) | 覈實x爲False |
assertIn(item, list) | 覈實item在list中 |
assertNotIn(item, list) | 覈實item不在list中 |
setUp()
方法若是你在TestCase類中包含了方法 setUp()
,Python將先運行它,再運行各個以test_打頭的方法。
一般用於作一些初始化操做。