北京理工大學:《Python語言程序設計》____筆記整理

# 這門課程是我最強烈推薦的python入門課程之一。緣由有三:其一,其更加關注編程的思想,極具備啓發性;其二,」小「但系統,可擴展性強;其三,有配套線上練習和測試。前端

# 本文將每次更新一個章節,直到課程結束。java

# 本文從5.28--6.7日,歷時11天,基本更新完畢,後面還有兩張不屬於python基礎,後續將以demo的方式進行詳細講解。python


第一章:程序設計基本方法

計算機與程序設計

計算機是根據指令操做數據的設備
計算機發展參照摩爾定律,表現爲指數形式

編譯和解釋

計算機執行源程序兩種方式:編譯和解釋
編譯:將源代碼一次性轉換成目標代碼的過程。執行編譯過程的程序叫編譯器(compiler)。
解釋:將原代碼逐條轉換成目標代碼同時逐條運行的過程。執行解釋過程的程序叫解釋器(interpreter)。
靜態語言:使用編譯執行的編程語言(C/C++,java)
腳本語言:使用解釋執行的編程語言(Python,JavaScript,PHP)

程序的基本寫法

IPO:
input輸入:文件輸入、控制檯輸入、交互輸入、內部參數輸入等。
process處理(主要邏輯):算法(靈魂)
output輸出:控制檯、文件、網絡、操做系統內部變量等輸出。

計算機編程

可以訓練思惟:
編程體現一種抽象交互、自動化執行的思惟方式
計算思惟:區分邏輯思惟和實證思惟的第三種思惟模式。

計算機編程

python環境配置

實例1 --溫度轉換

題目自己簡單,但學會這種思惟,其餘常見的"轉換"問題解決方法同理。

Python程序語法元素分析

程序的格式框架

python中用"縮進"表達程序的語法框架,表達代碼間包含關係的惟一手段
註釋:用於提升代碼可讀性的輔助文字,不被執行。

命名與保留字

變量:用來保存和表示數據的佔位符號,變量採用標識符(名字)來表示。
命名:數字字母下劃線。
"注意":大小寫敏感,數字不能放開頭,不與保留字同。
python中共有33個保留字,查詢方法:
```
import keyword
print(keyword.kwlist)
```

數據類型

字符串:由0個或多個字符組成的"有序"字符序列。# 有序-->能夠索引、切片
整數:數學中的整數
浮點數:數學中的實數,帶有小數點部分
列表:由0個或多個數據組成的"有序"序列

語句與函數

賦值語句
分支語句
函數

Python程序的輸入輸出

input()控制檯輸入
print()控制檯輸出,格式化
注:這兩兄弟,在控制檯顯示的時候,一個添加引號造成字符串,一個將字符串自動去掉引號。
補充:"eval()"去掉參數最外側引號並執行餘下語句的函數

溫度轉換代碼分析

第二章 Python基本圖形繪製

2.1 深刻理解Python語言

2.1.1計算機技術的演進

1946-1981:計算機系統結構時代(35年):
1981-2008:網絡和視窗時代(27年)
2008-2016:複雜信息系統時代(8年)
2016-    :人工智能時代

計算能力問題-->交互問題-->數據問題-->人類的問題

2.1.2編程語言的多樣初心

C:    性能
Java:跨平臺
C++: 大規模程序
VB:  桌面應用
Python:計算時代演進的選擇

Python語言的特色

通用語言
腳本語言
開源、跨平臺、多模型語言

C/C++:python歸python ,c歸c
Java:針對特定開發和崗位需求
HTML/CSS/JS:不可替代的前端技術,全棧能力
其餘語言: R/Go/Matlab等,特定領域

工具決定思惟:關注工具變革的力量!

超級語言的誕生

機器語言 --> 代碼直接執行,與CPU有關
彙編語言 --> 助記符,彙編器,與CPU有關
高級語言 --> 編譯器,與CPU無關
超級語言 --> 整合已有程序,龐大計算生態

== python是惟一的超級語言! ==算法

2.2 實例2:Python蟒蛇繪製

== import turtle == 導入海歸繪圖庫編程

"觸類旁通:"

Python蟒蛇繪製問題是各種圖形繪製問題的表明
--圓形繪製、五角星繪製、國旗繪製、機器貓繪製...

2.3 模塊1:turtle庫的調用

2.3.1 turtle庫基本介紹

--注:turtle庫是turtle繪圖體系的python實現 --1969年誕生,是python標準庫之一,入門級圖形繪製函數庫 --Python計算生態 = 標準庫 + 第三方庫 -庫Library、包Package、模快Module,統稱模塊

2.3.2 turtle繪圖窗體佈局

 

turltle.setup(width, height, startx, starty)
--注:4個參數後兩個可選,不選則默認在窗口的正中間,setup()不是必須的

2.3.3 turtle空間座標體系

--1)絕對座標:和數學中的座標系(象限)知識相同 --turtle.goto(x,y) 
--2)海龜座標:後退<-->前進;左側<-->右側 
--3)空間座標體系:turtle.bk(d),turtle.fd(d),burtle.circle(r,angle)

2.3.4 turtle角度座標體系

--1)絕對角度:0/360,90/-270,180/-180,270/-90 --turtle.seth(angle):改變海龜行進方向,angle爲絕對度數,只改變方向不前進。 
--2)海龜角度:turtle.left(angle),turtle.right(angle)

2.3.5 RGB色彩體系

--RGB指 紅 藍 綠 組合 --RGB整數值,小數值 --turtle.colormode(mode),默認小數值

2.4 turtle程序語法元素分析

2.4.1 庫引用和 import

import turtle
turtle. 格式:<a>.<b>()
<庫名>.<函數名>(<函數參數>)
或 <庫別名>.<函數名>(<函數參數>)

2.4.2 畫筆控制函數

penup(),pendown(),pensize(),pencolor()
別名:pu(),pd()
pensize(width) --> 別名:width(width)
pencolor(color) 顏色字符串、rgb值(三個小數值,或 一個元組小數值)

2.4.3 運動控制函數

fd(),circle(r,extent=None)
--r:默認圓心在海龜左側r距離的位置 --extent:繪製角度,默認是360度整圓

2.4.4 方向控制函數

turtle.setheading(angle) 別名: seth(angle)
turtle.left(),turtle.right()

第三章 基本數據類型

3.1 數字類型及操做

--3.1.1整數類型:與數學中概念一致,+|-都可,無範圍限制 --pow(x,y)函數 --3.1.2 4種進製表示形式: 十進制,二進制(0b,0B開頭),八進制(0o,0O開頭),十六進制(0x,0X)

--3.1.3浮點數類型:浮點數範圍和小數精度都存在限制,但常規計算能夠忽略 浮點數間運算存在不肯定尾數,發生在10E-16左右,不是bug
-- round(x,d):對x四捨五入,d是小數截取位數。用於浮點數間運算及比較。 -- 浮點數採用科學計數法表示<a>e<b> 
--3.1.4複數類型:Z.real得到實部,Z.imag得到虛部 
--3.1.5數值運算操做符:類型間能夠混合運算,生成結果爲「最寬」類型。 
--數值運算函數: -- abs(x) 絕對值 -- divmod(x,y) => 同時輸出商和餘數 -- pow(x,y[,z]) => 冪餘,(x**y)%z -- round(x[,d]) => 四捨五入,d小數位數,默認爲0 -- max()最大值 -- min()最小值 -- int(x) -- float() -- complex(x)

3.2 實例3:每天向上的力量

略

- GRIT,堅毅,對長期目標的持續激情及持久耐力 - GRIT是得到成功最重要的因素之一,牢記每天向上的力量

3.3 字符串類型及操做

3.3.1 字符串類型的表示

-- 單引號,雙引號;三引號 -- 索引 [M] -- 切片 [M,N,K] -- 轉義字符:\b回退,\n換行,\r回車(光標移到本行行首)

3.3.2 字符串操做符

-- + 字符串拼接 -- * 複製n次字符串 -- in

3.3.3 字符串處理函數

-- len(x) -- str(x) 任意類型所對應的字符串形式 -- hex(x)或oct(x) 整數x的十六進制或八進制小寫形式字符串 -- chr(u) u爲Unicode編碼,返回其對應的字符 -- ord(x) x爲字符,返回其對應的Unicode編碼

3.3.4 字符串處理方法

-- S.lower()或S.upper() 返回字符串副本,所有字符小寫/大寫 -- S.split(sep=None) 返回一個列表,由str根據sep被分隔部分組成 -- S.count(sub) 返回子字符串sub在str中出現的次數 -- S.replace(old,new) -- S.center(width[,fillchar]) -- S.strip(chars)從str中去掉在其左側和右側chars中列出的字符。 -- S.join(iter) 在iter變量除最後元素外每一個元素增長一個S。例如:','.join("12345") #主要用於字符串分割

3.3.5 字符串類型的格式化

"{<參數序號>:<格式控制標記>}"

:<填充><對齊><寬度><,><.精度><類型>

3.4 模塊2:time庫的使用

3.4.1 time庫的基本介紹

時間獲取:time() ctime() gmtime()
時間格式化: strftime() strptime()
程序計時:sleep(),perf_counter()

3.4.2 時間獲取

.time() 獲取當前時間戳,即計算計算機內部時間值,浮點數。

.ctime()獲取當前時間並以易讀方式表示,返回字符串

.gmtime()獲取當前時間,表示爲計算機可處理的時間格式

3.4.3 時間格式化

.strftime(tpl,ts) : tpl是格式化模板字符串,用來定義輸出效果,ts是計算機內部時間類型變量
t = time.gmtime()
time.strftime("%Y-%m-%d %H:%M:%S", t)
t = time.gmtime()
time.strftime("%Y-%m-%d %H:%M:%S", t)

timeStr = "2018-01-26 12:55:20"
time.strptime(timeStr,"%Y-%m-%d %H:%M:%S")

3.4.4 程序計時應用

start = time.perf_counter()
end = time.perf_counter()
end - start

sleep(s) s擬休眠時間,單位是秒,能夠是浮點數

3.5 實例4:文本進度條

這裏理解一個重要的系統概念:刷新
本質:用後打印的字符串覆蓋以前的字符串。不能換行(end=),要能回退\r
# TextProBarV3.py
import time
scale = 50
print("執行開始")
start = time.perf_counter()
for i in range(scale + 1):
    a = "*" * i 
    b = "." * (scale - i)
    c = (i / scale) * 100
    dur = time.perf_counter() - start
    print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c, a, b, dur), end="")
    time.sleep(0.1)
print("\n" + "執行結束".center(scale // 2, "-"))

第四章 程序的控制結構

4.1 程序的分支結構

「程序的控制結構」:順序結構、分支結構、循環結構

4.1.1 單分支結構

語法: if <條件>:
         <語句塊>

4.1.2 二分支結構

語法: if <條件>:
         <語句塊1>
 else:
         <語句塊2>
         
緊湊形式:適用於簡單表達式的二分支結構
<表達式1> if <條件> else <表達式2>

4.1.3 多分支結構

語法:if <條件1>:
         <語句塊1>
      elif <條件2><語句2>
          ...
 else:
         <語句塊N>

注: 注意多條件之間的包含關係,注意變量取值範圍的覆蓋。 通俗點: 多分支結構中,若是一個分支判斷條件經過後,會執行對應的語句塊,以後結束分支程序。即便,後續的elif條件也知足,也不會執行對應的語句塊.因此這裏其實也有一個順序關係。windows

4.1.4 條件判斷及組合

--條件判斷操做符:<,<=,>=,>,==,!= 
--條件組合三個保留字:and,or,not

4.1.5 程序的異常處理

try:
    <語句塊1>
except [<異常類型>]:
    <語句塊2>
注:標註異常類型後,僅響應該異常,異常類型名字等同於變量。

高級使用:
 try:
    <語句塊1>
except:
    <語句塊2>
else:           # 不發生異常的時候執行(獎勵)
    <語句塊3>
finally:        # 必定會執行
    <語句塊4>

4.2 實例5:身體質量指數BMI

BMI = 體重(Kg)/身高^2(m^2)

注:閱讀代碼的時候,快速的方法是:先搞懂分支的範圍關係,再深刻看每一個分支在作什麼。而不是從上到下的順序結構。

4.3 程序的循環結構

###4.3.1 遍歷循環設計模式

for <循環變量> in <遍歷結構>:
    <語句塊>
--從遍歷結構中逐一提取元素,放在循環變量中。 --完整遍歷全部元素後結束 --每次循環,所得到元素放入循環變量,並執行一次語句塊 
應用:計數循環、字符串遍歷循環、列表遍歷循環、文件遍歷循環、等等

4.3.2 無限循環

while <條件>:
    <語句塊>

4.3.3 循環控制保留字

-break 跳出並結束當前循環,執行循環後的語句

-continue 結束當次循環,繼續執行後續次數循環

--breakcontinue能夠與forwhile循環搭配使用。

4.3.4 循環的高級用法

循環中增長else:       
            <語句塊2>

--當循環沒有被break語句退出時,執行else語句塊 --else語句塊做爲「正常」完成循環的獎勵 --這裏else的用法與異常處理中else用法類似

4.4 模塊3:random庫的使用

4.4.1 random 標準庫之一

--僞隨機數:採用梅森旋轉算法生成的(僞)隨機序列中元素 --random庫主要用於生成隨機數

4.4.2 基本隨機函數

seed(a=None) --初始化給定的隨機數種子,默認爲當前系統時間
--random.seed(10) # 產生種子10對應的序列 --這個在實戰中用的比較多,「肯定」的僞隨機數便於對程序進行復現。 
random()
--生成一個[0.01.0)之間的隨機小數 --random.random()

4.4.3 擴展隨機數函數

>1. randint(a,b) 生成[a,b]之間的整數
 >2. randrange(m,n[,k]) 生成一個[m,n)之間以k爲步長的隨機整數
 >3. getrandbits(k) 生成一個k比特長的隨機整數
 >4. uniform(a,b) 生成一個[a,b]之間的隨機小數
 >5. choice(seq) 從序列seq中隨機選擇一個元素
 >6. shuffle(seq) 將序列seq中元素隨機排列,返回打亂後的序列

4.5 實例6:圓周率的計算

4.5.1 蒙特卡洛方法

from random import random
from time import perf_counter
DARTS = 1000 * 1000
hits = 0.0
start = perf_counter()
for i in range(1, DARTS+1):
    x, y = random(), random()
    dist = pow(x ** 2 + y ** 2, 0.5)
    if dist <= 1.0:
        hits += 1
pi = 4 * (hits / DARTS)
print("圓周率是:{}".format(pi))
print("運行時間是:{:.5f}s".format(perf_counter() - start))

第五章:函數的定義與使用

5.1.1 函數的理解和定義

函數是一段具備特定功能、可重用的語句組
下降編程難度 和 代碼複用

def <函數名>(<參數(0個或多個)>):
    <函數體>
    return <返回值>

不調用不會被執行

5.1.2 函數的使用及調用過程

調用是運行函數代碼的方式
-調用時給出實際參數,替代定義中的形式參數 -函數調用獲得返回值

5.1.3 函數的參數傳遞

-- 參數的個數:01,或多個。可是必須保留括號 
-- 可變數量參數,既不肯定參數總數量 
-- 傳遞參數兩種方式:位置參數,名稱傳遞

5.1.4 函數的返回值

-- return 保留字用來傳遞返回值 -- 能夠傳,能夠不傳,能夠傳遞0個,也能夠傳多個

5.1.5 局部變量和全局變量

-- (通常函數外部是全局變量,函數內部的變量是局部變量) 
規則一:局部變量和全局變量是不一樣變量
--局部變量是函數內部的佔位符,與全局變量可能重名但不一樣 --函數運算結束後,局部變量被釋放 --能夠用 global保留字在函數內部使用全局變量 (這裏還分可變類型和不可變類型)

規則二:局部變量爲組合數據類型且未建立,等同於全局變量

使用規則:
-基本數據類型,不管是否重名,局部變量與全局變量不一樣 -能夠經過global保留字在函數內部聲明全局變量 -組合數據類型,若是局部變量未真實建立,則是全局變量

5.1.6 lambda函數

無名,保留字,函數名是返回結果

<函數名> = lambda <參數>:<表達式>

--主要做用 特定函數或方法 的參數 -- 固定使用方式,逐步積累掌握 -- 通常狀況,用def定義普通函數,慎用lambda

5.2 七段數碼管 繪製

5.2.1 基本思路

--1. 繪製單個數字對應的數碼管 --2. 得到一串數字,繪製對應的數碼管 --3. 得到當前系統時間,繪製對應的數碼管
  • 分析單個數碼管:數組

    • 七段數碼管由7個基本線條組成
    • 七段數碼管能夠有固定順序(抽象出一條能夠首尾相連且不重不漏的路徑)
    • 不一樣數字顯示不一樣的線條(經過pu,pd控制)
  • 獲取一段數字,繪製多個數碼管:瀏覽器

    • 每繪製完一個數字,向右移動一段距離,準備下一個數字的繪製
  • 獲取當前系統時間:ruby

    • time庫
    • 增長年月日標記: write 方法
    • 年月日顏色不一樣標記
    • 線條之間適當小間隔,提升顏值

5.2.2 理解思惟方法

  • 模塊化思惟:肯定模塊接口,封裝功能
  • 規則化思惟:抽象過程爲規則,計算機自動執行
  • 化繁爲簡:將大功能變爲小功能,分而治之(鬆耦合,緊耦合)

5.2.3 觸類旁通

  • 繪製帶小數點的七段數碼管
  • 帶刷新的時間倒計時效果
  • 繪製高級的數碼管(多段)

5.3 代碼複用與函數遞歸

5.3.1 代碼複用與模塊化設計

  • 代碼複用:把代碼當成資源進行抽象
  • 代碼複用:|函數|和|對象|是代碼複用的兩種主要形式
    • 函數:(將代碼命名):在代碼層面創建了初步抽象
    • 對象:(屬性和方法):在函數基礎上再次組織進行抽象
  • 模塊化設計:分而治之
  • 模塊化設計:緊耦合、鬆耦合

5.3.2 函數遞歸的理解

  • 定義:函數定義中調用函數自身的方式
  • 兩個關鍵特徵:
    • 鏈條:計算過程存在遞歸鏈條
    • 基例:存在一個或多個不須要再次遞歸的基例
  • 相似數學概括法:遞歸是數學概括法思惟的編程體現

5.3.3 函數遞歸的調用過程

  • 遞歸的實現:函數+分支語句
    • 遞歸自己是一個函數,須要函數定義方式的描述
    • 函數內部,採用分支語句對輸入參數進行判斷
    • 基例和鏈條,分別編寫對應的代碼

5.3.4 函數遞歸實例解析

  • 字符串反轉
  • 斐波那契數列
  • 漢諾塔 PS:學會找到基例和鏈條

5.4 模塊:PyInstaller庫的使用

5.4.1 概述

  • 將.py源碼轉換成無需源代碼的可執行文件
  • 在命令窗口輸入後回車能夠查看對應的方法參數幫助
  • 要配置Path,關閉後再開cmd窗口

實例8:科赫雪花小包裹

PS:分形幾何,天然界常見
  • 基本方法:
    • 遞歸思想:函數+分支
    • 遞歸鏈條:線段的組合
    • 遞歸基例:初識線段
  • 運用 PyInstaller庫
  • 觸類旁通
    • 修改分形幾何繪製階數
    • 修改科赫曲線的基本定義及旋轉角度
    • 修改繪製科赫雪花的基礎框架圖形
  • 分形幾何擴展:
    • 康托爾集、謝爾賓斯基三角、門格海綿...
    • 龍形曲線、空間填充曲線、科赫曲線...
    • 函數遞歸的深刻應用...

第六章 組合數據類型

6.1 集合類型及操做

  • 6.1.1 集合類型定義
    • 與數學中概念一致
    • 集合元素之間無序,每一個元素之間惟一,不存在相同元素
    • 集合元素不可更改,不能是可變數據類型(爲何?集合定義:元素惟一不重複)
    • 集合創建用{}表示,元素逗號分隔
    • 創建集合用{}或set()
    • 創建空集合必須是set():由於Python中字典類型使用更多,因此{}給了創建空字典
  • 6.1.2 集合間操做
    • S | T 並
    • S - T 差
    • S & T 交
    • S ^ T 補 PS:上述四種操做均返回一個新集合
    • S <= T 或 S < T : 返回True/False,判斷S和T的子集關係
    • S >= T 或 S > T : 返回True/False,判斷S和T的包含關係
    • S|=T 更新集合S,包括在集合S和T中的全部元素
    • S-=T 更新集合S,包括在集合S但不在集合T中的元素
    • S&=T 更新集合S,包括同時在集合S和T中的元素
    • S^=T 更新集合S,包括集合S和T中的非相同元素
    • 操做函數或操做方法:
      • S.add(x) 若是X不在集合S中,將X增長到S
      • S.discard(x) 移除S中的元素X,若是x不在S中,不報錯
      • S.remove(x) 移除S中元素X,若是x不在S中,產生KeyError異常
      • S.clear() 移除S中全部元素
      • S.pop() 隨機返回S的一個元素,更新S,若S爲[空]產生KeyError異常
      • S.copy() 返回集合S的一個副本
      • len(S)
      • x in S
      • x not in S
      • set(x) 其餘變量轉變爲集合類型
  • 6.1.3 集合類型應用場景
    • 包含關係比較
    • 數據去重

6.2 序列類型及操做

  • 6.2.1 定義

    • 序列是具備前後關係的一組元素
      • 序列是一維元素向量,元素類型能夠不一樣
      • 元素間由序號引導,經過下標訪問序列的特定元素
    • 序列是一個基類類型
      • 字符串、元組、列表
    • 序號:反向遞減,正向遞增
  • 6.2.2 函數和方法

    • 通用操做符(6個)
      • in
      • not in
      • "+" :拼接
      • "*" : 複製
      • s[i] : 索引
      • s[i:j:k] : 切片
    • 函數和方法(5個)
      • len(s)
      • min(s)
      • max(s)
      • s.index(x[,i,j])
      • s.count(x)
  • 6.2.3 元組類型及操做

    • 元組是序列類型的一種擴展
      • 不可修改
      • ()或tuple()建立,元素間逗號分隔
      • 可使用或不用()
      • 特殊:單個元組,元素後面要加逗號
    • 元組繼承序列類型所有通用操做符
      • 建立後不可修改,因此沒有特殊操做
  • 6.2.4 列表類型及操做

    • 序列類型的一種擴展
      • 建立後能夠隨意被修改
      • []或list()建立,元素間逗號分隔
      • 列表中各元素類型能夠不一樣,無長度限制
    • 定義:方括號[]真正建立一個列表,賦值僅傳遞引用(貼標籤)
    • 函數和方法
      • ls[i] = x 修改
      • ls[i:j:k] = lt lt替換ls切片後所對應元素子列表
      • del ls[i] 刪除第i個元素
      • del ls[i:j:k]
      • ls += lt 更新列表ls,將lt元素增長到ls中。這裏有個特殊點提一下:這裏的操做不會從新開闢內存空間,本質上至關於ls.extend(lt)。
      • ls *= n 更新列表ls,重複n次
      • ls.append(x) 列表後面追加x
      • ls.clear() 刪除全部元素
      • ls.copy() 生成一個新列表,賦值ls中全部元素
      • ls.insert(i,x) 索引i的位置插入元素x
      • ls.pop(i) 取出索引爲i對應的元素並將它從列表中刪除,默認i=-1
      • ls.remove(x) 列表中出現的第一個x元素刪除
      • ls.reverse() 列表中元素反轉
  • 6.2.5 序列類型應用場景

    • 元素遍歷:ls、tp
    • 數據保護:tp

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

  • 6.3.1 基本統計值計算 ——問題分析
    • 總個數、求和、平均值、方差、中位數……
    • len()
    • for in 求和
    • 均值:求和/總個數
    • 方差: pow()函數
    • 中位數:排序,而後……
  • 6.3.2 實例講解
  • 6.3.3 觸類旁通
    • 獲取數據,控制檯獲取,多參數
    • 函數:模塊化設計
    • 利用BIF函數

6.4 字典類型及操做

  • 6.4.1 定義

    • 理解"映射",key:value對
    • list、tuple、str等序列類型是由python內部默認由0...N整數做爲數據的默認索引
    • 映射類型則由用戶爲數據定義索引
    • 鍵(key)是數據索引的擴展
    • 字典是鍵值對的集合,鍵值對之間無序
    • 採用{}和dict()建立,鍵值對用冒號表示
    • []用來向字典變量中索引或增長元素
  • 函數和方法

    • del d[k] 刪除鍵k對應的鍵值對
    • k in d[k] 判斷鍵是否在字典中
    • d.keys() 返回字典中全部鍵的信息,相似集合形式
    • d.values() 返回字典中全部值的信息,相似集合形式
    • d.items() 返回字典中全部鍵值對的信息,相似集合形式,鍵值對是以元組形式
    • d.get(k,<default>) 鍵k存在,返回對應的值,不然返回<default>值
    • d.pop(k,<default>) 鍵k存在,取出對應的值,不然返回<default>值
    • d.popitem() 隨機從字典中取出一個鍵值對,以元組形式返回
    • d.clear() 刪除全部鍵值對
    • len(d) 返回字典中鍵值對的個數
  • 應用場景

    • 統計數據出現的次數,數據是鍵,次數是值

6.5 模塊5:jieba庫的使用

  • 6.5.1 jieba庫是優秀的中文分詞第三方庫
    • pip安裝
    • 原理:依靠中文詞庫,經過漢字之間的關聯機率判斷,用戶能夠自定義添加特殊的分詞詞組,運用於特意的領域
    • 三種分詞模式
      • 精確模式:精確分開,不存在冗餘單詞
      • 全模式:全部可能詞語掃描出來,有冗餘
      • 搜索引擎模式:精確模式基礎上,對長詞進行再次切分
    • 經常使用函數:
      • jieba.lcut(s) 精確模式
      • jieba.lcut(s,cut_all=True) 全模式
      • jieba.lcut_for_search(s) 搜索引擎模式,返回列表類型的分詞結果,存冗餘
      • jieba.add_word(w) 向分詞添加新詞

6.6 實例10:文本詞頻統計


第七章 文件和數據格式化

7.1 文件的使用

  • 7.1.1 文件的類型

    • 文件是數據的抽象和集合
      • 文件是存儲在輔助存儲器上的[數據序列]
      • 文件是數據存儲的一種形式
      • 文件展示形態:文本文件和二進制文件
    • 文本文件 VS 二進制文件
      • 文本文件和二進制文件只是文件的展現方法
      • 本質上:全部文件都是二進制形式存儲
      • 形式上,全部文件採用兩種方式展現
    • 文本文件:
      • 單一特定編碼組成的文件,如UTF-8編碼
      • 因爲存在編碼,也被當作是存儲着的長字符串
      • 例如:.txt , .py文件等
    • 二進制文件:
      • 直接由比特0、1組成,沒有統一字符編碼
      • 通常存在二進制0,1的組織結構,即文件格式
      • 例如:png、avi等
  • 7.1.2 文件打開和關閉

    • 文件處理的步驟:打開——操做——關閉
文件的存儲狀態文件的佔用狀態a = opne( , )a.close()文件的存儲狀態文件的佔用狀態
    • 讀文件:3種方法 VS 寫文件: 3種方法 -文件的打開: <變量名> = open(<文件名>,<打開模式>)

      變量名:文件句柄

      文件名:文件路徑和名稱(源文件同目錄可省略)

      打開模式:文本or二進制;讀or寫

      補充:windows下,文件目錄之間用\,這個和python衝突,解決方式兩種:\\,或者用/ .

      打開模式:

文件打開模式 描述
"r" 只讀模式,默認值,若文件不存在,返回FileNotFoundError
"w" 覆蓋寫模式,文件不存在則建立,存在則徹底覆蓋
"x" 建立寫模式,文件不存在則建立,存在則返回FileExistsError
"a" 追加寫模式,文件不存在則建立,存在則在文件最後追加內容
"b" 二進制文件模式
"t" 文本文件模式,默認值
"+" 與r/w/x/a一同使用,在原功能基礎上增長同時讀寫功能
文件關閉:變量名.close()
  • 7.1.3 文件內容的讀取

    操做方法 描述
    <f>.read(size=-1) 讀入所有內容,若是給出參數,讀入前size長度
    <f>.readline(size=-1) 讀入一行內容,若是給出參數,讀入該行前size長度,每讀取一行指針移動到下一行的行首。
    <f>.readlines(hint=-1) 讀入文件全部行,以每行爲元素造成列表。若是給出參數,讀入前hint行。
    • 文件的全文本操做
      • 遍歷全文本:方法一:一次讀入read,統一處理
      • 遍歷全文本:方法二:按數量讀入,逐步處理
      fo = open(filename,"r")
      txt = fo.read(2)
      while txt != "":
          # txt進行處理
          txt = fo.read(2)
      fo.close()
    • 文件的逐行操做
      • 逐行遍歷文件:方法一:一次讀入,分行處理。缺點:對於大文件讀取速度慢
      fo = open(filename,"r")
      for line in fo.readlines():
          print(line)
      fo.close()
      • 逐行遍歷文件:方法二:分行讀入,逐行處理。優勢:大文件處理速度塊
      fo = open(filename,"r")
      for line in fo: # 經過迭代器訪問
          print(line)
      fo.close()
  • 7.1.4 數據的文件寫入
操做方法 描述
<f>.write(s) 向文件寫入一個字符串或字節流
<f>.writelines(lines) 將一個元素全爲字符串的列表寫入文件
<f>.seek(offset) 改變當前文件操做指針的位置,offset含義以下:0 - 文件開頭;1 - 當前位置;2 - 文件結尾
fo = open("output.txt", "w+")
ls = ["中國", "法國", "美國"]
fo.writelines(ls)
fo.seek(0)  # 不然,沒有結果輸出
for line in fo:
    print(line)
fo.close()

7.2 實例11:自動化軌跡繪製

  • 7.2.1 問題分析

    • 需求:根據腳原本繪製圖形?
    • 不是寫代碼而是寫數據繪製軌跡
    • 數據腳本是自動化最重要的第一步
  • 7.2.2 實例講解

    • 基本思路:
      • 步驟1:定義數據文件格式(接口):個性化
      • 步驟2:編寫程序,根據文件接口解析參數繪製圖形
      • 步驟3:編制數據文件
  • 7.2.3 觸類旁通

    • 理解方法思惟
      • 自動化思惟:數據和功能分離,數據驅動的自動運行
      • 接口化設計:格式化設計接口,清晰明瞭
      • 二維數據應用:應用維度組織數據,二維數據最經常使用
    • 應用問題擴展:
      • 擴展接口設計,增長更多控制接口
      • 擴展功能設計,增長弧形等更多功能
      • 擴展應用需求,發展自動軌跡繪製到動畫繪製
  • 7.3 一維數據的格式化和處理

    • 7.3.1 數據組織的維度:組織形式

      • 一維數據:
        • 由對等關係的有序或無序數據構成,採用線性方式組織
        • 對應列表、數組和集合等概念
      • 二維數據:
        • 由多個一維數據構成,是一維數據的組合形式
        • 表格是典型的二維數據,其中,表頭是二維數據的一部分
      • 多維數據
        • 由一維或二維數據在新維度上擴展造成
        • 好比,加入時間維度
      • 高維數據
        • 僅利用組基本的二元關係展現數據間的複雜結構
        • 好比,字典嵌套
      • 數據的操做週期:
        • 存儲<->表示<->操做
    • 一維數據的表示

      • 若是數據間有序:列表,for遍歷
      • 若是數據間無序:集合,for遍歷
    • 一維數據的存儲

      • 存儲方式一:空格分隔
        • 使用一個或多個空格分隔進行存儲,不換行
        • 缺點:數據中不能存在空格
      • 存儲方式二:逗號分隔
        • 使用英文半角逗號分隔數據進行存儲,不換行
        • 缺點:數據中不能有英文逗號
      • 存儲方式三:其餘方式,特殊字符
        • 使用其餘符號或符號組合分隔,建議採用特殊符號
        • 缺點:須要根據數據特色定義,通用性較差
    • 一維數據的處理

      • 將存儲的數據讀入程序
        • split方法
      • 將程序表示的數據寫入文件
        • join(ls) 方法
  • 7.4 二維數據的格式化和處理

    • 7.4.1 二維數據的表示
      • list類型:二維列表
        • 使用兩層for遍歷
        • 外層列表中每一個元素能夠對應一行,也能夠對應一列
    • 7.4.2 CSV格式與二維數據存儲
      • 注:CSV:Comma-Separated Values
      • 國際通用的一二維數據存儲格式,後綴:.csv
      • 每行一個一維數據,採用逗號分隔,無空行
      • Excel可讀入輸出,通常編輯軟件均可以產生
      • 若是某個元素缺失,逗號仍要保留
      • 二維數據的表頭能夠做爲數據存儲,也能夠另行存儲
      • 逗號爲英文半角逗號,逗號與數據之間無額外空格
    • 7.4.3 二維數據的存儲
      • 按行、列存儲均可以
      • 通常習慣:ls[row][column],先行後列
      • 根據通常習慣,按行存
    • 7.4.4 二維數據的處理
      • 讀入處理:
        fo = open(filename)
        ls = []
        for line in fo:
          line = line.replace("\n", "")
          ls.append(line.split(","))
        fo.close()
      • 寫入處理:
        ls = [[], [], []]  # 二維列表
        f = open(fname, "w")
        for item in ls:
            f.write(",".join(item) + "\n")
        f.close()
      • 二維數據的逐一處理
        • 採用二層循環
        ls = [[], [], []]  #二維列表
        for row in ls:
          for cloumn in row:
              print(ls[row][column])
  • - 7.5 模塊6:wordcloud庫的使用


        略,後續會補充一篇文章,全面的解析各個case


    - 7.6 實例12:政府工做報告詞雲
        

  •     略


第八章 程序設計方法學

  • 8.1 實例13:體育競技分析

    • 8.1.1 問題分析
      • 需求:毫釐是多少?如何科學分析體育競技比賽?
      • 輸入:球員水平
      • 輸出:可預測的比賽成績
    • 8.1.2 模擬N場比賽
      • 計算思惟:抽象+自動化
      • 模擬:抽象比勝過程+自動化執行N場比賽
      • 當N越大,比賽結果分析會越科學
    • 8.1.3 比賽規則
      • 雙人擊球比賽:A&B,回合制,5局3勝
      • 開始一方先發球,直至判分,接下來勝者發球
      • 球員只能在發球局得分,15分勝一局
    • 8.1.4 自頂向下(設計)和自底向上(執行)
      • 從總到分,分解大問題到計算機能解決的一個個小問題
      • 解決複雜問題的有效方法
      • 分單元測試,逐步組裝,按照自頂向下相反的路徑操做,直至系統各部分以組裝的思路都通過測試和驗證
      • 逐步組建複雜系統的有效測試方法
    • 8.1.5 實例講解
      • 程序整體框架及步驟
        • 1.> 打印介紹信息
        • 2.> 得到程序運行參數:proA,proB,n
        • 3.> 利用球員A和B的能力值,模擬n局比賽
        • 4.> 輸出球員A和B獲勝比賽的場次及機率
      • 第一階段:printInfo(),getInputs(),simNGames(),printSummary()
      • 第二階段:步驟三模擬N局比賽——再次分解
        • simOneGame()
      • 第三階段:根據分數判斷局的結束
        • gameOver()
    • 8.1.6 觸類旁通
      • 理解自頂向下和自底向上
        • 自頂向下設計:分而治之
        • 自底向上執行:模塊化集成
        • 自頂向下是「系統」思惟的簡化
      • 應用問題的擴展
        • 擴展比賽參數,增長對更多能力對比狀況的判斷
        • 擴展比賽設計,增長對真實比賽結果的預測
        • 擴展分析邏輯,方向推理,用勝率推算能力
  • 8.2 Python程序設計思惟

    • 8.2.1 計算思惟與程序設計
      • 第三種人類思惟特徵:
        • 邏輯思惟:推理和演繹,數學爲表明
        • 實證思惟:實驗和驗證,物理爲表明
        • 計算思惟:設計和構造,計算機爲表明,漢諾塔遞歸
      • 計算思惟(Computational Thinking):抽象和自動化
        • 抽象問題的計算過程,利用計算機自動化求解
        • 計算思惟是基於計算機的思惟,工具決定使用方法
        • 好比:求和;PI的計算;漢諾塔;天氣預報;量化分析交易
        • 計算思惟基於計算機強大的算力和海量數據
        • 抽象計算過程,關注設計和構造,而非因果
        • 以計算機程序設計爲實現的主要手段
    • 8.2.2 計算生態與Python語言
      • 1983,Richard Stallman啓動GNU項目
      • 1989,GNU通用許可協議誕生
      • 1991,Linus Torvalds發佈了Linux內核
      • 1998,網景瀏覽器開源,產生了Mozilla
      • 1983大教堂模式-->1991,集市模式
      • 開源思想深刻演化和發展,造成了計算生態
      • 競爭發展、相互依存、迅速更迭
      • API != 生態
        • API:應用程序編寫接口,是設計出來的
        • 生態:是野蠻生長而競爭淘汰的產物
      • 計算生態的價值
      • 計算生態的應用
        • 編程的起點不是算法而是系統
        • 編程的目標是爲了快速解決問題
    • 8.2.3 用戶體驗與軟件產品
      • 編程只是手段,不是目的,爲人類服務是目的
      • 提升用戶體驗的方法
        • |進度展現(應用場景)|
          • 程序須要計算時間,產生等待
          • 若干步驟,須要提示用戶並增長進度顯示
          • 程序存在大量次數循環
        • |異常處理(應用場景)|
          • 對用戶輸入的合規性進行檢查
          • 讀寫文件,對結果進行判斷
          • 當輸入輸出時,對運算結果進行判斷,須要異常處理
        • |其餘方法(應用場景)|
          • 打印輸出:特定位置,輸出程序運行的過程信息
          • 日誌文件:對程序異常和用戶使用記錄進行按期記錄
          • 幫助信息,給用戶多種方式提供幫助信息
      • 軟件程序 ==>> 軟件產品:用戶體驗是關鍵環節
    • 8.2.4 基本的程序設計模式
      • 從IPO開始
        • 肯定計算部分及功能邊界
        • 編寫程序:將計算求解的設計變成現實
        • 調試:確保按照正常邏輯可以正確執行
      • 自頂向下設計
      • 模塊化設計
        • 封裝,主程序,子程序,分而治之
        • 鬆耦合、緊耦合
      • 配置化設計
        • 程序引擎 + 配置文件
        • 程序執行和配置分離,將可選參數配置化
        • 將程序開發變成配置文件編寫,擴展功能而不修改程序
        • 關鍵在於接口設計,清晰明瞭,靈活可擴展
      • 應用開發的四個步驟:
        • 1.產品定義:功能(需求) + 商業模式
        • 2.系統架構:關注數據流+模塊化+體系架構
        • 3.設計與實現:結合系統架構、結合可擴展性、靈活性等進行設計優化
        • 4.用戶體驗:從用戶角度思考應用效果
  • 8.3 Python第三方庫安裝

    • 8.3.1 Python世界
      • https://pypi.org/
      • PyPI:Python Package Index
      • PSF維護的展現全球Python計算生態的主站
      • 學會檢索並利用PyPI,關鍵詞檢索
    • 8.3.2 第三方庫的pip安裝方法
      • Win+r =>輸入cmd回車,進入cmd,pip -h,能夠常看經常使用命令及介紹
    • 8.3.3 第三方庫的集成安裝方法
      • Anaconda —— 數據計算
    • 8.3.4 第三方庫的文件安裝方法
  • 8.4 模快7:os庫的基本使用

    os庫是標準庫,包含幾百個函數,經常使用路徑操做、進程管理、環境參數等幾類

    • 8.4.1 路徑操做:os.path子庫,處理文件路徑及信息

      • import os.path as op
      函數 描述
      os.path.abspath(path) 返回path在當前系統中的絕對路徑
      os.path.normpath(path) 歸一化,統一用\\分隔路徑
      os.path.relpath(path) 返回相對路徑
      os.path.dirname(path) 返回Path中目錄名稱
      os.path.basename(path) 返回path中最後的文件名稱
      os.path.join(path,*paths) 組合path,返回路徑字符串
      os.path.exists(path) 判斷path對應文件目錄是否存在,返回bool
      os.path.isfile(path) 判斷path所對應是否爲已存在的文件,返回bool
      os.path.isdir(path) 判斷path所對應是否爲已存在的文件,返回bool
      os.path.getatime(path) 返回path對應文件或目錄上一次的訪問時間
      os.path.getmtime(path) 返回path對應文件或目錄最近一次的修改時間
      os.path.getctime(path) 返回path對應文件或目錄的建立時間
      os.path.getsize(path) 返回path對應文件的大小,以字節爲單位
    • 8.4.2 進程管理:啓動系統中其餘程序

      • os.system(command)
      • 執行程序或命令command
      • 在windows系統中,返回值爲cmd的調用返回信息
      • eg1: os.system("C:\\windows\\System32\\calc.exe")
      • eg2: os.system(C:\\windows\\System32\\mspaint.exe D:\\pycode\\grwordcloud.png")
    • 8.4.3 環境參數:得到系統軟硬件信息等環境參數

      函數 描述
      os.chdir(path) 修改當前程序操做的路徑
      os.getcwd() 返回程序的當前路徑
      os.getlogin() 得到當前系統登錄用戶名
      os.cpu_count() 得到當前系統的CPU數量
      os.urandom(n) 得到n個字節長度的隨機字符串,一般用於加解密運算
  • 8.5 實例14:第三方庫自動安裝腳本

    • 8.5.1 問題分析:第三方庫自動安裝腳本
    • 8.5.2 優秀的第三方庫 (PyPI搜,略)
    • 8.5.3 觸類旁通:自動化腳本+
      • 編寫各種自動化運行程序的腳本,調用已有程序
      • 擴展應用:安裝更多的第三方庫,增長配置文件
      • 擴展異常檢測:捕獲更多異常類型,程序更穩定友好
相關文章
相關標籤/搜索