1. 程式人生 > >Python語言程式設計(北京理工大學MOOC)1-5周

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('輸入格式錯誤')
  1. eval(): 去掉引數最外側引號並執行餘下語句的函式

eval(“1”)
1
eval(“1+2”)
3
eval(‘“1+2”’)
‘1+2’
eval(‘print(“hello”)’)
hello

  1. 字串序號問題及應用
    字串存在以下兩種序號標號方式。

    TempStr = “0123456789”
    字串可以進行檢索、切片
    檢索:TempStr[1]表示字串第二個元素即1
    切片:TempStr[1:-1]表示的是去除第一個元素剩下的部分。即TempStr = “123456789”
    帶步長的切片:TempStr[1:-1:2],以步長為2進行切片。即TempStr = “13579”
    巧妙切片應用

    :倒序字串元素:TempStr[::-1],結果即:TempStr = “9876543210”

  2. 字串表示問題
    單引號、 雙引號、 三引號都可以用來表示字串。
    單引號用於處理字串中包含雙引號情況;
    雙引號用於處理字串中包含單引號情況;
    三引號用於處理字元串同時包含單雙、雙引號情況;也可以用來註釋多行程式碼。
    當然也可以不用這樣做,使用轉義符\,也可以。

  3. 字串部分內建函式
    在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述

  1. 字串格式化 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()# 將程式執行設計為需手動退出

  1. 庫引用 及 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()函式對應;

  2. 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,"-"))# 由於之前游標回到開頭且沒有換行,因此加換行符避免覆蓋

  1. time庫的使用 . 獲取當前系統時間的方法
    ctime()函式獲取當前時間並以易讀方式表示,返回字串

time.ctime()
‘Fri Jan 26 12:11:16 2018’

另外一種獲得時間(格式化)的方法是使用**strftime(tpl,ts)**函式進行表示。相關格式化方法可以查手冊或者看視訊3.4第三個視訊。
在這裡插入圖片描述

  1. 程式計時
    在這裡插入圖片描述
    在這裡插入圖片描述

第四周

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))

程式與視訊中稍作修改,能夠反覆輸入資料不用重複手動執行。

  1. random庫
    random是使用隨機數的Python標準庫,主要用於生產隨機數。
    用法:import random
    在這裡插入圖片描述
    隨機數的產生是由種子唯一確定的,因此只要是每次seed一樣,那麼產生的隨機數也是一樣的。因此也可以稱其為偽隨機數。如果不指定種子,那麼種子預設是系統時間(精確到微妙),因此呼叫random函式時產生的隨機數就不一樣。
    那什麼時候需要指定種子?
    當你的程式需要復現上次隨機資料產生的結果的時候需要指定種子。

例子如下:
在這裡插入圖片描述

  1. 其他隨機擴充套件函式
    在這裡插入圖片描述
    Python浮點數是小數點後16位
    在這裡插入圖片描述
    求取π值(蒙特卡洛法)源程式
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()


  1. 全域性變數與區域性變數 使用規則
  • 基本資料型別,無論是否充滿,區域性變數都與全域性變數不同
  • 可以 通過global保留字在函式內部宣告該變數是全域性變數
  • 組合數字型別(列表,元祖?)如果區域性變數為真實建立(不建立,只修改),則任然是全域性變數。
  1. lambda函式
    <函式名> = lambda<引數>:<表示式>

f= lambda x, y : x + y
f(10,15)
25

lambda函式的返回值就是其函式名,lambda函式主要用作一些特定的函式或者方法的引數,有一定的固定使用方式,一般情況下建議使用def定義的普通函式。

  1. 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之間的關係,遞迴呼叫函式