Python 2 總結(jié)

python 2 官方2020年停止維護。
參考文獻

基礎知識

  1. 現(xiàn)代計算機底層元件:晶體管(就是開關)
  2. 馮諾伊曼計算機體系結(jié)構(gòu)


    馮諾依曼體系
  3. 編程規(guī)則
  • 編程前要深思熟慮
  • 程序要有可讀性(方便自己以后看)
  1. Python簡介:1989年誕生,開源,最佳實踐語言
  2. 資源鏈接

開始使用

  1. "Hello World!":IDLE(GUI)中輸入 print "Hello World!"

上面是Python 2.x版本寫法,3.x是:print("Hello World!")

  1. 快捷鍵:腳本中 CTRL+ S 保存,之后F5運行
  2. 程序組成
  • 模塊:import math;math.+TAB可見所有備選(如math.pi)
  • 表達式(x+5)和語句(x=5
  • 空白:換行符號(\\
  • 注釋:單行(#);多行(用三引號'''上下括起來)
  1. 對象命名:字母、數(shù)字(數(shù)字不能作首字母)和下劃線組合

駱駝拼寫法:thisIsAnInteger

  1. 變量創(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])
  1. 運算符:**(方冪);a+=2等價于 a=a+2
  2. 數(shù)值計算符號表示 :1/12=0 ; 1.0/12 = 0.833...
  3. 海龜繪圖法
import turtle 
for i in range(4): 
    turtle.forward(50)
    turtle.right(90)

9.幫助:help(functioName)查看函數(shù)用法;help('moduleName')查看模塊用法

控制語句

  1. 語句分組通過縮進進行標識
  2. 可使用關系鏈:0<=a<=5
  3. 可多重賦值:a,b,c = 1,2,3
  4. 可直接交換:a,b = b,a
  5. Bool 關系符
  • 非:not x
  • 與:and x
  • 或:or x
  1. if 選擇
if Bool expression: ...
else: ...
  1. if 復合選擇:if - elif - else
  2. for 循環(huán):for variable in set: ...
  3. range(起始值,終值,步長)
  • range(5) = [0,1,2,3,4]
  • range(3,5) = [3,4]
  • range(1,20,4) = [1,5,9,13,17]
  1. while 循環(huán)
while Bool expression: ...
else: ... 
  1. 跳出循環(huán)
  • break: 跳出整個循環(huán)
  • continue: 跳出本次循環(huán)
  • 判斷輸入是否出錯:變量名.isdigit(),變量是整數(shù)則為真

程序設計策略

  1. 參與并提交
  • 針對問題做好準備,堅持,不輕易放棄
  • 找不會被中斷的時間工作
  • 若效率不高,則改變策略,或稍事休息
  • 專注于問題,調(diào)整好情緒
  1. 了解,然后想象
  • 理解問題:陳述,聯(lián)想已有算法,輸入輸出等問題
  • 問題真實化:舉例,圖表,嘗試
  1. 編程之前先思考:拒絕“牛糞球”代碼
  2. 試驗:不必一次完成,多嘗試
  3. 簡化:問題分解,分而治之(“洋蔥”法)
  4. 停下來思考
  5. 放松,休息。

函數(shù)

  1. 為什么要使用函數(shù) —— 函數(shù)的特點
  • 分而治之的策略
  • 抽象(封裝性):只需會用,不必懂原理
  • 重用:可以反復調(diào)用
  • 共享:別人也可以調(diào)用
  • 安全性:小段的代碼容易檢驗是否出錯
  • 簡化(可讀性):封裝過后的程序更可讀
  1. 使用:先定義,后調(diào)用
def testFunc(Num):
    return Num * 3
  1. main:主程序本身也可以作為函數(shù),在Python中創(chuàng)建獨立腳本時很有用
def main():
    main()
  1. 作用域:包含某個變量的程序語句集合. 每個程序都有自己的命名空間,用來定義變量的作用域.
  • 輸入已知函數(shù)名+'.'+TAB,即可查看相關的方法和變量
  • 雙下劃線是Python的保留屬性
    • __name__:與函數(shù)相關聯(lián)的名稱
    • __dict__:函數(shù)的命名空間
    • __doc__:文檔字符串(查詢函數(shù)) ,math.pi.__doc__
  1. Python傳遞的是對象引用:Python的一切皆為對象,所以每個值的傳遞都是對象的引用. 對象在這個過程中不可復制.
  • 如果對象可變,在函數(shù)中所做的更改將反映在對象的外部作用域
  • 如果對象不可變,當更新引用時,將指向新的對象

數(shù)據(jù)結(jié)構(gòu) 1:字符串

  1. 以單引號或者雙引號表示字符串
  2. 三引號:將保存所有字符的格式信息(字符串若跨行,則回車符也會保存)
  3. 非顯示字符:回車:\n;制表:\t
  4. 字符串表示形式:每個字符都以數(shù)字形式(ASCII碼)存儲
  • ord('a') = 97
  • chr(97) = 'a'
  • 索引
'Hello World'[1] = 'e'
Hello World
012345678910
  • 擴展索引 'Hello World'[起始位置:結(jié)束位置:步長]
  1. 分片:字符串序列要包含結(jié)束符,即每次分片時要多含一位
  • 'Hello World'[0:5] = 'Hello'
  • 'Hello World'[6:] = 'Hello World'[6:11] = 'Hello'
  • 倒數(shù)索引 'Hello World'[-1] = 'Hello World'[10] = 'd'
  • 字符串操作
    • :連接
    • *:重復
    • in:檢查集合成員
  1. 函數(shù):len(myStr),求長度;方法:myStr.upper(),轉(zhuǎn)成大寫
  2. 方法鏈:myStr.upper().find('s');查找方法:myStr.+TAB
  3. 格式化輸出: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ù)
  1. 字符串集合是不可變的:無法通過索引賦值,必須復制所選內(nèi)容.

數(shù)據(jù)結(jié)構(gòu) 2:列表和元組

  1. 什么是列表?
  • 列表是數(shù)據(jù)集類型之一,可以混合不同類型元素
  • 創(chuàng)建:aList = [1,2,'a',3,14]
  • 二維列表:listOfList[1][2]
  1. 列表特性
  • 列表的索引,分片和運算符與字符串基本一致
  • 列表也可用于for循環(huán):for n in [1,3,4,7]
  • 可變性:列表對象可發(fā)生改變,可對其賦值,如 aList[0] = 1
  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(),反向排序;
  1. 列表與字符串轉(zhuǎn)換
  • result = 'I love you'.split() = ['I','love',''you]
  • newStr = ''.join(result) = 'I love you'
  1. 可變對象及其引用
  • 對引用可變對象的變量進行操作,可能會改變對象本身,或者創(chuàng)建一個新的對象;
  • 對引用不可變對象的變量進行操作,只會創(chuàng)建新的對象
  1. 拷貝(復制)在Python中就是為對象添加新的名字
    注:Python中的命名空間由名字列表和對象列表組成;
L =[1,2,3]
L = L + [9]  #創(chuàng)建了新對象
L.append(9)  #僅改變了對象
  1. 列表解析:用緊湊的方式構(gòu)造列表 [表達式 + for子句 + if條件]
[i for i in range(10) if i % 2 == 0]
 >>> [0,2,4,6,8]
  1. 元組:myTuple = (1,2,3)
  • 元組是不可改變的列表
  • 單元素原元組:Tuple1 = (1,)
  • 為何需要元組:可為需要的地方提供不可變對象(如字典鍵)
  • 從列表到元組:tuple1 = tuple([6,1,3,4])

數(shù)據(jù)結(jié)構(gòu) 3:字典和集合

  1. 字典:可變的數(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()
  1. 字典方法
  • 字典列表:items()
  • 鍵列表:keys()
  • 值列表:values()
  • 淺拷貝字典:copy()
  1. 集合:可變的數(shù)據(jù)結(jié)構(gòu)
  • 集合內(nèi)元素不限定類型,沒有順序
  • 集合上不能索引賦值,但有其他方法可以改變集合內(nèi)的元素
  1. 集合方法
  • 交:aSet.intersection(bSet)
  • 并:union
  • 差:differenceaSet.difference(bSet) = A\B
  • 對稱差(收集兩個集合中不共享的元素):symmetric_difference
  • 子集和超集: A.issubset(B) = B.issubset(A) (A包含于B)
  • 添加:add(element)
  • 刪除:discard(element);clear(),刪除所有元素
  • 淺拷貝:copy()
  1. 再談作用域
  • 命名空間是名稱和對象的關系. 如果有多個命名空間,則可定義搜索順序,依次在不同的命名空間中來查找某個名稱. 這一過程在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} 

文件

  1. 文件:由字節(jié)組成的信息.
  • 文本文件:ASCII數(shù)據(jù)或其他
  • 二進制文件:word文檔
  1. 讀取: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()
  1. 創(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ū)中的新位置
  1. 關閉文件:open函數(shù)在內(nèi)存中創(chuàng)建緩存區(qū),將磁盤內(nèi)容復制到此位置. 關閉文件,則內(nèi)存緩存區(qū)的所有內(nèi)容寫回瓷盤,保持同步.
  2. CSV文件:是文本文件格式,有CSV拓展模塊支持.
  3. 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)和算法

  1. 面向?qū)ο缶幊?OOP):Python基本算是OOP語言
  • OOP認為程序由獨享組成,每個對象都可與其他對象交互.
  • 每個對象都可以:將代表此對象的值集合起來;執(zhí)行該對象的動作.
  • 對象特點:屬性(如顏色);針對自己的命令作出反應(如輸出)
  • OOP特性
    封裝性:封裝細節(jié),通過接口訪問;
    多態(tài)性:運算符或方法根據(jù)調(diào)用其的對象類型執(zhí)行不同的操作;
    繼承性:允許基于類的特點創(chuàng)建另一個類.
  1. 類和實例
  • 類(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ī)則:先實例,然后類.
  1. 對象方法:定義類對象操作的函數(shù)稱為方法
  • 自定義方法:即在類內(nèi)部定義函數(shù)
class myClass (object):
    def myMethod (self,param1)
        print "hello %s"  % (param1)
        self.instanceAttribute = param1
myInstance = myClass()
myInstance.myMethod('world')
  1. 融入Python類模型:Python保留了一些方法(開始和結(jié)束都是雙下劃線)
    __init__:初始化
    __str__:字符串方法,常用于輸出
  2. Python的OOP細節(jié)
  • OOP的公有與私有:編程世界的三種角色(用戶,程序員,類設計者)
    • 程序員只知道類的接口
    • 類設計者需要控制和保護類的內(nèi)部結(jié)構(gòu),而不是類提供的方法
    • 私有屬性(方法,變量)只提供給類設計者
  • 使用雙下劃線表示私有
    • Python中所有的方法和實例,類設計者和程序員都能訪問;
    • 當屬性用雙下劃線作為前綴時,不要試圖修改它!
  • Python的宗旨是“我們都是成年人”: 類設計者若表示什么是私有的,程序員不要試圖修改.
  • Python可修改實例:不同于其他OOP語言.

異常處理

  1. 錯誤
myStr = int(raw_input("number:"))
number: a
>>> ValueError

當程序運行出錯時,Python先搜索程序員提供的相應錯誤處理程序. 如果找到,則將控制權交給這些代碼;否則,Python會停止運行.

  1. 基本的錯誤處理: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;找不到則停止運行并報錯.

  1. except后的錯誤名是Python給定的. 起始發(fā)現(xiàn)錯誤最簡單的方法就是故意產(chǎn)生錯誤,然后查看Python給出的錯誤名稱.
  2. 兩種處理錯誤的方式
  • 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
  1. try-except復合語句
try:...
except:...
else: #try代碼塊不出錯,則執(zhí)行此代碼塊,并繼續(xù)
finally: #在try-except(-else)結(jié)束后要絕對執(zhí)行的代碼塊
  1. 應用
  • 檢查輸入:反復輸入,直至正確.
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
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容