(同樣是編輯於2020.7
(於2021.11.7補發至個人博客
第四章
1程序的基本結構
1.1程序流程圖 略
1.2程序的基本結構
程序由三種基本結構組成:順序結構、分支結構和循環結構。
2.程序的分支結構
2.1 單分支語句:
2.1.1 結構 If <條件> :
<語句塊>
注:If語句首先評估條件的結果值,如果結果為True,則執行語句塊。
2.1.2 python的關系操作符
<小於 <=小於等於 >大於 >=大於等於 ==等於 !=不等於
特別注意:python中使用“=”表示賦值語句,使用“==”表示判斷等於。
2.1.3 一點說明:python中字符串的比較的本質上是字符串對應Unicode編碼的比較。因此,字符串的比較按照字典順序進行。Eg. Python<python(大寫字母編碼小於小寫字母編碼)
2.2二分支結構:
2.2.1 結構:if <條件> : #有冒號!
<語句塊1>
else : #有冒號!
<語句塊2>
2.2.2更簡潔的表示方法: <表達式1> if <條件> else <表達式2>
例:print(“空氣{}污染!”.format(“存在” if PM>=75 else “沒有”))
條件成立執行表達式1.
2.3多分支結構:
2.3.1 結構:if <條件1> : #有冒號!
<語句塊1>
elif <條件2>: #有冒號!
<語句塊2>
……
else : #有冒號!
<語句塊N>
3.實例5:身體質量指數BMI
基於分支結構的知識點,代碼如下:
- #CalBMIv3.py
- height, weight = eval(input("請輸入身高(米)和體重(公斤)[逗號隔開]: "))
- bmi = weight / pow(height, 2)
- print("BMI 數值為:{:.2f}".format(bmi))
- who, nat = "", ""
- if bmi < 18.5:
- who, nat = "偏瘦", "偏瘦"
- elif 18.5 <= bmi < 24:
- who, nat = "正常", "正常"
10. elif 24 <= bmi < 25:
- 11. who, nat = "正常", "偏胖"
12. elif 25 <= bmi < 28:
- 13. who, nat = "偏胖", "偏胖"
14. elif 28 <= bmi < 30:
- 15. who, nat = "偏胖", "肥胖"
16. else:
- 17. who, nat = "肥胖", "肥胖"
18. print("BMI 指標為:國際'{0}', 國內'{1}'".format(who, nat))
注:①所有賦值均用了同步賦值法。此方法第二章出現過。
②who, nat = "", "":給兩個值賦值空字符串。
③此代碼實現用兩種標准衡量體重。具體分割數值見教材105頁
④注意一下if控制的范圍。
⑤當一行語句過長時,可在語句中間添加一個反斜杠\后回車分行書寫,
添加了反斜杠的兩行語句在python眼中是一句。
Eg. height, weight = eval(input("請輸入身高(米)和體重\
(公斤)[逗號隔開]: "))
4.程序的循環結構:
4.1 遍歷循環:for語句
4.1.1結構:for <循環變量> in <遍歷結構> :
<語句塊>
4.1.2遍歷結構可以是字符串、文件、組合數據形式或range()函數等。
注:range(N):循環N次
4.1.3遍歷循環的一種擴展模式:
for <循環變量> in <遍歷結構> :
<語句塊1>
else:
<語句塊2>
注:只有for循環正常執行並結束后程序會執行else語句中的內容。
4.2無限循環:while語句
4.2.1 結構:while <條件> :
<語句塊>
其中條件與if語句中的判斷條件一樣,結果為True和False
4.2.2擴展模式同for
4.3循環保留字 break和continue
4.3.1 break:跳出for或while的最內層循環
脫離該循環后程序從循環代碼后繼續執行。
4.3.2 continue:結束當前當此循環
跳出循環體中下面尚未執行的語句,但不跳出當前循環。
4.3.3擴展模式同for while
5. random庫的使用
5.1 random庫——采用梅森旋轉算法生成偽隨機數序列
所謂偽隨機數,因為計算機時按照一定算法生成隨機數的,
其結果是確定的可預見的,成為偽隨機數。
5.2random庫解析
注:個人認為第二 第三 第五 第六個比較重要。
6.實例6:Π的計算
蒙特卡羅方法。代碼如下
- #CalPiV2.py
- 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)
- 10. if dist <= 1.0:
- 11. hits = hits + 1
12. pi = 4 * (hits/DARTS)
13. print("圓周率值是: {}".format(pi))
14. print("運行時間是: {:.5f}s".format(perf_counter() - start))
注:①整體思路:在四分之一圓內以及半徑相同正方形內隨機撒點
設定撒點總數,並記錄出現在四分之一圓內的點的總數。
② 代碼中的dist:點到圓心距離
③出現在圓內的點數除以點總數即為面積比,
利用四分之一圓面積公式求派
④求根號下x方y方也可用math庫中的sqrt()函數
7.程序的異常處理
7.1異常處理:try-except語句
結構:try:
<語句塊1>
except<異常類型>:
<語句塊2>
注:語句塊1為正常執行的程序內容,
語句塊2為如果發生了except所提示的類型錯誤所執行的內容。
eg.
try:
num = eval(input(“請輸入一個整數:”))
print(num**2)
except NameError:
print(“輸入錯誤,請輸入一個整數!”)
代碼執行效果:
>>>
請輸入一個整數:NO
輸入錯誤,請輸入一個整數!
7.2異常的高級用法
7.2.1 try-except支持多個except語句
與多分支結構類似
7.2.2保留字else finally
else同for while循環中的else一樣:
當try語句塊正常執行結束且沒有發生異常時else語句塊執行
finally 無論try語句塊是否正常執行finally都執行
照例插播一個小總結,方便記憶。
賦值符號 等於判斷符號
不等於判斷符號 if簡潔用法
同步賦值法 兩行語句中間\的作用
range() else在for while中的作用
break continue
random() randint(a,b)
randrange(a,b[,c]) uniform(a,b)
else在異常處理中的作用 finally
第四章習題
1 for var in ___:
print(var)
哪個選項不符合上述程序空白處的語法要求?
A (1,2,3)
B "Hello"
C range(0,10)
D {1;2;3;4;5}
2. for i in range(0,2):
print(i)
哪個選項是以上程序的輸出結果?
A 1 2
B 1
C 0 1 2
D 0 1
3. k=10000
while k>1:
print(k)
k=k/2
哪個選項給出了上述程序的輸出次數?
A 14
B 15
C 1000
D 13
4. 哪個選項是用來判斷當前Python語句在分支結構中?
A 大括號
B 冒號
C 縮進
D 引號
5. 哪個選項是下面代碼的執行結果?
for s in "PYTHON":
if s=="T":
continue
print(s,end="")
A PY
B PYTHON
C TT
D PYHON
6. 哪個選項是random庫中用於生成隨機小數的函數?
A randrange()
B randint()
C random()
D getrandbits()
7. 關於try-except,哪個選項的描述是錯誤的?
A 用於對程序的異常進行捕捉和處理
B 使用了異常處理,程序將不會再出錯
C NameError是一種異常類型
D 表達了一種分支結構的特點
8. 以下可以終結一個循環的保留字是:(學習通)
A、exit B、break C、if D、continue
9. 請選擇如下程序的執行結果:(學習通)
s = 0
for i in range(1, 11):
if i % 2 == 0:
continue
if i % 10 == 5:
break
s = s + i
print(s)
A、34 B、4 C、10 D、9
10. 下面代碼的輸出結果是:(學習通)
s = 0
while True:
if s<=1:
s = s + 1
else:
break
print(s)
A、1
B、死循環
C、3
D、2
11. 關於程序的異常處理,以下選項中描述錯誤的是 :(學習通)
A、編程語言中的異常和錯誤是不同的概念,異常處理可以使程序更健壯
B、異常語句可以與else和finally保留字配合使用
C、Python通過try、catch等保留字提供異常處理功能
D、異常處理的目的是捕獲異常並妥善處理,以使程序在發生異常時也可以繼續運行而不致崩潰
12.下面不能作為Python分支結構的條件表達的是(a為一個數值變量) (學習通)
A、a>10
B、a in {“ysu”}
C、a>5 and a<10
D、5
13. 關於random.uniform(a,b)的作用描述,以下選項中正確的是
A、生成一個均值為a,方差為b的正態分布
B、生成一個(a, b)之間的隨機數
C、生成一個[a, b]之間的隨機整數
D、生成一個[a, b]之間的隨機小數
14. sum = 0
for i in range(1,11):
sum += i
print(sum)
以下選項中描述正確的是:(學習通)
A、循環內語句塊執行了11次
B、sum += i 可以寫為 sum + = i
C、輸出的最后一個數字是55
D、如果print(sum) 語句完全左對齊,輸出結果不變
15. 已知有如下代碼:
>>> import random
>>> random.______()
執行后產生的隨機數始終在[0, 1.0)之間,請問它可能是random庫中的哪一個函數?
(學習通)
A、shuffle
B、randint
C、random
D、uniform
16. 以下關於Python的程序控制結構的說法中錯誤的是? (學習通)
A、在while和for循環中,continue語句的作用是終止當前當次循環,重新進入下一次循環。
B、在while和for循環中,break語句的作用是跳出所有的循環,不僅終止當前循環,也終止上一層循環。
C、if語句執行有一個特點,它是從上往下判斷,如果在某個判斷上是True,則執行該判斷對應的語句,忽略剩下的elif和else。
D、布爾運算符有一個很有趣的短路邏輯特性,即表達式x and y當x為假時,會直接返回False,不會去計算y的值。
17. 以下不正確的字符串是:(學習通)
A、'abc"ab"
B、'abc"ab’
C、"abc'ab"
D、"abc\ab"
第四章習題答案
1. 正確答案 D
for .. in .. 中 in 的后面需要是一個迭代類型(組合類型),{1;2;3;4;5}不是Python的有效數據類型。
2. 正確答案 D
range(0, 2)輸出兩個值:0和1。
3. 正確答案 A
請跟隨程序計算或在IDLE中運行程序獲得結果。
噗這個注解哈哈哈,這個題可以反過來想2的多少次方
嫌10000太大先除幾個2,然后再反過來想,容易一些。
不過其實說實在的除以14次2而已,硬算也是可以的。
4. 正確答案 C
縮進表達層次關系
5. 正確答案 D
continue結束當次循環,但不跳出當前循環。
6. 正確答案 C
randint()、getrandbits()、randrange()都產生隨機整數,random()產生0到1之間的隨機小數。
7. 正確答案 B
使用了異常處理,程序可能運行不會出錯,但邏輯上可能出錯。程序錯誤是一個大概念,不僅指代碼運行錯誤,更代表功能邏輯錯誤。
8. 正確答案 B
9. 正確答案 B
這題見太多次了。它的作用是計算1到4不能整除2的數的和。也就是1+3=4
沒反應過來就再反應反應
10. 正確答案D
11. 正確答案C
保留字try except 這題選進來主要是看一眼A選項。
12. 正確答案 B
需要注意的是D選項,整數做條件:0:FALSE 其他均為TRUE
13. 正確答案 D
14. 正確答案 C
range函數所限定的范圍左閉右開。
+=這類計算符號與等號連接使用的用法均不能有空格。
print在for內輸出10個數,在for外輸出1個數。
15. 正確答案C
16. 正確答案B
break只終止本層循環。
注意一下C和D兩個正確選項。
17. 正確答案A
字符串左右最外側引號必須數量一樣單雙三都行
第五章
1.函數
1.1定義及一些注意
1.1.1定義:函數是一段具有特定功能的,可重用的語句組。
函數也可以看作是一段具有名字的子程序。
1.1.2對函數的使用不需要了解函數內部實現原理
1.1.3自定義函數:用戶自己編寫的。
還有內置函數、標准庫中的庫函數
1.1.4 使用函數有兩個目的:降低變成難度和代碼復用
1.1.5格式:def <函數名>(<參數列表>):
<函數體>
return<返回值列表>
注意:當沒有參數時也要保留圓括號。
函數定義中的參數時形式參數。
1.1.6函數調用:<函數名>(<參數列表>)
這里的參數為要傳入函數內部的參數,為實際參數。
1.2函數的調用過程
我覺得應該都明白咋調用吧……不太懂的可以看書126看不明白可以問我
1.3 lambda函數——匿名函數
將函數名作為函數結果返回
格式: <函數名> = lambda <參數列表> : <表達式>
等價於: def <函數名> (<參數列表>):
return<表達式>
(每個模塊對應着看就懂了)
簡單地說,lambda函數用於定義簡單的、能夠在一行內表示的函數,返回一個函數類型。
舉個栗子
>>>f = lambda x,y : x+y
>>>f(10,12)
>>>22
2.函數的參數傳遞
2.1可選參數和可變數量參數
定義函數時有些參數存在默認值,若調用時不輸入參數則帶入默認值,如果輸入參數則以輸入為准。
舉個栗子
>>>def bling(str, times=1):
print(str*times) #這個還記得吧,字符串乘以n就是將字符串輸出n次
>>>bling(“xdyhfg!”) #猜中這一串是啥獎勵你一朵小發發(這個是沒輸入參數
>>>xdyhfg!
>>>bling(“xdyhfg!!”,3) #輸入參數后無視原來的默認參數
>>> xdyhfg!! xdyhfg!! xdyhfg!!
函數調用時需要按順序輸入參數,可選參數必須定義在非可選參數的后面,在上面的栗子中times必須跟在str后。
也可設計可變數量參數(顧名思義不一定是幾個),表示為一個星號加一個變量名。
要注意!!!帶有星號的可變參數只能出現在參數列表的最后。
舉個栗子
>>>def vfunc(a,*b):
print(type(b)) #內置函數,輸出變量類型
for n in b:
a+=n
return a
>>>vfunc(1,2,3,4,5)
<class’tuple’> #b變量的類型為元組類型(輸出本無有注釋我就是說明一下
15
2.2參數的位置和名稱傳遞
python可以按照形參名稱輸入實參,不一定非要按順序輸入參數。
比如有這么個函數 func(x1,x2,x3)(return省略了 有返回值)
你可以這么調用 result=func(x1=3,x3=6,x2=7)
2.3函數的返回值
可以沒有return,return可以不止返回一個值,
return可以不止一個(比如ifelse配套用)
2.4函數對變量的作用
在定義的函數內部可以定義全局變量,函數外的變量均為全局變量
格式:global<變量名>
關於局部變量和全局變量的原則,我覺得書上寫的挺好。直接上圖
如果這四條看不懂看看書131-132的幾個栗子,再看不懂問我。
3. 模塊3:datetime庫的使用
一些庫函數
datetime.now() 當前日期和時間,精確到微秒
datetime.utcnow() 當前世界標准時間
datetime(year,month,day,hour,minute,second,microsecond)構造一個日期和時間
個人認為這些都不重要。可以簡單看看控制符匯總表(也感覺不太重要)
指路教材135
4.實例7:七段數碼管繪制
這一部分的重點在於函數封裝。
整體實現方式比較容易理解:
① 有一個默認畫完一個八(七段數碼管)的函數
② 不管畫不畫,畫筆都會畫,需要通過對數字分類控制筆的抬起和放下
七段數碼管的繪制順序
基於以上知識點以及實現方式,代碼如下
- import turtle
- def drawLine(draw): #繪制單段數碼管
- turtle.pendown() if draw else turtle.penup()
- turtle.fd(40)
- turtle.right(90)
- def drawDigit(digit): #根據數字繪制七段數碼管
- drawLine(True) if digit in [2,3,4,5,6,8,9] else drawLine(False)
- drawLine(True) if digit in [0,1,3,4,5,6,7,8,9] else drawLine(False)
- drawLine(True) if digit in [0,2,3,5,6,8,9] else drawLine(False)
- drawLine(True) if digit in [0,2,6,8] else drawLine(False)
- turtle.left(90)
- drawLine(True) if digit in [0,4,5,6,8,9] else drawLine(False)
- drawLine(True) if digit in [0,2,3,5,6,7,8,9] else drawLine(False)
- drawLine(True) if digit in [0,1,2,3,4,7,8,9] else drawLine(False)
- turtle.left(180)
- turtle.penup()
- turtle.fd(20)
- def drawDate(date): #獲得要輸出的數字
- for i in date:
- drawDigit(eval(i)) #通過eval()函數將數字變為整數
- def main():
- turtle.setup(800, 350, 200, 200)
- turtle.penup()
- turtle.fd(-300)
- turtle.pensize(5)
- drawDate('20181010')
- turtle.hideturtle()
- turtle.done()
- main()
本身不難,注意一下if else的簡潔寫法,細節自己理解理解(暫時沒見過有這部分的題)
(不知道為啥這次不能復制成之前那種格式)
5. 代碼復用和模塊化設計
盡量使功能塊內部耦合緊密,功能塊之間耦合度低。
(提供一種理解記憶方式:所謂耦合,可以想成相關程度。同一個模塊都是干一個事兒的,相關性肯定強,耦合就緊密。而不同模塊之間干的事兒不一樣,如果相關性強,那不是重復了嘛,所以耦合度低。)
這個部分個人認為只有這一句話有用。細節可以看書141-142
6.函數的遞歸
6.1所謂遞歸——函數定義中調用函數自身的方式
關鍵特征:①存在一個或多個基例,基例不需要在此遞歸,它是確定的表達式。
②所有遞歸鏈要以一個或多個基例結尾
6.2遞歸的使用方法
……就……那么使
7. 實例8:科赫曲線繪制
- #KochDrawV1.py
- import turtle
- def koch(size, n):
- if n == 0:
- turtle.fd(size)
- else:
- for angle in [0, 60, -120, 60]:
- turtle.left(angle)
- koch(size/3, n-1)
10. def main():
- 11. turtle.setup(800,400)
- 12. turtle.penup()
- 13. turtle.goto(-300, -50)
- 14. turtle.pendown()
- 15. turtle.pensize(2)
- 16. koch(600,3) # 0階科赫曲線長度,階數
- 17. turtle.hideturtle()
18. main()
主要思想就是遞歸
基例:在一條直線的三分之一處開始,畫出一個三角形的兩條邊。
8.python內置函數
書149
比較有用的之前都列出來了。
第五章習題
1.以下選項不是函數作用的是:
A 降低編程復雜度
B 提高代碼執行速度
C 增強代碼可讀性
D 復用代碼
2.下列程序的輸出結果為:
def f(a,b):
a=4
return a+b
def main():
a=5
b=6
print(f(a,b),a+b)
main()
A 10 11
B 11 10
C 11 11
D 10 10
3. 以下關於Python函數說法錯誤的是:
def func(a,b):
c=a**2+b
b=a
return c
a=10
b=100
c=func(a,b)+a
A 該函數名稱為func
B 執行該函數后,變量a的值為10
C 執行該函數后,變量c的值為200
D 執行該函數后,變量b的值為100
4. 以下關於函數調用描述正確的是:
A 自定義函數調用前必須定義
B 函數在調用前不需要定義,拿來即用就好
C 函數和調用只能發生在同一個文件中
D Python內置函數調用前需要引用相應的庫
5.以下關於模塊化設計描述錯誤的是:
A 應盡可能合理划分功能塊,功能塊內部耦合度高
B 高耦合度的特點是復用較為困難
C 應盡可能合理划分功能塊,功能塊內部耦合度低
D 模塊間關系盡可能簡單,模塊之間耦合度低
6.以下對遞歸描述錯誤的是:
A 執行效率高
B 一定要有基例
C 書寫簡單
D 遞歸程序都可以有非遞歸編寫方法
7.以下關於函數說法錯誤的是:
A 函數可以看做是一段具有名字的子程序
B 對函數的使用必須了解其內部實現原理
C 函數是一段具有特定功能的、可重用的語句組
D 函數通過函數名來調用
8.哪個選項對於函數的定義是錯誤的?
A def vfunc(a,b):
B def vfunc(*a,b):
C def vfunc(a,b=2):
D def vfunc(a,*b):
9.關於return語句,以下選項描述正確的是:
A 函數中最多只有一個return語句
B return只能返回一個值
C 函數可以沒有return語句
D 函數必須有一個return語句
10.以下關於遞歸函數基例的說法錯誤的是:
A 遞歸函數的基例不再進行遞歸
B 遞歸函數的基例決定遞歸的深度
C 每個遞歸函數都只能有一個基例
D 遞歸函數必須有基例
11. 定義以下函數,其中f為所需要傳入的函數。(學習通)
def test(f, a, b):
print(f(a, b))
則執行語句 test((lambda x,y: x ** 3 + y), 2, 3)的輸出結果是哪個選項?
A、9 B、11 C、8 D、10
12. 下列表達式是'False'的是:(學習通)
A、 'abcd'<'ad'
B、 'abc'<'abcd'
C、 ''<'a'
D、 'Hello'>'hello'
第五章習題答案
1. 正確答案 B
函數不能直接提高代碼執行速度。
2. 正確答案 A
這里沒有全局變量,都是函數局部變量的運算。
3. 正確答案 C
這里沒有全局變量,請在IDLE中執行代碼觀察結果。
4. 正確答案 A
函數調用前必須已經存在函數定義,否則無法執行。
Python內置函數直接使用,不需要引用任何模塊。
5. 正確答案 C
模塊內高耦合、模塊間低耦合。
6. 正確答案 A
遞歸不提高程序執行效率。
任何遞歸程序都可以通過堆棧或隊列變成非遞歸程序(這是程序的高級應用)。
7. 正確答案 B
調用函數不需要知道函數內部實現原理,只需要知道調用方法(即接口)即可。
8. 正確答案 B
def vfunc(*a, b) 是錯誤的定義:*a表示可變參數,可變參數只能放在函數參數的最后。
9. 正確答案 C
函數可以包含0個或多個return語句
10. 正確答案 C
每個遞歸函數至少存在一個基例,但可能存在多個基例。
11. 正確答案 B
遇見lambda函數的要領:看冒號后面的。
此題冒號后面讓用x的三次方加y,text的三個變量f,a,b分別對應lambda函數,x和y
12. 正確答案 D
字符串比較大小實際上是對應編碼的大小比較。小寫字母編碼比大寫字母編碼大
第六章
1.組合數據類型——序列類型、集合類型和映射類型
注:首層分類千萬不要記錯!組合數據類型分大類就這三種
① 序列類型:是一個元素向量,元素之間存在先后關系,通過序號訪問,元素之間不排他。
② 集合類型:是一個元素集合,元素之間無序,相同元素在集合中唯一存在。
③ 映射類型:是鍵值數據項的組合,每個元素是一個鍵值對,表示為(key,value)
1.1序列類型
分為字符串、元組、列表三種類型。
(后兩個不常見)
1.1.1三種序列類型都可以使用相同的索引體系——正向遞增序號和反向遞減序號
1.1.2字符串可以看成是單一字符的有序組合,也被看作是基本數據類型
1.1.3元組是包含0個或多個數據項的不可變數據類型。
元組生成后是固定的,其中任何數據項不能替換或刪除。
元組用逗號隔開每個數據項,用圓括號括起來eg.(444,’dog’,’miao’)
注:圓括號在不混淆語義的情況下不是必須的。
元組套元組的索引 舉個栗子↓(簡單易懂√)
>>>wdmy=(’wo’,’de’,’ma’,’ya’)
>>>ha=(wdmy,2333)
>>>ha[0][1]
>>>’de’
1.2集合類型
1.2.1集合是包含0個活多個數據項的無序組合,元素不可重復,元素類型只能是固定數據類型(比如整數、浮點數、字符串、元組),而列表和字典和集合類型本身都是可變數據類型,不能作為集合元素出現。(就是說集合里不能套集合不能有列表和字典)
(是不是固定數據類型取決於能否進行哈希運算 教材157頁)
1.2.2set(x)函數用來生成集合(集合用大括號表示)
>>>w = set(“apple”)
{‘p’,’a’,’e’,’l’} #去重、無序
1.2.3操作符和函數
這一頁姑且都看一看熟悉一下。我覺得比較重要的會列在后面輔助記憶。
表六點三對比着記,注意返回值。
1.3映射類型
包括字典型,后面講字典的時候細說
2.列表類型和操作(還記得列表屬於那種組合類型嘛)
2.1列表
2.1.1是包含0個或多個對象引用的有序序列,屬於序列類型。
2.1.2列表的長度和內容可變(還記得哪個序列類型不可變嘛)
2.1.3因為屬於序列類型,所以表6.1的方法都能用
2.2列表類型的操作
(ls是列表名 都知道吧……)
(這個表都挺重要的)
教材161-162實例看一看輔助理解
3. 實例9:基本統計值計算
過於簡單 直接粘代碼了
- #CalStatisticsV1.py
- def getNum(): #獲取用戶不定長度的輸入
- nums = []
- iNumStr = input("請輸入數字(回車退出): ")
- while iNumStr != "":
- nums.append(eval(iNumStr))
- iNumStr = input("請輸入數字(回車退出): ")
- return nums
10. def mean(numbers): #計算平均值
- 11. s = 0.0
- 12. for num in numbers:
- 13. s = s + num
- 14. return s / len(numbers)
- 15.
16. def dev(numbers, mean): #計算方差
- 17. sdev = 0.0
- 18. for num in numbers:
- 19. sdev = sdev + (num - mean)**2
- 20. return pow(sdev / (len(numbers)-1), 0.5)
- 21.
22. def median(numbers): #計算中位數
- 23. sorted(numbers)
- 24. size = len(numbers)
- 25. if size % 2 == 0:
- 26. med = (numbers[size//2-1] + numbers[size//2])/2
- 27. else:
- 28. med = numbers[size//2]
- 29. return med
- 30.
31. n = getNum() #主體函數
32. m = mean(n)
33. print("平均值:{},方差:{:.2},中位數:{}.".format(m, dev(n,m),median(n)))
問一個應該沒人不知道的問題 這個程序從第幾行開始執行?
應該還記得雙斜杠是整除號吧,不四舍五入的那種
sprt求平方根 sorted:升序排列
4.字典類型和操作
4.1字典
格式:{<鍵1>:<值1>,……}(鍵和值用中括號[]括起來)
對應:<值>=<字典變量>[<鍵>]
4.2 操作
4.2.1生成空列表 set()
4.2.2注意事項
① 字典是一個鍵值對的集合,該集合以鍵為索引,一個鍵信息只對應一個值信息。
② 字典中元素以鍵信息為索引訪問。
③ 字典長度是可變的,可以通過對鍵信息賦值實現增加或修改鍵值對。
④ 字典的鍵為固定數據類型(可以理解為不可變)
5.模塊4:jieba庫的使用
5.1分詞函數
jieba庫的三種分詞模式:
① 精確模式:將句字最精確的切開,適合文本分析
lcut 輸出的分詞能夠完整且不多余的組成原始文本
② 全模式:把句字中所有可以成詞的詞語全掃描出來。速度快,但不能消除歧義
冗余性最大
③ 搜索引擎模式:在精確模式的基礎上,對長詞再次切分。
庫安裝指令,以jieba庫為例 pip install jieba(想了想還是順手打以下這條)
庫的引用忘了的回turtle那復習
6.實例10:文本詞頻統計
- #CalHamletV1.py
- def getText():
- txt = open("hamlet.txt", "r").read()
- txt = txt.lower()
- for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~':
- txt = txt.replace(ch, " ") #將文本中特殊字符替換為空格
- return txt
- hamletTxt = getText()
10. words = hamletTxt.split()
11. counts = {}
12. for word in words:
- 13. counts[word] = counts.get(word,0) + 1
14. items = list(counts.items())
15. items.sort(key=lambda x:x[1], reverse=True)
16. for i in range(10):
- 17. word, count = items[i]
- 18. print ("{0:<10}{1:>5}".format(word, count))
- 以哈姆雷特為例的英文詞頻統計。
① 第三行文件的打開后面會整理到
② 第四行 全部換小寫
③ getText函數就是把全文本的大寫換小寫,特殊字符換空格然后返回更改之后的文本
④ 此程序從第九行開始,首先處理文本
⑤ 第十行 以空格為分隔符分割字符串
⑥ 第11行,創建了一個字典(后面的題里也有涉及到,這種創建方法默認創建的是字典)
⑦ 第十三行,counts[word]為字典中的鍵,counts.get(word,0) + 1為word鍵的值,默認值為0,從1開始計數
⑧ 第十四行,創建了一個以counts字典所有鍵值對為元素的列表(因為列表能排序字典不能)
⑨ 第十五行,以值的值排序,reverse=True控制排為降序(sorted默認升序,這里是sort,不太一樣 具體我也不太懂)
⑩ 最后的for循環,輸出出現次數最多的十個 第十八行控制了格式,格式咋控制忘了的去翻format的大表格
值得一提的是這好像是第一次見到format控制了兩個變量。冒號前為參數序號,0對應word,1對應count
- #CalThreeKingdomsV1.py
- import jieba
- txt = open("threekingdoms.txt", "r", encoding='utf-8').read()
- words = jieba.lcut(txt)
- counts = {}
- for word in words:
- if len(word) == 1:
- continue
- else:
- 10. counts[word] = counts.get(word,0) + 1
11. items = list(counts.items())
12. items.sort(key=lambda x:x[1], reverse=True)
13. for i in range(15):
- 14. word, count = items[i]
- 15. print ("{0:<10}{1:>5}".format(word, count))
- 以三國演義為例的中文詞頻統計
① 引用可以分中文詞的jieba庫
② 第四行,還記得lcut是那種分詞方式么2333(精確模式)
③ 第七行,因為統計的是人名所以排除了分詞結果是單個字符的情況
④ 后面和哈姆雷特沒啥差了
ok第六章撒花!這一章我覺得有概率會考程序填空?大概
建議找找慕課上的編程題做一做 不做的話至少把實例看熟,函數表格看書
除此之外這一章有些細節很值得注意的 比如組合類型分類 比如每種類型的一些特點 元組不可更改之類的
建議再翻翻書
函數&方法小匯總 忘了的回去查哇
主要記憶:作用和返回值
- 序列通用(實際上字符串那里都有)
x in s s[i:j:k]
x not in s len(s)
s+t min(s)
s*n max(s)
s[i] s.index(x[,i[,i]])
s[i:j] s.count(x)
- 集合類型
& | ^ -
s.add(x) s.isdisjoint(t)
s.clear() len(s)
s.copy() x in s
s.discard(x) x not in s
s.remove(x)
3. 列表類型
ls[i]=x ls.append(x)
ls[i:j]=lt ls.clear()
ls[i:j:k]=lt ls.copy()
del ls[i:j] ls.insert(I,x)
del ls[i:j:k] ls.pop(i)
ls+=lt 或ls.extend(lt) ls.remove(x)
ls*=n ls.reverse()
- 字典
<d>.keys() <d>.popitem()
<d>.values() <d>.clear()
<d>.items() del <d>[<key>]
<d>.get(<key>,<default>) <key>in<d>
<d>.pop(<key>,<default>)
第六章習題
1.哪個選項是下面代碼的輸出結果?
d= {'a': 1, 'b': 2, 'b': '3'}
print(d['b'])
A 2 B 3 C {'b':2} D 1
2. 關於Python的元組類型,以下選項錯誤的是:
A 元組一旦創建就不能被修改
B 一個元組可以作為另一個元組的元素,可以采用多級索引獲取信息
C 元組中元素必須是相同類型
D 元組采用逗號和圓括號(可選)來表示
3. 關於Python組合數據類型,以下描述錯誤的是:
A 組合數據類型能夠將多個相同類型或不同類型的數據組織起來,通過單一的表示使數據操作更有序、更容易
B Python的字符串、元組和列表類型都屬於序列類型
C 組合數據類型可以分為3類:序列類型、集合類型和映射類型
D 序列類型是二維元素向量,元素之間存在先后關系,通過序號訪問
4. 給定字典d,哪個選項對d.values()的描述是正確的?
A 返回一個元組類型,包括字典d中所有值
B 返回一個列表類型,包括字典d中所有值
C 返回一種dict_values類型,包括字典d中所有值
D 返回一個集合類型,包括字典d中所有值
5. 關於大括號{},以下描述正確的是:
A 直接使用{}將生成一個字典類型
B 直接使用{}將生成一個集合類型
C 直接使用{}將生成一個列表類型
D 直接使用{}將生成一個元組類型
6. 列表ls,哪個選項對ls.append(x)的描述是正確的?
A 向列表ls最前面增加一個元素x
B 向ls中增加元素,如果x是一個列表,則可以同時增加多個元素
C 只能向列表ls最后增加一個元素x
D 替換列表ls最后一個元素為x
7. 給定字典d,哪個選項對x in d的描述是正確的?
A x是一個二元元組,判斷x是否是字典d中的鍵值對
B 判斷x是否是字典d中的值
C 判斷x是否是在字典d中以鍵或值方式存在
D 判斷x是否是字典d中的鍵
8.序列s,哪個選項對s.index(x)的描述是正確的?
A 返回序列s中元素x第一次出現的序號
B 返回序列s中x的長度
C 返回序列s中元素x所有出現位置的序號
D 返回序列s中序號為x的元素
9. 對字典數據類型描述正確的是 (學習通)
A、字典是鍵值對的集合
B、字典是有序的
C、元組不可以作為字典的鍵
D、列表可以作為字典的鍵
10. s =["seashell","gold","pink","brown","purple"]
print(s[1:4:2])(學習通)
A、['gold', 'pink']
B、['gold', 'pink', 'brown', 'purple']
C、['gold', 'pink', 'brown']
D、['gold', 'brown']
11. 如下:(學習通)
str1 = "Runoob example....wow!!!"
str2 = "exam";
Print(str1.find(str2, 5)) 打印的結果是?
12.已知 dicts={張三":2,"李四”:4,"王五":5} 則想將王五的號碼改成7,下列語句正確的是(學習通)
A、dicts["王五"]=7
B、dicts("王五")=7
C、dicts[2]=7
D、dicts[3]=7
這一章py123上的編程題我感覺還挺簡單也比較有會的必要也貼在這兒了,答案里是我的答案,能實現就可以啦
1. 數字不同數之和
描述
獲得用戶輸入的一個整數N,輸出N中所出現不同數字的和。
例如:用戶輸入 123123123,其中所出現的不同數字為:1、2、3,這幾個數字和為6。
輸入輸出示例
|
輸入 |
輸出 |
示例 1 |
123123123 |
6 |
2.人名最多數統計
描述
編程模板中給出了一個字符串,其中包含了含有重復的人名,請直接輸出出現最多的人名。
輸入輸出示例
(這里是個示例,展示輸出格式,不是結果。
|
輸入 |
輸出 |
示例 1 |
無 |
黃蓉 |
s = '''雙兒 洪七公 趙敏 趙敏 逍遙子 鰲拜 殷天正 金輪法王 喬峰 楊過 洪七公 郭靖
楊逍 鰲拜 殷天正 段譽 楊逍 慕容復 阿紫 慕容復 郭芙 喬峰 令狐沖 郭芙
金輪法王 小龍女 楊過 慕容復 梅超風 李莫愁 洪七公 張無忌 梅超風 楊逍
鰲拜 岳不群 黃葯師 黃蓉 段譽 金輪法王 忽必烈 忽必烈 張三豐 喬峰 喬峰
阿紫 喬峰 金輪法王 袁冠南 張無忌 郭襄 黃蓉 李莫愁 趙敏 趙敏 郭芙 張三豐
喬峰 趙敏 梅超風 雙兒 鰲拜 陳家洛 袁冠南 郭芙 郭芙 楊逍 趙敏 金輪法王
忽必烈 慕容復 張三豐 趙敏 楊逍 令狐沖 黃葯師 袁冠南 楊逍 完顏洪烈 殷天正
李莫愁 阿紫 逍遙子 喬峰 逍遙子 完顏洪烈 郭芙 楊逍 張無忌 楊過 慕容復
逍遙子 虛竹 雙兒 喬峰 郭芙 黃蓉 李莫愁 陳家洛 楊過 忽必烈 鰲拜 王語嫣
洪七公 韋小寶 阿朱 梅超風 段譽 岳靈珊 完顏洪烈 喬峰 段譽 楊過 楊過 慕容復
黃蓉 楊過 阿紫 楊逍 張三豐 張三豐 趙敏 張三豐 楊逍 黃蓉 金輪法王 郭襄
張三豐 令狐沖 趙敏 郭芙 韋小寶 黃葯師 阿紫 韋小寶 金輪法王 楊逍 令狐沖 阿紫
洪七公 袁冠南 雙兒 郭靖 鰲拜 謝遜 阿紫 郭襄 梅超風 張無忌 段譽 忽必烈
完顏洪烈 雙兒 逍遙子 謝遜 完顏洪烈 殷天正 金輪法王 張三豐 雙兒 郭襄 阿朱
郭襄 雙兒 李莫愁 郭襄 忽必烈 金輪法王 張無忌 鰲拜 忽必烈 郭襄 令狐沖
謝遜 梅超風 殷天正 段譽 袁冠南 張三豐 王語嫣 阿紫 謝遜 楊過 郭靖 黃蓉
雙兒 滅絕師太 段譽 張無忌 陳家洛 黃蓉 鰲拜 黃葯師 逍遙子 忽必烈 趙敏
逍遙子 完顏洪烈 金輪法王 雙兒 鰲拜 洪七公 郭芙 郭襄 趙敏'''
第六章習題答案
1.正確答案 B
創建字典時,如果相同鍵對應不同值,字典采用最后(最新)一個"鍵值對"。
2. 正確答案 C
序列類型(元組、列表)中元素都可以是不同類型。
3. 正確答案 D
序列類型總體上可以看成一維向量,如果其元素都是序列,則可被當作二維向量。
4. 正確答案 C
運行如下代碼:(其中d是一個預定義的字典)
d={"a":1, "b":2}
type(d.values())
輸出結果是:<class 'dict_values'>
d.values()返回的是dict_values類型,這個類型通常與for..in組合使用。
5. 正確答案 A
集合類型和字典類型最外側都用{}表示,不同在於,集合類型元素是普通元素,字典類型元素是鍵值對。
字典在程序設計中非常常用,因此,直接采用{}默認生成一個空字典。
6. 正確答案 C
ls.append(x),如果x是一個列表,則該列表作為一個元素增加的ls中。
7. 正確答案 D
鍵是值的序號,也是字典中值的索引方式。
因此,x in d 中的x被當作d中的序號進行判斷。
8. 正確答案 A
注意:s.index(x)返回第一次出現x的序號,並不返回全部序號。
9. 正確答案 A
注意一下:字典無序、元組可以為字典的鍵(因為是固定數據類型)、列表不可以作為字典的鍵(因為可變)
10. 正確答案 D
從1到4以2為步長輸出。注意列表第一個元素序號為0
11. 正確答案 7
Python find() 方法檢測字符串中是否包含子字符串 str ,如果指定 beg(開始) 和 end(結束) 范圍,則檢查是否包含在指定范圍內,如果包含子字符串返回開始的索引值,否則返回-1。題干里的5是從五開始 這題只要從7以前的數開始都返回7
12. 正確答案 A
編程題1.
w = set(input())
answer = 0
for i in w:
answer += int(i)
print(answer)
編程題2.
counts={}
s = s.split()
for word in s:
counts[word] = counts.get(word,0)+1
cc = list(counts.items())
cc.sort(key=lambda x : x[1],reverse=True)
maxname,count = cc[0]
print(maxname)
最后一點點文件相關的知識點
(真的有人會看到這兒嘛 如果你看到這兒了,我保你……python肯定有分兒23333)
1. python能夠以文本和二進制兩種方式處理文件
2. 文件可以包含任何數據內容
3. 文本文件和二進制文件的區別
4.文件的打開 open()函數
格式:<變量名> = open(<文件名>,<打開模式>)
注:文件名可以是文件的實際名字,也可以是包含完整路徑的名字
5.文件的打開模式
其中 r w x a可以和b t +組合使用
文件使用結束后用<變量名>.close()方法關閉
6.文件的讀寫
注意一下后兩個的區別
over!!!!!!!!!
到這里13216個字兒(就這個4-6一個文檔) 哭了
看完的小朋友我分給你我出門撿到1角錢的好運祝你python高分過!