python 2 官方2020年停止維護。
參考文獻
基礎知識
- 現(xiàn)代計算機底層元件:晶體管(就是開關)
-
馮諾伊曼計算機體系結(jié)構(gòu)
馮諾依曼體系 - 編程規(guī)則
- 編程前要深思熟慮
- 程序要有可讀性(方便自己以后看)
- Python簡介:1989年誕生,開源,最佳實踐語言
- 資源鏈接
開始使用
- "Hello World!":IDLE(GUI)中輸入
print "Hello World!"
上面是Python 2.x版本寫法,3.x是:
print("Hello World!")
- 快捷鍵:腳本中 CTRL+ S 保存,之后F5運行
- 程序組成
- 模塊:
import math;math.+TAB可見所有備選(如math.pi) - 表達式(
x+5)和語句(x=5) - 空白:換行符號(
\\) - 注釋:單行(
#);多行(用三引號'''上下括起來)
- 對象命名:字母、數(shù)字(數(shù)字不能作首字母)和下劃線組合
駱駝拼寫法:thisIsAnInteger
- 變量創(chuàng)建:初次使用即創(chuàng)建(與Matlab類似);
type()返回變量類型
- int(整型):
6 - float(浮點型):
0.66 - complex(復數(shù)):
2+3j - bool(布爾型):
True(1) or False(0) - str(字符串):
'abc' or "abc" - list(列表):
['abc',4,3.5] - tuple(元組):
('abc',4,3.5) - dict(字典):
{"Adam":23,"Bob":24} - set(集合):
set([1,3,5])
- 運算符:
**(方冪);a+=2等價于a=a+2 - 數(shù)值計算符號表示 :
1/12=0 ; 1.0/12 = 0.833... - 海龜繪圖法
import turtle
for i in range(4):
turtle.forward(50)
turtle.right(90)
9.幫助:help(functioName)查看函數(shù)用法;help('moduleName')查看模塊用法
控制語句
- 語句分組通過縮進進行標識
- 可使用關系鏈:
0<=a<=5 - 可多重賦值:
a,b,c = 1,2,3 - 可直接交換:
a,b = b,a - Bool 關系符
- 非:
not x - 與:
and x - 或:
or x
- if 選擇
if Bool expression: ...
else: ...
- if 復合選擇:
if - elif - else - for 循環(huán):
for variable in set: ... - range(起始值,終值,步長)
range(5) = [0,1,2,3,4]range(3,5) = [3,4]range(1,20,4) = [1,5,9,13,17]
- while 循環(huán)
while Bool expression: ...
else: ...
- 跳出循環(huán)
-
break: 跳出整個循環(huán) -
continue: 跳出本次循環(huán) - 判斷輸入是否出錯:
變量名.isdigit(),變量是整數(shù)則為真
程序設計策略
- 參與并提交
- 針對問題做好準備,堅持,不輕易放棄
- 找不會被中斷的時間工作
- 若效率不高,則改變策略,或稍事休息
- 專注于問題,調(diào)整好情緒
- 了解,然后想象
- 理解問題:陳述,聯(lián)想已有算法,輸入輸出等問題
- 問題真實化:舉例,圖表,嘗試
- 編程之前先思考:拒絕“牛糞球”代碼
- 試驗:不必一次完成,多嘗試
- 簡化:問題分解,分而治之(“洋蔥”法)
- 停下來思考
- 放松,休息。
函數(shù)
- 為什么要使用函數(shù) —— 函數(shù)的特點
- 分而治之的策略
- 抽象(封裝性):只需會用,不必懂原理
- 重用:可以反復調(diào)用
- 共享:別人也可以調(diào)用
- 安全性:小段的代碼容易檢驗是否出錯
- 簡化(可讀性):封裝過后的程序更可讀
- 使用:先定義,后調(diào)用
def testFunc(Num):
return Num * 3
- main:主程序本身也可以作為函數(shù),在Python中創(chuàng)建獨立腳本時很有用
def main():
main()
- 作用域:包含某個變量的程序語句集合. 每個程序都有自己的命名空間,用來定義變量的作用域.
- 輸入已知函數(shù)名+'.'+TAB,即可查看相關的方法和變量
- 雙下劃線是Python的保留屬性
-
__name__:與函數(shù)相關聯(lián)的名稱 -
__dict__:函數(shù)的命名空間 -
__doc__:文檔字符串(查詢函數(shù)) ,math.pi.__doc__
-
- Python傳遞的是對象引用:Python的一切皆為對象,所以每個值的傳遞都是對象的引用. 對象在這個過程中不可復制.
- 如果對象可變,在函數(shù)中所做的更改將反映在對象的外部作用域
- 如果對象不可變,當更新引用時,將指向新的對象
數(shù)據(jù)結(jié)構(gòu) 1:字符串
- 以單引號或者雙引號表示字符串
- 三引號:將保存所有字符的格式信息(字符串若跨行,則回車符也會保存)
- 非顯示字符:回車:
\n;制表:\t - 字符串表示形式:每個字符都以數(shù)字形式(ASCII碼)存儲
ord('a') = 97chr(97) = 'a'- 索引
'Hello World'[1] = 'e'
Hello World
012345678910
- 擴展索引
'Hello World'[起始位置:結(jié)束位置:步長]
- 分片:字符串序列要包含結(jié)束符,即每次分片時要多含一位
'Hello World'[0:5] = 'Hello''Hello World'[6:] = 'Hello World'[6:11] = 'Hello'- 倒數(shù)索引
'Hello World'[-1] = 'Hello World'[10] = 'd' - 字符串操作
-
+:連接 -
*:重復 -
in:檢查集合成員
-
- 函數(shù):
len(myStr),求長度;方法:myStr.upper(),轉(zhuǎn)成大寫 - 方法鏈:
myStr.upper().find('s');查找方法:myStr.+TAB - 格式化輸出:
print "format string % (data1,data2,..)
例:print "%s is %d years old." % ("Bill",25)
-
%s字符串 ;%10s,10個空格(右對齊) -
%d十進制整數(shù) -
%f浮點小數(shù) ;%.4f,4位有效小數(shù) -
%e浮點指數(shù)
- 字符串集合是不可變的:無法通過索引賦值,必須復制所選內(nèi)容.
數(shù)據(jù)結(jié)構(gòu) 2:列表和元組
- 什么是列表?
- 列表是數(shù)據(jù)集類型之一,可以混合不同類型元素
- 創(chuàng)建:
aList = [1,2,'a',3,14] - 二維列表:
listOfList[1][2]
- 列表特性
- 列表的索引,分片和運算符與字符串基本一致
- 列表也可用于for循環(huán):
for n in [1,3,4,7] - 可變性:列表對象可發(fā)生改變,可對其賦值,如
aList[0] = 1
- 列表方法(后綴)
- 查找:
index(),返回與x相等的第一個索引; - 統(tǒng)計:
count(),統(tǒng)計x出現(xiàn)的次數(shù); - 添加(末尾):
append(),末尾添加元素;extend(),末尾添加集合; - 插入:
insert(i,x),在索引i處插入x; - 刪除:
pop(),刪除末尾元素;remove(x),刪除第一個x; - 排序:
sort();reverse(),反向排序;
- 列表與字符串轉(zhuǎn)換
result = 'I love you'.split() = ['I','love',''you]newStr = ''.join(result) = 'I love you'
- 可變對象及其引用
- 對引用可變對象的變量進行操作,可能會改變對象本身,或者創(chuàng)建一個新的對象;
- 對引用不可變對象的變量進行操作,只會創(chuàng)建新的對象
- 拷貝(復制)在Python中就是為對象添加新的名字
注:Python中的命名空間由名字列表和對象列表組成;
L =[1,2,3]
L = L + [9] #創(chuàng)建了新對象
L.append(9) #僅改變了對象
- 列表解析:用緊湊的方式構(gòu)造列表
[表達式 + for子句 + if條件]
[i for i in range(10) if i % 2 == 0]
>>> [0,2,4,6,8]
- 元組:
myTuple = (1,2,3)
- 元組是不可改變的列表
- 單元素原元組:
Tuple1 = (1,) - 為何需要元組:可為需要的地方提供不可變對象(如字典鍵)
- 從列表到元組:
tuple1 = tuple([6,1,3,4])
數(shù)據(jù)結(jié)構(gòu) 3:字典和集合
- 字典:可變的數(shù)據(jù)結(jié)構(gòu)
- 字典可看成是成對元素的列表:
dict = {(button,value)} - 鍵映射到值,類似于手機通訊錄
- 鍵可為不同元素類型,但只能是不可改變的對象:整數(shù),字符串或元組
- 鍵的順序不重要,關鍵在于鍵與值的關聯(lián)
- 創(chuàng)建:
contacts = {'Sandy':'123', 'Balian':'456'} - 引用(利用鍵)
contacts['Sandy'] - 添加
contacts['Piao'] = '789' - 創(chuàng)建空字典
Dict = { }或Dict = dict()
- 字典方法
- 字典列表:
items() - 鍵列表:
keys() - 值列表:
values() - 淺拷貝字典:
copy()
- 集合:可變的數(shù)據(jù)結(jié)構(gòu)
- 集合內(nèi)元素不限定類型,沒有順序
- 集合上不能索引賦值,但有其他方法可以改變集合內(nèi)的元素
- 集合方法
- 交:
aSet.intersection(bSet) - 并:
union - 差:
difference,aSet.difference(bSet) = A\B - 對稱差(收集兩個集合中不共享的元素):
symmetric_difference - 子集和超集:
A.issubset(B) = B.issubset(A)(A包含于B) - 添加:
add(element) - 刪除:
discard(element);clear(),刪除所有元素 - 淺拷貝:
copy()
- 再談作用域
- 命名空間是名稱和對象的關系. 如果有多個命名空間,則可定義搜索順序,依次在不同的命名空間中來查找某個名稱. 這一過程在Python中定義為作用域.
- 作用域搜尋規(guī)則:LEGB
- L(Local)局部:函數(shù)內(nèi)部
- E(Eclosing)封閉:在函數(shù)中定義的函數(shù)內(nèi)部
- G(Global)全局
__main__模塊:函數(shù)內(nèi)使用global語句可將變量聲明為全局性質(zhì) - B(Built-in)內(nèi)置
__builtins__模塊
- Python在模塊中維護命名空間. 當Python解釋器啟動時,將自動導入
__main__和__builtins__模塊. 每個模塊自帶一個命名空間,用來存放模塊中所有的名稱和對象.-
__main__是默認的全局模塊,用來存儲所有新對象. -
__builtins__為所有程序和數(shù)據(jù)類型提供鏈接. -
var.__dict__即為命名空間.
-
- Python指針:使用zip創(chuàng)建字典
keys = ['red', 'white', 'blues']
values = [100,300,500]
d = dict(zip(keys,values)) = {'blues':500, 'white':300,'red':100}
文件
- 文件:由字節(jié)組成的信息.
- 文本文件:ASCII數(shù)據(jù)或其他
- 二進制文件:word文檔
- 讀取:
testFile = open('temp.txt',"r")
- 循環(huán)逐行
for line in testFile:
print line
testFile.close()
-
testFile.read():一次性讀取,返回一個字符串 -
testFile.readline():每次讀取一行. 如果之后接for循環(huán),則for從readline結(jié)束后的位置開始. 主要用于跳過標題行.
- 寫
dataFile = open('temp2.txt',"w")
s = 'first line'
dataFile.write(s)
dataFile.close()
- 創(chuàng)建與重寫
- 模式
| 模式 | 操作 | 若文件不存在 | 是否覆蓋 |
|---|---|---|---|
| r | 只讀 | 報錯 | - |
| r+ | 可讀可寫 | 報錯 | 是 |
| w | 只寫 | 創(chuàng)建 | 是 |
| w+ | 可讀可寫 | 創(chuàng)建 | 是 |
| a | 只寫 | 創(chuàng)建 | 否,追加寫 |
| a+ | 可讀可寫 | 創(chuàng)建 | 否,追加寫 |
- 通用換行格式:為解決不同操作系統(tǒng)下行結(jié)束符號不一致的問題
fd = open('File.txt','rU') - 文件內(nèi)移動(方法)
tell:找出當前文件位置和文件開始位置之間的相對位置
seek:將當前文件位置設為文件對象緩沖區(qū)中的新位置
- 關閉文件:open函數(shù)在內(nèi)存中創(chuàng)建緩存區(qū),將磁盤內(nèi)容復制到此位置. 關閉文件,則內(nèi)存緩存區(qū)的所有內(nèi)容寫回瓷盤,保持同步.
- CSV文件:是文本文件格式,有CSV拓展模塊支持.
- OS模塊(Operating System) —— Python標準模塊
- 操作系統(tǒng)的功能之一是維護文件的組織結(jié)構(gòu).
- 目前操作系統(tǒng)將文件置于目錄(Linux或OS-X)或文件夾(Windows)中.
- 目錄結(jié)構(gòu)層次 —— 樹
OS-X:/punch/Python/ex1.py
windows:c: \\punch\\python\\ex1.py - 若當前目錄為 /punch/python/,則:
. = 當前目錄 = /punch/python/
.. = 父目錄 = /punch/ - os模塊函數(shù)
os.getcwd():獲取當前目錄
os.chdir("..."):更改目錄
os.listdir("..."):列出給定路徑的節(jié)點中所有文件和目錄
類:自定義數(shù)據(jù)結(jié)構(gòu)和算法
- 面向?qū)ο缶幊?OOP):Python基本算是OOP語言
- OOP認為程序由獨享組成,每個對象都可與其他對象交互.
- 每個對象都可以:將代表此對象的值集合起來;執(zhí)行該對象的動作.
- 對象特點:屬性(如顏色);針對自己的命令作出反應(如輸出)
- OOP特性
封裝性:封裝細節(jié),通過接口訪問;
多態(tài)性:運算符或方法根據(jù)調(diào)用其的對象類型執(zhí)行不同的操作;
繼承性:允許基于類的特點創(chuàng)建另一個類.
- 類和實例
- 類(
class)是建立新對象的模版. - 利用類模版創(chuàng)建的對象稱為該類的實例(
instance). - 類定義 class 類名(父對象):代碼塊
class myClass(object): pass -
class是第三個能在命名空間建立新關聯(lián)的關鍵字(除賦值和def) - 關鍵詞
pass:表示該代碼塊為空. - 創(chuàng)建實例:
myInstance = myClass() -
dir(myClass)可查看類和實例包含的屬性 - 修改屬性(點標記):
myClass.classAttribute = 'hello' - Python對象作用域規(guī)則:先實例,然后類.
- 對象方法:定義類對象操作的函數(shù)稱為方法
- 自定義方法:即在類內(nèi)部定義函數(shù)
class myClass (object):
def myMethod (self,param1)
print "hello %s" % (param1)
self.instanceAttribute = param1
myInstance = myClass()
myInstance.myMethod('world')
- 融入Python類模型:Python保留了一些方法(開始和結(jié)束都是雙下劃線)
__init__:初始化
__str__:字符串方法,常用于輸出 - Python的OOP細節(jié)
- OOP的公有與私有:編程世界的三種角色(用戶,程序員,類設計者)
- 程序員只知道類的接口
- 類設計者需要控制和保護類的內(nèi)部結(jié)構(gòu),而不是類提供的方法
- 私有屬性(方法,變量)只提供給類設計者
- 使用雙下劃線表示私有
- Python中所有的方法和實例,類設計者和程序員都能訪問;
- 當屬性用雙下劃線作為前綴時,不要試圖修改它!
- Python的宗旨是“我們都是成年人”: 類設計者若表示什么是私有的,程序員不要試圖修改.
- Python可修改實例:不同于其他OOP語言.
異常處理
- 錯誤
myStr = int(raw_input("number:"))
number: a
>>> ValueError
當程序運行出錯時,Python先搜索程序員提供的相應錯誤處理程序. 如果找到,則將控制權交給這些代碼;否則,Python會停止運行.
- 基本的錯誤處理:try-except語句
try:
dividend = float(raw_input("dividend: "))
divisor = float(raw_input("divisor: "))
result = dividend / divisor
except ZeroDivisionError:
print "Divided by 0 error"
except ValueError:
print "Value Error"
print "Continue"
注:先看try代碼塊,無錯誤則跳過所有except;有錯,則停止在出錯行,尋找相應except語句,執(zhí)行并跳過其他except;找不到則停止運行并報錯.
- except后的錯誤名是Python給定的. 起始發(fā)現(xiàn)錯誤最簡單的方法就是故意產(chǎn)生錯誤,然后查看Python給出的錯誤名稱.
- 兩種處理錯誤的方式
- LBYL:三思而后行(新手)
if not isinstance(s,str) or not s.isdigit:
return None
elif len(s) > 10:
return None
else:
return int(str)
- EAFP:要求寬恕
try:
return int(str)
except (TypeError,ValueError,OverFlowError):
return None
- try-except復合語句
try:...
except:...
else: #try代碼塊不出錯,則執(zhí)行此代碼塊,并繼續(xù)
finally: #在try-except(-else)結(jié)束后要絕對執(zhí)行的代碼塊
- 應用
- 檢查輸入:反復輸入,直至正確.
while True:
try:
alueStr = raw_input("Input integer:")
alueInt = int(valueStr)
break
except ValueError:
print "Bad input"
- 檢查文件打開
while True:
try:
fileName = raw_input("Open a file:")
open(fileName,"r")
break
except IOError:
print "Bad file name"
-
raise exceptionName:可主動引發(fā)異常 - 自定義異常:Python中的異常是類. 創(chuàng)建異常,就是產(chǎn)生現(xiàn)有異常的子類.
class NewException(Exception):
pass