《Python語言程式設計》課程筆記

Famir_Tse發表於2018-04-29

第一部分 Python快速入門

第1周 Python基本語法元素

編譯:將原始碼一次性轉換成目的碼的過程(使用編譯執行的程式語言叫靜態語言,如C/C++,Java)
解釋:將原始碼逐條轉換成目的碼同時逐條執行的過程(使用解釋執行的程式語言叫指令碼語言,如Python,JavaScript,PHP )
程式的基本編寫方法:IPO
程式設計步驟:分析問題、劃分邊界(確定IPO)、設計演算法、編寫程式除錯測試、升級維護
程式設計體現了一種抽象互動關係、自動化執行的思維模式——計算思維(區別於邏輯思維、實證思維)
掌握語法、熟悉基本概念和邏輯 > 思考程式結構、使用程式設計套路 > 練習實踐、舉一反三
33個保留字:
這裡寫圖片描述
資料型別:整數、浮點數、字串、列表
賦值語句右側的資料型別同時作用於變數
評估函式eval()去掉引數最外側引號並執行餘下語句:如eval("1+2")輸出3eval('“1+2”')輸出'1+2'

第2周 Python基本圖形繪製

這裡寫圖片描述

  • C/C++:Python歸Python,C歸C
  • Java:針對特定開發和崗位需求
  • HTML/CSS/JS:不可替代的前端技術,全棧能力
  • 其他語言:R/Go/Matlab等,特定領域
    Python計算生態 = 標準庫 + 第三方庫
  • 標準庫:隨直譯器直接安裝到作業系統中的功能模組
  • 第三方庫:需要經過安裝才能使用的功能模組
  • 庫Library、包Package、模組Module,統稱模組
    這裡寫圖片描述
    這裡寫圖片描述
    turtle庫一些常用函式:
    turtle.penup() 別名 turtle.pu():抬起畫筆,海龜在飛行
    turtle.pendown() 別名 turtle.pd():落下畫筆,海龜在爬行
    turtle.pensize(width) 別名 turtle.width(width):畫筆寬度,海龜的腰圍
    turtle.pencolor(color):color為顏色字串或r,g,b值,畫筆顏色,海龜在塗裝
    pencolor(color)的color參與可以有三種形式
  • 顏色字串 :turtle.pencolor(“purple”)
  • RGB的小數值:turtle.pencolor(0.63, 0.13, 0.94)
  • RGB的元組值:turtle.pencolor((0.63,0.13,0.94))
    turtle.forward(d) 別名 turtle.fd(d):向前行進,海龜走直線
    turtle.circle(r, extent=None):根據半徑r繪製extent角度的弧形
    turtle.setheading(angle) 別名 turtle.seth(angle):改變行進方向,海龜走的角度,angle: 行進方向的絕對角度
    turtle.left(angle) 海龜向左轉,turtle.right(angle) 海龜向右轉, angle: 在海龜當前行進方向上旋轉的角度

第二部分 Python基礎語法

第3周 基本資料型別

  • 整數、浮點數、複數
  • 字串

3.1 數字型別及操作

浮點數間運算存在不確定尾數,不是bug:

  • round(x, d):對x四捨五入,d是小數擷取位數
  • 浮點數間運算及比較用round()函式輔助
  • 不確定尾數一般發生在1e-16 左右,round()十分有效
    數學思維 > 計算思維
    數值運算操作符:
    x // y 整數除,x與y之整數商 10//3結果是3
    x % y 餘數,模運算 10%3結果是1
    x ** y冪運算,x的y次冪
    數值運算函式:
    divmod(x,y):商餘,(x//y, x%y),同時輸出商和餘數
    round(x[, d]):四捨五入,d是保留小數位數,預設值為0,round(-10.123, 2) 結果為 -10.12
    int(x):將x變成整數,捨棄小數部分,int(123.45) 結果為123; int(“123”) 結果為123
    float(x):將x變成浮點數,增加小數部分,float(12) 結果為12.0; float(“1.23”) 結果為1.23

3.3 字串型別及操作

轉義符形成一些組合,表達一些不可列印的含義:"\b"回退 "\n"換行(游標移動到下行首) "\r" 回車(游標移動到本行首)
字串操作符:
x + y 連線兩個字串x和y
n * x 或 x * n 複製n次字串x
x in s 如果x是s的子串,返回True,否則返回False
str(x)返回任意型別x所對應的字串形式,與eval()對應
hex(x) 或 oct(x)整數x的十六進位制或八進位制小寫形式字串
字串處理方法:
這裡寫圖片描述
<a>.<b>()是物件導向的一種使用風格,<a>是物件,<b>是物件能提供的功能,稱為方法。方法必須要用.的形式來執行。
這裡寫圖片描述
字串型別的格式化:<模板字串>.format(<逗號分隔的引數>)
槽內部對格式化的配置方式:{ <引數序號> : <格式控制標記>}
這裡寫圖片描述
這裡寫圖片描述

3.4 模組2: time庫的使用

這裡寫圖片描述
time()獲取當前時間戳,即計算機內部時間值,浮點數,>>>time.time() 1516939876.6022282
ctime()獲取當前時間並以易讀方式表示,返回字串, >>>time.ctime() ‘Fri Jan 26 12:11:16 2018’
gmtime()獲取當前時間,表示為計算機可處理的時間格式, >>>time.gmtime() time.struct_time(tm_year=2018, tm_mon=1,tm_mday=26, tm_hour=4, tm_min=11, tm_sec=16,tm_wday=4, tm_yday=26, tm_isdst=0)
strftime(tpl, ts)tpl是格式化模板字串,用來定義輸出效果,ts是計算機內部時間型別變數,>>>t = time.gmtime() >>>time.strftime("%Y-%m-%d %H:%M:%S",t) ‘2018-01-26 12:55:20’
這裡寫圖片描述
這裡寫圖片描述
strptime(str, tpl)str是字串形式的時間值,tpl是格式化模板字串,用來定義輸入效果,>>>timeStr = ‘2018-01-26 12:55:20’ >>>time.strptime(timeStr, “%Y-%m-%d %H:%M:%S”) time.struct_time(tm_year=2018, tm_mon=1,tm_mday=26, tm_hour=4, tm_min=11, tm_sec=16,tm_wday=4, tm_yday=26, tm_isdst=0)
perf_counter()返回一個CPU級別的精確時間計數值,單位為秒,由於這個計數值起點不確定,連續呼叫差值才有意義 >>>start = time.perf_counter() 318.66599499718114
sleep(s)s擬休眠的時間,單位是秒,可以是浮點數

第4周 程式的控制結構

  • 分支結構與異常處理
  • 遍歷迴圈、無限迴圈

4.1 程式的分支結構

這裡寫圖片描述
異常處理:
這裡寫圖片描述

4.3 程式的迴圈結構

for <迴圈變數> in <遍歷結構> :從遍歷結構中逐一提取元素,放在迴圈變數中,遍歷迴圈:計數、字串、列表、檔案…

for i in range(N) :  #計數迴圈(N次)
for i in range(M,N,K) :  #計數迴圈(特定次)
for c in s :       #字串遍歷迴圈
for item in ls :   #列表遍歷迴圈
for line in fi :   #檔案遍歷迴圈, fi是一個檔案識別符號,遍歷其每行,產生迴圈

while <條件> :無限迴圈
迴圈控制保留字:continue退出當次迴圈,break退出當前迴圈

4.4 模組3: random庫的使用

random庫包括兩類函式,常用共8個

  • 基本隨機數函式: seed(), random()
  • 擴充套件隨機數函式: randint(), getrandbits(), uniform(), randrange(), choice(), shuffle()
    seed(a=None)初始化給定的隨機數種子,預設為當前系統時間
    random()生成一個[0.0, 1.0)之間的隨機小數
    choice(seq)從序列seq中隨機選擇一個元素
    shuffle(seq)將序列seq中元素隨機排列,返回打亂後的序列

第5周 函式和程式碼複用

  • 函式的定義和使用
  • 函式遞迴

5.1 函式的定義與使用

可選引數要賦初值
可變引數傳遞:函式定義時可以設計可變數量引數,即不確定引數的總數量

def <函式名>(<引數>, *b ) :   #*b為可變引數
	<函式體>
	return <返回值>

區域性變數和全域性變數:
規則1: 區域性變數和全域性變數是不同變數

  • 區域性變數是函式內部的佔位符,與全域性變數可能重名但不同
  • 函式運算結束後,區域性變數被釋放
  • 可以使用global保留字在函式內部使用全域性變數
    規則2: 區域性變數為組合資料型別且未建立,等同於全域性變數
    lambda函式:<函式名> = lambda <引數>: <表示式>,表示式相當於函式體,如f = lambda x, y : x + y

5.2 例項7: 七段數碼管繪製

理解方法思維

  • 模組化思維:確定模組介面,封裝功能
  • 規則化思維:抽象過程為規則,計算機自動執行
  • 化繁為簡:將大功能變為小功能組合,分而治之

5.3 程式碼複用與函式遞迴

把程式碼當成資源進行抽象

  • 程式碼資源化:程式程式碼是一種用來表達計算的"資源"
  • 程式碼抽象化:使用函式等方法對程式碼賦予更高階別的定義
  • 程式碼複用:同一份程式碼在需要時可以被重複使用
    函式 和 物件 是程式碼複用的兩種主要形式
    函式:將程式碼命名,在程式碼層面建立了初步抽象
    物件:屬性和方法,<a>.<b><a>.<b>(),在函式之上再次組織進行抽象
    函式遞迴:
  • 函式 + 分支結構
  • 遞迴鏈條
  • 遞迴基例
#漢諾塔
count = 0
def hanoi(n, src, dst, mid):
	global count
	if n == 1 :
		print("{}:{}->{}".format(1,src,dst))
		count += 1
	else :
		hanoi(n-1, src, mid, dst)
		print("{}:{}->{}".format(n,src,dst))
		count += 1
		hanoi(n-1, mid, dst, src)

5.4 模組4: PyInstaller庫的使用

PyInstaller庫:將.py原始碼轉換成無需原始碼的可執行檔案
使用:(cmd命令列) pyinstaller -F <檔名.py>
常用引數:
這裡寫圖片描述
pyinstaller –i curve.ico –F SevenDigitsDrawV2.py

5.5 例項8: 科赫雪花小包裹

#KochDrawV2.py
import turtle
def koch(size, n):          # n階科赫曲線的繪製函式
	if n == 0:
		turtle.fd(size)
	else:
		for angle in [0, 60, -120, 60]:
			turtle.left(angle)
			koch(size/3, n-1)
def main():                 # n階科赫雪花的繪製函式
	turtle.setup(600,600)
	turtle.penup()
	turtle.goto(-200, 100)
	turtle.pendown()
	turtle.pensize(2)
	level = 3               # 3階科赫雪花,階數
	koch(400, level)
	turtle.right(120)
	koch(400, level)
	turtle.right(120)
	koch(400, level)
	turtle.hideturtle()
main()
# 在cmd中執行以下程式碼,打包繪製程式
pyinstaller –i curve.ico –F KochDrawV2.py     # 使用圖示curve.ico包裝

第6周 組合資料型別

  • 集合型別
  • 序列型別:列表和元組
  • 字典型別

6.1 集合型別及操作

可變資料型別:列表、字典
非可變資料型別:整數、浮點數、複數、字串、集合、元組
建立集合型別用 {} 或 set() ,建立空集合型別,必須使用set()
集合操作符:6個操作符和4個增強操作符
這裡寫圖片描述
這裡寫圖片描述
集合處理方法
這裡寫圖片描述
這裡寫圖片描述

# while也可以遍歷組合資料型別
try:
	while True:
		print(A.pop(), end=""))
except:
	pass

資料去重:集合型別所有元素無重複

>>> ls = ["p", "p", "y", "y", 123]
>>> s = set(ls) # 利用了集合無重複元素的特點
{'p', 'y', 123}
>>> lt = list(s) # 還可以將集合轉換為列表
['p', 'y', 123]

6.2 序列型別及操作

序列型別通用操作符:
這裡寫圖片描述
序列型別通用函式和方法:
這裡寫圖片描述
元組是序列型別的一種擴充套件

  • 使用小括號 () 或 tuple() 建立,元素間用逗號 , 分隔
  • 可以使用或不使用小括號
    列表是序列型別的一種擴充套件,十分常用
  • 使用方括號 [] 或list() 建立,元素間用逗號 , 分隔
  • 列表中各元素型別可以不同,無長度限制
    方括號 [] 真正建立一個列表,賦值僅傳遞引用
    列表型別操作函式和方法:
    這裡寫圖片描述
    這裡寫圖片描述

6.3 例項9: 基本統計值計算

# 獲取多資料輸入:從控制檯獲取多個不確定資料的方法
def getNum():            #獲取使用者不定長度的輸入
	nums = []            #建立空列表用以儲存資料
	iNumStr = input("請輸入數字(回車退出): ")
	while iNumStr != "":
		nums.append(eval(iNumStr))
		iNumStr = input("請輸入數字(回車退出): ")
	return nums
# 通過函式分隔功能

6.4 字典型別及操作

字典型別是“對映”的體現

  • 字典是鍵值對的集合,鍵值對之間無序
  • 採用大括號{}和dict()建立,鍵值對用冒號: 表示
    字典型別操作函式和方法:
    這裡寫圖片描述
    d.keys()d.values()返回的不是列表型別,而是一種dict_keys型別和dict_values型別,可以用for...in...遍歷,不能當做列表操作
    d.items()返回一種dict_items型別,包括字典d中所有鍵值對
    這裡寫圖片描述

6.5 模組5: jieba庫的使用

jieba是優秀的中文分詞第三方庫

  • jieba庫提供三種分詞模式,最簡單隻需掌握一個函式
    jieba分詞的三種模式:
  • 精確模式:把文字精確的切分開,不存在冗餘單詞
  • 全模式:把文字中所有可能的詞語都掃描出來,有冗餘
  • 搜尋引擎模式:在精確模式基礎上,對長詞再次切分
    jieba庫常用函式:
    jieba.lcut(s):精確模式,返回一個列表型別的分詞結果
    jieba.lcut(s,cut_all=True):全模式,返回一個列表型別的分詞結果,存在冗餘
    jieba.lcut_for_search(s):搜尋引擎模式,返回一個列表型別的分詞結果,存在冗餘

6.6 例項10: 文字詞頻統計

#CalHamletV1.py Hamlet英文詞頻統計
def getText():        # 文字去噪及歸一化
	txt = open("hamlet.txt", "r").read()
	txt = txt.lower()
	for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~':
		txt = txt.replace(ch, " ")
	return txt

hamletTxt = getText()
words = hamletTxt.split()
counts = {}
for word in words:
	counts[word] = counts.get(word,0) + 1   #使用.get()方法統計詞頻
items = list(counts.items())
items.sort(key=lambda x:x[1], reverse=True)    #按value從大到小排列
for i in range(10):
	word, count = items[i]
	print("{0:<10}{1:>5}".format(word, count))
#CalThreeKingdomsV2.py 《三國演義》人物出場統計
import jieba
txt = open("threekingdoms.txt", "r", encoding="utf-8").read()
excludes = {"將軍","卻說","荊州","二人","不可","不能","如此"}  #定義排除詞集合
words = jieba.lcut(txt)     #使用jieba庫分詞
counts = {}
for word in words:           #需要根據結果進一步優化
	if len(word) == 1:
		continue
	elif word == "諸葛亮" or word == "孔明曰":
		rword = "孔明"
	elif word == "關公" or word == "雲長":
		rword = "關羽"
	elif word == "玄德" or word == "玄德曰":
		rword = "劉備"
	elif word == "孟德" or word == "丞相":
		rword = "曹操"
	else:
		rword = word
	counts[rword] = counts.get(rword,0) + 1
for word in excludes:
	del counts[word]
items = list(counts.items())
items.sort(key=lambda x:x[1], reverse=True)
for i in range(10):
	word, count = items[i]
	print("{0:<10}{1:>5}".format(word, count))
#《三國演義》人物出場順序前20:曹操、孔明、劉備、關羽、張飛、呂布、趙雲、孫權、司馬懿、周瑜、袁紹、馬超、魏延、黃忠、姜維、馬岱、龐德、孟獲、劉表、夏侯惇

詞頻統計進階:詞雲

第7周 檔案和資料格式化

  • 檔案的使用
  • 一二維資料的表示、儲存和處理

7.1 檔案的使用

檔案是資料的抽象和集合

  • 檔案是儲存在輔助儲存器上的資料序列,是資料儲存的一種形式
  • 檔案展現形態:文字檔案和二進位制檔案。檔案檔案和二進位制檔案只是檔案的展示方式,本質上,所有檔案都是二進位制形式儲存
    文字檔案由單一特定編碼組成,如:.txt檔案、.py檔案等
    二進位制檔案直接由位元0和1組成,沒有統一字元編碼,如:.png檔案、.avi檔案等
    檔案處理的步驟: 開啟-操作-關閉
    檔案的開啟:
    這裡寫圖片描述
    這裡寫圖片描述
    開啟模式:
    這裡寫圖片描述
    檔案的關閉:
    這裡寫圖片描述
    檔案內容的讀取:
    這裡寫圖片描述
#遍歷全文字:方法二
fname = input("請輸入要開啟的檔名稱:")
fo = open(fname,"r")
txt = fo.read(2)
while txt != "":            # 按數量讀入,逐步處理
	#對txt進行處理       
	txt = fo.read(2)
fo.close()
#逐行遍歷檔案:方法二
fname = input("請輸入要開啟的檔名稱:")
fo = open(fname,"r")
for line in fo:             #分行讀入,逐行處理
	print(line)
fo.close()

資料的檔案寫入:
這裡寫圖片描述

fo = open("output.txt","w+")
ls = ["中國", "法國", "美國"]
fo.writelines(ls)        # 寫入一個字串列表
fo.seek(0)              #使指標回到檔案開頭
for line in fo:
	print(line)         #>>>中國法國美國
fo.close()

7.2 例項11: 自動軌跡繪製

  • 步驟1:定義資料檔案格式(介面)
  • 步驟2:編寫程式,根據檔案介面解析引數繪製圖形
  • 步驟3:編制資料檔案
    資料介面定義
    這裡寫圖片描述
#AutoTraceDraw.py
import turtle as t
t.title('自動軌跡繪製')
t.setup(800, 600, 0, 0)
t.pencolor("red")
t.pensize(5)
#資料讀取
datals = []
f = open("data.txt")
for line in f:
	line = line.replace("\n","")
	datals.append(list(map(eval, line.split(","))))
f.close()
#自動繪製
for i in range(len(datals)):
	t.pencolor(datals[i][3],datals[i][4],datals[i][5])
	t.fd(datals[i][0])
	if datals[i][1]:
		t.right(datals[i][2])
	else:
		t.left(datals[i][2])

7.3 一維資料的格式化和處理

資料的操作週期:
這裡寫圖片描述
一維資料的表示:
如果資料間有序:使用列表型別
如果資料間無序:使用集合型別

#一維資料的讀入處理:從空格分隔的檔案中讀入資料
txt = open(fname).read()
ls = txt.split()      #返回列表格式
f.close()
#一維資料的寫入處理:採用空格分隔方式將資料寫入檔案
ls = ['中國', '美國', '日本']
f = open(fname, 'w')
f.write(' '.join(ls))     #
f.close()

7.4 二維資料的格式化和處理

二維資料的表示:
使用列表型別:二維列表
CSV資料儲存格式:CSV: Comma-Separated Values
資料中含有逗號時,可以使用轉義符\或引號‘’
二維資料的處理:

#從CSV格式的檔案中讀入資料
fo = open(fname)
ls = []
for line in fo:
	line = line.replace("\n","")
	ls.append(line.split(","))
fo.close()
#將資料寫入CSV格式的檔案
ls = [[], [], []] #二維列表
f = open(fname, 'w')
for item in ls:
	f.write(','.join(item) + '\n')
f.close()

7.5 模組6: wordcloud庫的使用

wordcloud庫把詞雲當作一個WordCloud物件,以WordCloud物件為基礎,配置物件引數、載入詞雲文字、輸出詞雲檔案
wordcloud.WordCloud()代表一個文字對應的詞雲
w = wordcloud.WordCloud():配置物件引數
w.generate(txt):向WordCloud物件w中載入文字txt,>>>w.generate( “Python and WordCloud” )
w.to_file(filename):將詞雲輸出為影象檔案,.png或.jpg格式,>>>w.to_file( “outfile.png” )
wordcloud庫所做的事情:
這裡寫圖片描述
配置物件引數w = wordcloud.WordCloud(<引數>)
width:指定詞雲物件生成圖片的寬度,預設400畫素
height:指定詞雲物件生成圖片的高度,預設200畫素
min_font_size:指定詞雲中字型的最小字號,預設4號
max_font_size:指定詞雲中字型的最大字號,根據高度自動調節
font_step:指定詞雲中字型字號的步進間隔,預設為1
font_path:指定字型檔案的路徑,預設None,如:font_path=“msyh.ttc”
max_words:指定詞雲顯示的最大單詞數量,預設200
stop_words:指定詞雲的排除詞列表,即不顯示的單詞列表,如stop_words={“Python”}
mask:指定詞雲形狀,預設為長方形,需要引用imread()函式,格式如下:

>>>from scipy.misc import imread
>>>mk=imread("pic.png")
>>>w=wordcloud.WordCloud(mask=mk)

background_color:指定詞雲圖片的背景顏色,預設為黑色,如:background_color=“white”
wordcloud應用例項:

import jieba
import wordcloud
txt = "程式設計語言是計算機能夠理解和識別使用者操作意圖的一種互動體系,它按照特定規則組織計算機指令,使計算機能夠自動進行各種運算處理。"
w = wordcloud.WordCloud( width=1000,font_path = "msyh.ttc",height=700)
w.generate(" ".join(jieba.lcut(txt)))  #中文需要先分詞並組成空格分隔字串
w.to_file("pywcloud.png")

7.6 例項12: 政府工作報告詞雲

#GovRptWordCloudv1.py
import jieba
import wordcloud
#from scipy.misc import imread
#mask = imread("fivestart.png")
f = open("新時代中國特色社會主義.txt", "r", encoding="utf-8")
t = f.read()
f.close()
ls = jieba.lcut(t)
txt = " ".join(ls)
w = wordcloud.WordCloud( font_path = "msyh.ttc",mask = mask,width = 1000, height = 700, background_color = "white")
w.generate(txt)
w.to_file("grwordcloud.png")

第三部分 Python程式設計思維

第8周 程式設計方法學

8.1 例項13: 體育競技分析

第9周 Python計算生態縱覽

注:原課程為北京理工大學嵩天老師在中國大學慕課開設的《Python語言程式設計》課程

相關文章