Python語言程式設計(北京理工大學MOOC)1-5周
第一週
溫度轉換源程式:
#TempConvert.py TempStr = input("請輸入帶有符號的溫度值:") if TempStr[0] in ['C','c']: F = 1.8*eval(TempStr[1:-1])+32 print('轉換後的溫度值為F{:.2f}'.format(F)) elif TempStr[0] in ['F','f']: C = (eval(TempStr[1:-1])-32)/1.8 print('轉換後的溫度值為C{:.2f}'.format(C)) else: print('輸入格式錯誤')
- eval(): 去掉引數最外側引號並執行餘下語句的函式
eval(“1”)
1
eval(“1+2”)
3
eval(‘“1+2”’)
‘1+2’
eval(‘print(“hello”)’)
hello
-
字串序號問題及應用
字串存在以下兩種序號標號方式。
TempStr = “0123456789”
字串可以進行檢索、切片
檢索:TempStr[1]表示字串第二個元素即1
切片:TempStr[1:-1]表示的是去除第一個元素剩下的部分。即TempStr = “123456789”
帶步長的切片:TempStr[1:-1:2],以步長為2進行切片。即TempStr = “13579”
巧妙切片應用 -
字串表示問題
單引號、 雙引號、 三引號都可以用來表示字串。
單引號用於處理字串中包含雙引號情況;
雙引號用於處理字串中包含單引號情況;
三引號用於處理字元串同時包含單雙、雙引號情況;也可以用來註釋多行程式碼。
當然也可以不用這樣做,使用轉義符\,也可以。 -
字串部分內建函式
- 字串格式化 str.format()
主要是理解槽的概念及使用方法,最常見的 str.format() 格式化數字的方法:
print("{:.2f}".format(3.1415926));
3.14
還可以進行資料的強制轉換,轉換成相應的二進位制八進位制十六進位制等。可以看手冊,視訊講解在3.3節倒數第二個視訊。
第二週
蟒蛇圖形繪製源程式:
import turtle
#寬,高,起始橫座標,起始縱座標,最小單位是畫素點
turtle.setup(650, 350, 200, 200)
turtle.penup()# 畫筆擡起
turtle.forward(-250)# 朝著目前方向直線前進,右邊為正
turtle.pendown()# 畫筆落下
turtle.pensize(25)#畫筆寬度
turtle.pencolor("purple")# 畫筆顏色,小寫字串,也可以用RGB的三個數值,
turtle.seth(-40)# seth()改變海龜行駛方向,但只改變行駛方向不行進
for i in range(4):
turtle.circle(40, 80)#做曲線,第一個引數預設圓心在海龜左側R距離的位置,第二個引數是角度預設360,正負代表方向,
turtle.circle(-40, 80)
turtle.circle(40, 80/2)
turtle.forward(40)
turtle.circle(16, 180)
turtle.forward(40*2/3)
turtle.done()# 將程式執行設計為需手動退出
-
庫引用 及 import
import<庫名>
<庫名>.<函式名>(<函式引數>)
也可以使用** from <庫名>import * **,但是不推薦,當庫多了的時候容易混淆且容易重名。如果嫌每次打庫名麻煩,可以使用:
import<庫名>as<庫別名>
<庫別名>.<函式名>(<函式引數>)
庫別名可以簡單用幾個縮寫代替。
2.turtle部分內建函式
1)turtle.pensize():設定線條的粗細;
2)turtle.speed():設定繪製的速度,1-10,1最慢,10最快;
3)turtle.begin_fill():準備開始填充圖形;
4)turtle.circle(50,steps=3):circle函式在之前用到過,是畫一個半徑為radius的圓,這裡是擴充套件,steps表示在半徑為50的圓內的內建steps多邊形;
5)turtle.end_fill():填充完成;
6)turtle.write(s,font=(“font-name”,font_size,”font_type”)):寫文字,s為文字內容,font是字型的引數,裡面分別為字型名稱,大小和型別;
7)turtle.hideturtle():隱藏箭頭顯示;
8)turtle.backward(d):與forward()函式對應,這裡是從尾部繪製線條和箭頭到頭部;
9)turtle.left(angle):逆時針轉動箭頭方向;
10)turtle.undo():撤銷上一個turtle動作;
11)turtle.screensize(w,h):設定turtle視窗的長和寬;
12)turtle.clear():清空turtle視窗,但是turtle的位置和狀態不會改變;
13)turtle.reset():清空視窗,重置turtle狀態為起始狀態;
14)turtle.showturtle():與hideturtle()函式對應; -
for <變數> in range(<函式名>):
**range():**產生迴圈序列
**range(N):**產生0到N-1的證書序列,共N個
**range(M,N):**產生M到N-1的證書序列,共N-M個
range(5)
0,1,2,3,4
range(2.5)
2,3,4
最常用的還是和*for i in range(N):**一起構成迴圈語句,實際上就是在給i不停的賦值達到控制迴圈次數的目的。
第三週
天天向上的力量源程式:
def dayup(df):
day_value = 1
for i in range(365):
if i % 7 in [6, 0]:
day_value = day_value * (1 - daydown_factor)
else:
day_value = day_value * (1 + dayup_factor)
return day_value
daydown_factor = 0.01
dayup_factor = 0.01
while dayup(dayup_factor) < 37.78:
dayup_factor = dayup_factor + 0.001
print("工作日需要努力的引數是{:.3f}".format(dayup_factor))
涉及了一個函式呼叫,不做過多解釋,與視訊程式相比優化了一下變數方便修改。
進度條源程式:
import time# 匯入time庫
scale = 100# 設定範圍
print("執行開始".center(scale//2,"-"))# 執行開始標題,用center建立兩側符號
useing_time = time.perf_counter()# perf_counter()#用於獲取當前值
for i in range(101):
a = '*' * i
b = '-' * (scale-i)
c = (i/scale) * 100# 百分比
useing_time = time.perf_counter() - useing_time# perf_counter()#再次獲取當前值並做差獲得程式執行時間
print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c, a, b, useing_time), end=" ")
time.sleep(0.1)#休眠0.1s,以免過程太快無法觀察。
print("\n"+"執行結束".center(scale//2,"-"))# 由於之前游標回到開頭且沒有換行,因此加換行符避免覆蓋
- time庫的使用 . 獲取當前系統時間的方法
ctime()函式獲取當前時間並以易讀方式表示,返回字串
time.ctime()
‘Fri Jan 26 12:11:16 2018’
另外一種獲得時間(格式化)的方法是使用**strftime(tpl,ts)**函式進行表示。相關格式化方法可以查手冊或者看視訊3.4第三個視訊。
- 程式計時
第四周
BMI源程式:
while True :
height, weight = eval(input("請輸入身高(米),體重(千克):"))
BMI = weight / pow(height, 2)
print("BMI值為{:.2f}".format(BMI))
if BMI < 18.5:
International_Bmi, national_Bmi = "偏瘦", "偏瘦"
elif 18.5 < BMI < 24:
International_Bmi, national_Bmi = "正常", "正常"
elif 24 < BMI < 25:
International_Bmi, national_Bmi = "正常", "偏胖"
elif 25 < BMI < 28:
International_Bmi, national_Bmi = "偏胖", "偏胖"
elif 28 < BMI < 30:
International_Bmi, national_Bmi = "偏胖", "肥胖"
elif 30 < BMI:
International_Bmi, national_Bmi = "肥胖", "肥胖"
print("國際BMI值分類為{},國內BMI值分類為{}".format(International_Bmi, national_Bmi))
程式與視訊中稍作修改,能夠反覆輸入資料不用重複手動執行。
- random庫
random是使用隨機數的Python標準庫,主要用於生產隨機數。
用法:import random
隨機數的產生是由種子唯一確定的,因此只要是每次seed一樣,那麼產生的隨機數也是一樣的。因此也可以稱其為偽隨機數。如果不指定種子,那麼種子預設是系統時間(精確到微妙),因此呼叫random函式時產生的隨機數就不一樣。
那什麼時候需要指定種子?
當你的程式需要復現上次隨機資料產生的結果的時候需要指定種子。
例子如下:
- 其他隨機擴充套件函式
求取π值(蒙特卡洛法)源程式
import time
import random
Draft = 2000 * 2000
star = time.perf_counter()
Hit = 0
for i in range (Draft):
Dot_X, Dot_Y = random.random(),random.random(),
if pow(Dot_X*Dot_X + Dot_Y*Dot_Y,0.5) < 1:
Hit = Hit + 1
pi = 4*(Hit/Draft)
print("π值為{:.16f}".format(pi))
print("程式所花費時間為{:.2f}".format(time.perf_counter()-star))
呼叫了time庫和random庫,time庫可以省略。
蒙特卡洛方法我覺得就是老師講的幾何法,通過不斷的往正方形裡面撒點,最後統計到原點距離小於1的點有多少個來逼近π值,點越多精度越高,這一點可以通過修改Draft的值來確定(不能太大,不然機器跑不出來)。
第五週
七段數碼管源程式(顯示系統時間)
import time
import turtle
def draw_gap():
turtle.up()
turtle.fd(5)
# line作為引數判斷這一條線是否需要畫下
def draw_line(line):
turtle.down() if line else turtle.up()
turtle.fd(50) # 前進或者畫50
draw_gap()
turtle.right(90)# 轉向90
# 畫一個數碼管,dight是數字引數
def draw_dight(dight):
draw_line(True) if dight in [2, 3, 4, 5, 6, 8, 9] else draw_line(False)
draw_line(True) if dight in [0, 1, 3, 4, 5, 6, 7, 8, 9] else draw_line(False)
draw_line(True) if dight in [0, 2, 3, 5, 6, 8, 9] else draw_line(False)
draw_line(True) if dight in [0, 2, 6, 8] else draw_line(False)
turtle.left(90) # 此處畫筆要直行,但是draw_line函式最後右轉,故在此進行左轉
draw_line(True) if dight in [0, 4, 5, 6, 8, 9] else draw_line(False)
draw_line(True) if dight in [0, 2, 3, 5, 7, 6, 8, 9] else draw_line(False)
draw_line(True) if dight in [0, 1, 2, 3, 4, 7, 8, 9] else draw_line(False)
turtle.left(180)# 準備畫第二個數碼管了
turtle.up()
turtle.fd(20)
# 獲得要顯示的數字
def draw_data(data):#data 為日期格式,格式為'%y - %m = %d + '
for i in data:
if i == '-':
turtle.pencolor("red")
turtle.write('年', font=("Arial", 40, "normal"))
turtle.fd(20)
elif i == '=':
turtle.pencolor("green")
turtle.write('月', font=("Arial", 40, "normal"))
turtle.fd(20)
elif i == '+':
turtle.pencolor("blue")
turtle.write('日', font=("Arial", 40, "normal"))
turtle.fd(20)
else:
turtle.pencolor("purple")
draw_dight(eval(i))
# 主函式,定義turtle的相關引數
def main():
turtle.setup(800, 350, 200, 200)
turtle.pensize(5)
turtle.pencolor("purple")
turtle.up()
turtle.fd(-300)
draw_data(time.strftime('%y-%m=%d+', time.gmtime()))# 獲得系統時間,格式化中不能存在空格,因為你沒有定義空格該怎麼辦
turtle.hideturtle()
turtle.done()
main()
- 全域性變數與區域性變數 使用規則
- 基本資料型別,無論是否充滿,區域性變數都與全域性變數不同
- 可以 通過global保留字在函式內部宣告該變數是全域性變數
- 組合數字型別(列表,元祖?)如果區域性變數為真實建立(不建立,只修改),則任然是全域性變數。
- lambda函式
<函式名> = lambda<引數>:<表示式>
f= lambda x, y : x + y
f(10,15)
25
lambda函式的返回值就是其函式名,lambda函式主要用作一些特定的函式或者方法的引數,有一定的固定使用方式,一般情況下建議使用def定義的普通函式。
- pyinstaller打包
簡單總結PyInstaller使用方法:
生成單一的exe檔案:pyinstaller -F test.py(最常用的一種)
新增必要的搜尋路徑:pyinstaller -F -p
新增必要的搜尋路徑,且帶圖示:pyinstaller -F -p
只用在cmd命令欄中鍵入pyinstaller -F test.py,注意打包檔案的地址目錄就行了。打包之後能在未安裝Python環境的機器上執行。
如果希望將生成的檔案的圖示也改成自己喜歡的圖示,則需要用在cmd命令欄中鍵入
pyinstaller -i <圖示檔名.ico>-F <原始碼檔名.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)
def main():
turtle.setup(800, 800, 200, 200)
turtle.pensize(2)
turtle.pencolor("blue")
turtle.up()
turtle.goto(-300,100)
turtle.down()
level = 3
koch(400,level)
turtle.right(120)
koch(400,level)
turtle.right(120)
koch(400,level)
turtle.right(120)
turtle.hideturtle()
turtle.done()
main()
這一週最最重要的就是遞迴的思想
遞迴=函式 + 分支語句
- 遞迴本身是一個函式,需要函式定義方式進行描述
- 函式內部,採用分支語句對輸入引數進行判斷,再加以處理
- 找到基例和鏈條,分別編寫對應程式碼
def <函式名>(引數,引數):
if 基例情況:
基例的處理
else:#鏈條
鏈條的處理,找到n與n-1之間的關係,遞迴呼叫函式