前言
參考資料:
筆者Python學(xué)習(xí)主要以《Python編程:從入門(mén)到實(shí)戰(zhàn)》這本書(shū)為主,筆記的思路參考書(shū)里的脈絡(luò)宗挥。其次還有筆者一年前在慕課上看的北理的嵩天教授的Python課程掰派。嵩天教授的課很好从诲,最大的特點(diǎn)是每個(gè)版塊都有完整的示例代碼。但可能對(duì)新手小白不太友好靡羡,有些不常用的函數(shù)容易弄混系洛。《Python編程:從入門(mén)到實(shí)戰(zhàn)》更適合零基礎(chǔ)學(xué)習(xí)略步,里邊會(huì)提到一些互通的編程思想和Python的格式規(guī)范描扯。
結(jié)合常用函數(shù)、方法:
由于筆者有Java的編程基礎(chǔ)趟薄,因此這里只記錄Python跟Java不一樣的地方以及一些易忘點(diǎn)和難點(diǎn)绽诚,重點(diǎn)放在Python的語(yǔ)法基礎(chǔ)。對(duì)于新手朋友還是先看書(shū)為好。結(jié)合《Python常用函數(shù)憔购、方法示例總結(jié)(API)》來(lái)看可能效果會(huì)好一些宫峦。
1. 變量與簡(jiǎn)單數(shù)據(jù)結(jié)構(gòu)
.py
指出這是一個(gè)Python程序,編輯器將使用Python解釋器運(yùn)行它玫鸟;Python解釋器讀取整個(gè)程序导绷,確定其中每個(gè)單詞含義;
程序無(wú)法成功運(yùn)行時(shí)屎飘,解釋器會(huì)提供一個(gè)
traceback
妥曲。traceback是一條記錄,指出解釋器嘗試運(yùn)行代碼時(shí)钦购,在什么地方陷入困境檐盟;在Python中,可以用單引號(hào)或雙引號(hào)括起字符串押桃;
-
Python中的轉(zhuǎn)義符:
-
\n
換行(光標(biāo)到下行首)葵萎; -
\r
回車(chē)(光標(biāo)回到本行首); -
\t
制表符唱凯,\n\t
表示換行并在下一行開(kāi)頭添加制表符羡忘; -
\b
回退;
-
Python2中磕昼,有些
print
語(yǔ)句包含括號(hào)卷雕,有些不包含;Python使用兩個(gè)乘號(hào)表示乘方票从,如:
3 ** 2 == 9
漫雕;Python2中除法
\
將小數(shù)部分直接刪除。Python3中保留小數(shù)峰鄙。但在Python2中:3.0 / 2 == 1.5
浸间;Python之禪:Python的一些編程理念。在終端輸入
import this
即可獲认裙荨发框;-
Python關(guān)鍵字:
-
Python內(nèi)置函數(shù):
2. 列表相關(guān)========* 一個(gè)列表示例:bicycles = [ 'trek', 'cannondale', 'redline']
。注意方括號(hào)與逗號(hào)煤墙;* 打印列表示例:print(bicycles)
梅惯;* 訪問(wèn)列表元素:bicycles[0]
--- > trek;* 訪問(wèn)列表倒數(shù)第x元素:bicycles[-x]
--- > 當(dāng)x=1時(shí)輸出:redline仿野;* 使用for循環(huán)遍歷列表:```
for object in list:
print(object) 列表解析:
list = [num**2 for num in range(1s, 11)]
---> 輸出1到10的平方铣减;遍歷部分列表:
for object in list[firstNum: lastNum]:
;可以使用
list[:]
的方法復(fù)制列表脚作;-
元祖相關(guān):
- Python中將不能修改的值稱(chēng)為不可變的葫哗,而不可變的列表稱(chēng)為元祖缔刹;
- 在編程上與列表不同之處在于其使用
()
或tuple()
或不使用括號(hào);而列表使用[]
或list()
劣针; - 元組因?yàn)閯?chuàng)建后不能修改校镐,因此沒(méi)有特殊操作;
-
如果提出修改Python語(yǔ)言修改建議捺典,需要編寫(xiě)Python改進(jìn)提案(PEP)鸟廓。PEP 8是最古老的PEP之一,其規(guī)定了以下一些Python代碼格式規(guī)范:
- 每級(jí)縮進(jìn)4個(gè)空格襟己。需要對(duì)文本編輯器(或ide)設(shè)置tab鍵為4個(gè)空格引谜;
- Python解釋器根據(jù)水平縮進(jìn)解讀代碼,不關(guān)心垂直間距擎浴;
- 建議每行不超過(guò)個(gè)字符员咽;
- 建議比較運(yùn)算符兩邊各添加一個(gè)空格;
3. 集合
一個(gè)集合示例:
bicycles = { 'trek', 'cannondale', 'redline'}
贮预。注意大括號(hào)與逗號(hào)贝室;集合的特點(diǎn)是不能重復(fù);
-
利用集合數(shù)據(jù)去重:
s = set(list) #利用集合無(wú)重復(fù)元素的特點(diǎn)去重 l = list(s) #將集合轉(zhuǎn)變回列表
4. If語(yǔ)句
Python在檢查是否相同時(shí)考慮大小寫(xiě)仿吞;
大部分時(shí)候檢查兩個(gè)指不等的效率更高档玻;
在Python中使用
and
和or
表示并與或,而不是&&
和||
茫藏;檢查列表是否含有特定值的語(yǔ)句:
if(object in list)
,也可以用if(object not in list)
霹琼;-
Python的if語(yǔ)句基本結(jié)構(gòu)如下(注意冒號(hào)):```
if conditional_test1:
do something1
elif conditional_test2:
do something2
else:
do other 判斷列表是否為空:
if list:
5. 字典
- 事實(shí)上务傲,可將任意Python對(duì)象用作字典中的值;
- 一個(gè)字典的示例:
alien0 = {'color': 'green', 'points': 5}
-
遍歷字典:
for key, value in map.items():
-
遍歷字典的鍵:
for object in map.keys():
或for object in map:
枣申,因?yàn)楸闅v字典默認(rèn)遍歷所有的鍵售葡; - 按順序遍歷字典所有的鍵:
for object in sorted(map.keys()):
-
遍歷字典的值:
for object in map.values():
- 遍歷字典的值,剔除重復(fù)項(xiàng):
for object in set(map.values()):
- 列表和字典的嵌套層級(jí)不應(yīng)太多忠藤,如果太多挟伙,可能有更簡(jiǎn)單的解決問(wèn)題的方案;
6. 用戶輸入和while循環(huán)
- 在Python 3里使用
input()
方法模孩,而在Python 2.7里使用raw_input()
方法尖阔; - 循環(huán)語(yǔ)句:
while conditional_test:
- 可以使用
break
關(guān)鍵字退出循環(huán),這里的循環(huán)包括while和for循環(huán)榨咐; - 可以使用
continue
關(guān)鍵字繼續(xù)循環(huán)介却; - 使用循環(huán)處理列表:
while object in list:
7. 函數(shù)
-
不帶返回值的函數(shù)定義示例:
def greet_user(username, age=1): #username沒(méi)有設(shè)定默認(rèn)值必須放在形參列表開(kāi)頭 """顯示簡(jiǎn)單問(wèn)候語(yǔ)""" print("hello, " + username.title() + ", age is " + str(age)) greet_user('jesse', 18) #位置實(shí)參 greet_user(age=18, username='jesse') #關(guān)鍵字實(shí)參 greet_user('jesse') #使用默認(rèn)值age=1
- 第二行為文檔字符串注釋,描述函數(shù)是做什么的块茁;
- 后面為函數(shù)調(diào)用齿坷;
-
帶普通返回值的函數(shù)定義示例:
def greet_user(username, age=1): #username沒(méi)有設(shè)定默認(rèn)值必須放在形參列表開(kāi)頭 """顯示簡(jiǎn)單問(wèn)候語(yǔ)""" print("hello, " + username.title() + ", age is " + str(age)) return username.title()
-
帶字典返回值的函數(shù)定義示例:
def build_person(first_name, last_name): #username沒(méi)有設(shè)定默認(rèn)值必須放在形參列表開(kāi)頭 """返回字典""" person = {'first': first_name, 'last': last_name} return person
-
傳遞列表參數(shù)桂肌,列表會(huì)修改:
def greet_users(names): """傳入?yún)?shù)為列表""" for name in names: msg = "Hello, " + name.title() + "!" print(mas) usermanes = ['margot', 'hannah', 'ty'] greet_users(usernames)
傳遞列表參數(shù)的副本,列表不會(huì)修改:
def greet_users(names[:]):
-
傳遞任意數(shù)量的實(shí)參:*toppings可以理解成列表永淌;
def make_pizza(*toppings): """打印顧客點(diǎn)的所有配料""" print(toppings) make_pizza('pepperoni') make_pizza('mushrooms', 'green peppers', 'etra cheese')
- Python創(chuàng)建一個(gè)名為toppings的空元組崎场;
-
結(jié)合使用位置實(shí)參和任意數(shù)量實(shí)參:
def make_pizza(size, *toppings):
- 必須將接納任意數(shù)量實(shí)參的形參
*toppings
放在最后;
- 必須將接納任意數(shù)量實(shí)參的形參
-
使用任意數(shù)量的關(guān)鍵字實(shí)參:\user_info**可以理解成字典遂蛀;
def build_profile(name, **user_info): """創(chuàng)建一個(gè)字典谭跨,其中包含我們知道的有關(guān)用戶的一切""" profile = {} profile['name'] = name for key, value in user_info.items(): profile[key] = value return profile user_profile = build_profile('albert', location='princeton', field='physics') print(user_profile)
在Python中,import的是模塊答恶,使用模塊.方法(參數(shù))即可調(diào)用模塊里的函數(shù)饺蚊;
-
導(dǎo)入特定函數(shù),并使用該函數(shù)示例:```
from module_name import function_0, function_1
function_0()
function_1(參數(shù)) 使用
as
給函數(shù)指定別名:from model import function as fn
悬嗓;后續(xù)使用fn()
即可調(diào)用function函數(shù)污呼;使用
as
給模塊指定別名:import model as md
;后續(xù)使用md.function()
即可調(diào)用函數(shù)包竹;導(dǎo)入模塊所有函數(shù):
from model import *
燕酷;后續(xù)直接使用model里的函數(shù)function()
即可調(diào)用函數(shù);可以在函數(shù)類(lèi)使用
global
關(guān)鍵字聲明變量是全局變量周瞎;-
lambda表達(dá)式:
<函數(shù)名> = lambda <參數(shù)> : <表達(dá)式>
苗缩;- 示例:
>>> f = lambda x, y : x + y >>> f(10, 15) 25 ``` > > > f = lambda : "lambda表達(dá)式" > > > print(f()) > > > lambda表達(dá)式
-
函數(shù)與模塊編寫(xiě)細(xì)節(jié):
- 外部函數(shù)導(dǎo)入的推薦做法:只導(dǎo)入所需要使用的函數(shù) / 導(dǎo)入整個(gè)模塊并使用句點(diǎn)表示法;
- 函數(shù)和模塊的命名應(yīng)使用小寫(xiě)字母和下劃線声诸,而不是駝峰命名法酱讶;
- 函數(shù)注釋緊跟在函數(shù)定義后面,使用文檔字符串格式彼乌;
- 給形參指定默認(rèn)值時(shí)泻肯,等號(hào)=兩邊不要有空格;
8. 類(lèi)與對(duì)象
類(lèi)中的函數(shù)叫方法慰照;
-
一個(gè)類(lèi)示例:模塊名為
dog.py
"""表示小狗和電子狗的類(lèi)""" class Dog(): """模擬小狗""" def __init__(self, name): """初始化實(shí)例""" self.name = name self.age = 1 #給屬性指定默認(rèn)值 def get_age(self): """返回年齡""" return self.age def set_age(self, age): """設(shè)置年齡""" self.age = age def sit(self): """模擬小狗被命令時(shí)蹲下""" print(self.name.title() + " is now sitting.") class TinyDog(Dog): """小狗是狗的子類(lèi)""" def __init__(self, name) """初始化父類(lèi)的屬性""" super().__init__(name)
-
__init__()
方法:形參self必不可少灶挟,而且必須位與其他參數(shù)前面; - 創(chuàng)建Dog實(shí)例時(shí)毒租,將自動(dòng)傳入實(shí)參self稚铣。每個(gè)與類(lèi)相關(guān)聯(lián)的方法調(diào)用都自動(dòng)傳遞實(shí)參self,其是一個(gè)指向?qū)嵗旧淼膽?yīng)用墅垮,讓實(shí)例能夠訪問(wèn)類(lèi)中的屬性和方法惕医;
-
self.
為前綴的變量都可供類(lèi)中的所有方法使用,像這樣可以通過(guò)實(shí)例訪問(wèn)的變量稱(chēng)為屬性噩斟;
-
-
有關(guān)父子類(lèi):
- 子類(lèi)和父類(lèi)必須包含在當(dāng)前文件中曹锨,父類(lèi)必須在子類(lèi)前面;
- 子類(lèi)定義中括號(hào)內(nèi)必須指定父類(lèi)名稱(chēng)剃允;
-
super()
是一個(gè)特殊函數(shù)沛简,將父類(lèi)和子類(lèi)關(guān)聯(lián)起來(lái)齐鲤; - 在Python 2.7中,
super()
方法需要傳遞兩個(gè)實(shí)參:子類(lèi)名和self椒楣,并且父類(lèi)定義的括號(hào)內(nèi)指定字段object给郊;
在Python 2.7中創(chuàng)建類(lèi)時(shí),需要在括號(hào)類(lèi)內(nèi)包含單詞object:
class ClassName(object):
-
類(lèi)實(shí)例(對(duì)象)的示例:
class Dog(): --snip-- my_dog = Dog('willie') dog_name = my_dog.name #獲取屬性 dog_name = my_dog.get_age() #通過(guò)方法獲取屬性 my_dog.name = 'jucy' #直接修改屬性 my_dog.set_age = 18 #通過(guò)方法修改屬性 my_dog.sit() #調(diào)用方法
從dog.py模塊里導(dǎo)入多個(gè)類(lèi):
from dog import Dog, TinyDog
捧灰;導(dǎo)入整個(gè)dog.py模塊淆九,然后用句點(diǎn)表示訪問(wèn)需要的類(lèi):
import dog
;collections模塊里包含一個(gè)類(lèi)
OrderedDict
毛俏。該類(lèi)的實(shí)例行為幾乎與字典相同炭庙,區(qū)別在于其記錄了鍵值對(duì)的順序;-
類(lèi)的編碼風(fēng)格:
- 類(lèi)采用駝峰命名法煌寇,類(lèi)中的每個(gè)單詞首字母大寫(xiě)焕蹄;
- 實(shí)例名和模塊名采用小寫(xiě),并在單詞之間加上下劃線阀溶;
- 一個(gè)空行分隔方法腻脏;兩個(gè)空格分隔類(lèi);
- 需要同時(shí)導(dǎo)入標(biāo)準(zhǔn)庫(kù)和模塊和
9. 文件
-
打開(kāi)并讀取一個(gè)文件银锻,并將其內(nèi)容顯示到屏幕上:
with open('xxx.txt') as file_object: contents = file_object.read() print(contents)
- 打開(kāi)文件
open()
和關(guān)閉文件close()
可以同時(shí)使用永品,但當(dāng)有bug時(shí)close()
執(zhí)行不了會(huì)導(dǎo)致文件無(wú)法關(guān)閉。不寫(xiě)close()
將由Python確定是否關(guān)閉文件击纬; -
with
關(guān)鍵字在不再需要訪問(wèn)文件后將其關(guān)閉鼎姐; - 直接打印contents會(huì)多出一個(gè)空行,可以這樣打印
print(contens.rstrip())
更振;
- 打開(kāi)文件
-
有關(guān)文件絕對(duì)路徑:
- Linux和OS X:
file_path = '/home/.../xxx.txt'
症见; - Windows:
file_path = C:\...\xxx.txt
; - 建議將數(shù)據(jù)文件存儲(chǔ)在程序文件所在的目錄殃饿,或程序文件所在目錄的下一級(jí)文件夾;
- Linux和OS X:
-
逐行讀扔蟪Α:
with open(filename) as file_object: for line in file_object: print(line)
- 同理乎芳,直接打印contents會(huì)多出一個(gè)空行,可以這樣打印
print(line.rstrip())
帖池;
- 同理乎芳,直接打印contents會(huì)多出一個(gè)空行,可以這樣打印
使用
with
關(guān)鍵字時(shí)奈惑,open()
返回的對(duì)象只在with代碼塊內(nèi)可用;在處理文件相關(guān)時(shí)注意使用
strip()
或rstrip()
去除字符串兩邊的空格睡汹;Python將所有文本都解讀成字符串肴甸;
-
open('xxx.txt', 'w')
:以寫(xiě)入方式打開(kāi)文件;- 其他參數(shù)還有
r
讀取囚巴、a
附加原在、r+
讀寫(xiě)友扰; -
a
附加:將內(nèi)容附加到文件末尾,而不是覆蓋文件原來(lái)的內(nèi)容庶柿; - 以
w
寫(xiě)入模式打開(kāi)文件需要小心村怪,如果指定文件名已存在,Python將在返回對(duì)象前清空文件浮庐; - Python只能將字符串寫(xiě)入文本文件甚负;
- 其他參數(shù)還有
10. 異常
-
使用 try-except 處理異常:
try: print(5/0) except ZeroDivisionError: print('捕獲到ZeroDivisionError異常') else: print('未捕獲異常') finally: print('無(wú)論是否有異常都會(huì)執(zhí)行')
- 可在
except
的縮進(jìn)塊里添加關(guān)鍵字pass跳過(guò)錯(cuò)誤捕獲; - 其中审残,
else
和finally
部分的代碼塊可仕笥颉;
- 可在
11. 測(cè)試
使用Python標(biāo)準(zhǔn)庫(kù)中的模塊
unittest
進(jìn)行測(cè)試搅轿;-
一個(gè)簡(jiǎn)單的測(cè)試示例:
import unittest from model_name import function_name class TestCase(unittest.TestCase): """測(cè)試函數(shù)function_name""" def setUp(self): """構(gòu)建前置條件""" def test_function(self): run_result = function_name(parameter) self.assertEqual(run_result, correct_result) unittest.main()
- 首先導(dǎo)入模塊
unittest
和被測(cè)試方法function_name
病涨; - 然后創(chuàng)建
TestCase
類(lèi),其包含各種具體的單元測(cè)試方法介时。該類(lèi)繼承unittest.TestCase
類(lèi)没宾; -
setUp()
方法的作用是創(chuàng)建前置條件; - 編寫(xiě)測(cè)試方法
test_function
沸柔,方法名必須以test_
打頭循衰; - 使用斷言
assertEqual()
判斷函數(shù)執(zhí)行結(jié)果與預(yù)期結(jié)果的差別; -
unittest.main()
讓Python運(yùn)行這個(gè)文件中的測(cè)試褐澎;
- 首先導(dǎo)入模塊
unittest里常用的6個(gè)斷言方法請(qǐng)見(jiàn)会钝;
-
每完成一個(gè)測(cè)試,Python都會(huì)打印一個(gè)字符:
- 測(cè)試通過(guò)打印句點(diǎn)
.
工三; - 測(cè)試引發(fā)錯(cuò)誤打印一個(gè)
E
迁酸; - 測(cè)試導(dǎo)致斷言失敗打印一個(gè)
F
;
- 測(cè)試通過(guò)打印句點(diǎn)