第5周函數(shù)和代碼復用-Python語言程序設(shè)計(學習筆記)

文章原創(chuàng),最近更新:2018-04-19

1.輔學內(nèi)容
2.函數(shù)的定義與使用
3.實例7:七段數(shù)碼管繪制
4.4.代碼復用與函數(shù)遞歸
5.模塊4:PyInstaller庫的使用
6.實例8:科赫雪花小包裹
7.所有的代碼匯總
原鏈接 語言程序設(shè)計北京理工大學

1.輔學內(nèi)容

1.1前課復習

1.2本課概要

1.3練習與作業(yè)

2.函數(shù)的定義與使用

2.1單元開篇

2.2函數(shù)的理解和定義

2.3函數(shù)的使用及調(diào)用過程

2.4函數(shù)的參數(shù)傳遞

2.5函數(shù)的返回值

2.6局部變量和全局變量

2.7lambda函數(shù)

2.8單元小結(jié)

3.實例7:七段數(shù)碼管繪制

3.1"七段數(shù)碼管繪制"問題分析

3.2"七段數(shù)碼管繪制"實例講解(上)

  • drawLine()函數(shù)決定了自定義函數(shù)是否,畫筆落下還是飛過.如果是落下(True),則向前走40,然后向右轉(zhuǎn).如果是飛過去(False),只是無痕跡,但會向右轉(zhuǎn)40.
    True顯示的結(jié)果:



    False顯示的結(jié)果:


  • drawDigit()函數(shù)分析


a、一個數(shù)字可以分別拆分為7段劃線,分別為1、2、3、4、5、6、7段劃線。以下所有的數(shù)字均按1-7段劃線的順序進行畫圖,比如0由2、3、4、5、6、7段劃線組成。



b、第一段數(shù)字
drawLine(True) if digit in [2,3,4,5,6,7,8,9] else drawLine(False),是第1段劃線,通過以上截圖,可以觀察得出0-9與之相關(guān)的數(shù)字有2,3,4,5,6,7,8,9。
drawLine(True) if digit in [0,1,3,4,5,6,7,8,9] else drawLine(False) ,是第2段,通過以上截圖,可以觀察得出0-9與之相關(guān)的數(shù)字有0,1,3,4,5,6,7,8,9。
drawLine(True) if digit in [0,2,3,5,6,8,9] else drawLine(False),是第3段,通過以上截圖,可以觀察得出0-9與之相關(guān)的數(shù)字有0,2,3,5,6,8,9。
drawLine(True) if digit in [0,2,6,8] else drawLine(False),是第4段,通過以上截圖,可以觀察得出0-9與之相關(guān)的數(shù)字有0,2,6,8。
turtle.left(90)
drawLine(True) if digit in [0,4,5,6,8,9] else drawLine(False),是第5段,通過以上截圖,可以觀察得出0-9與之相關(guān)的數(shù)字有0,4,5,6,8,9。
drawLine(True) if digit in [0,2,3,5,6,7,8,9] else drawLine(False),是第6段,通過以上截圖,可以觀察得出0-9與之相關(guān)的數(shù)字有0,2,3,5,6,7,8,9。
drawLine(True) if digit in [0,1,2,3,4,7,8,9] else drawLine(False),是第6段,通過以上截圖,可以觀察得出0-9與之相關(guān)的數(shù)字有0,1,2,3,4,7,8,9。
turtle.left(180),是逆時針旋轉(zhuǎn)180.旋轉(zhuǎn)之前是箭頭在1段與2段的交界點,箭頭方向是指向起點.
turtle.penup()
turtle.fd(20)

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

def main():
    turtle.setup(800,350,200,200)
    turtle.penup()
    turtle.fd(-300)
    turtle.pensize(5)
    drawDate("20181010")
    turtle.hideturtle()
    turtle.done()
    
main()

3.2"七段數(shù)碼管繪制"實例講解(下)

import turtle
import time
def drawGap():
    turtle.penup()
    turtle.fd(5)    
def drawLine(draw):
    drawGap()
    turtle.pendown() if draw else turtle.penup()
    turtle.fd(40)
    drawGap()
    turtle.right(90)

def drawDigit(digit):
    drawLine(True) if digit in [2,3,4,5,6,7,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):
    turtle.pencolor("red")
    for i in date:
        if i =="-":
            turtle.write("年",font=("Arial",18,"normal"))
            turtle.pencolor("green")
            turtle.fd(40)
        elif i =="=":
            turtle.write("月",font=("Arial",18,"normal"))
            turtle.pencolor("blue")
            turtle.fd(40)
        elif i =="+":
            turtle.write("日",font=("Arial",18,"normal"))
        else:
            drawDigit(eval(i))

def main():
    turtle.setup(800,350,200,200)
    turtle.penup()
    turtle.fd(-300)
    turtle.pensize(5)
    drawDate(time.strftime("%Y-%m=%d+",time.gmtime()))
    turtle.hideturtle()
    turtle.done()
 
    
main()

3.3"七段數(shù)碼管繪制"舉一反三

4.代碼復用與函數(shù)遞歸

4.1單元開篇

4.2代碼復用與模塊化設(shè)計

4.3函數(shù)遞歸的理解

4.4函數(shù)遞歸的調(diào)用過程

4.5函數(shù)遞歸實例解析


第一個參數(shù)n個圓盤移動的數(shù)量,第二個參數(shù)是原柱子,第三個參數(shù)是目的柱子,第四個參數(shù)是中間柱子.假設(shè)的過程n個圓盤從A柱子的圓盤全部搬到C柱子.
步驟理解:
步驟一:n個圓盤上的n-1個圓盤,先從A搬到B,對于A而言.
步驟二:就剩下最后一個圓盤,將最后一個圓盤直接搬到C.
步驟三:再將B柱子的n-1個圓盤,全部挪到C柱子上,這樣就實現(xiàn)了A柱子向C柱子的搬運過程.


我們可以看到,第一個T(2,A,C,B)就是在執(zhí)行第一步操作,T(1,A,B,C)就是在執(zhí)行第二步操作,T(2,B,A,C)就是在執(zhí)行第三步操作。
即便是N大于3,也可以用這個圖的架構(gòu)來解釋,只不過是分支多了而已。

如果你細心,你會發(fā)現(xiàn),當我們把最大的那塊移動到C后,我們就可以當它不存在了,也就是我們需要移動的只是中間的n-1個,這樣總數(shù)量就少了一個,然后繼續(xù)進行操作,把他們除了最后一塊其他全部重新全都移動到A(第一步),最后一塊移動到C(第二步),這樣就又少了一個,我們需要移動的只剩下n-2個。如此循環(huán)。

如果你還是無法理解,建議看多幾次上圖。

4.6單元小結(jié)

5.模塊4:PyInstaller庫的使用

5.1PyInstaller庫基本介紹


用可執(zhí)行文件的方式執(zhí)行一段程序.而不是直接用源代碼.


5.1PyInstaller庫使用說明


_pycache/build這兩個文件可以安全的刪除,dist文件打開,就可以看到與文件同名的exe文件.這個文件就是打包之后生成的文件.用鼠標雙擊這個exe文件可以執(zhí)行這個文件的功能.



建議不要使用-D,--onedir,默認值,生成dist文件夾
而使用-F,--onefile,在dist文件夾中只生成獨立的打包文件.
-i<圖標文件名.ico>指定打包程序使用的圖標(icon)文件,是更改打包程序的圖標.

6.實例8:科赫雪花小包裹

6.1"科赫雪花小包裹"問題分析

6.2"科赫雪花小包裹"實例講解(上)

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,500)
    turtle.penup()
    turtle.goto(-300,-50)
    turtle.pendown()    
    turtle.pensize(2)
    koch(600,3)
    turtle.hideturtle()
    turtle.done()
 
    
main()

6.3"科赫雪花小包裹"實例講解(下)


打包方法:
1、準備條件
1)py文件,比如我使用的文件名稱為了簡單點命名為11.py
2)ico格式的圖片,比如我使用的圖片名稱為了簡單點命名為xuehua.ico
3)放在當前的目錄下,比如我的cmd當前的目錄是在Administrator文件夾.所以我將1)、2)放在Administrator文件夾。
2、方法
在cmd環(huán)境中輸入:
pyinstaller -i xuehua.ico -F 11.py


打包成功后會顯示completed successfully.

在Administrator文件夾打開dist文件,則exe是我們所要求打包好的文件.

將其他產(chǎn)生的文件夾如pycache、build進行刪除。

6.4"科赫雪花小包裹"舉一反三

7.所有的代碼匯總

七段數(shù)碼管版本一

#SevenDigitsDrawV1.py
import turtle
def drawLine(draw):   #繪制單段數(shù)碼管
    turtle.pendown() if draw else turtle.penup()
    turtle.fd(40)
    turtle.right(90)
def drawDigit(digit): #根據(jù)數(shù)字繪制七段數(shù)碼管
    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):  #獲得要輸出的數(shù)字
    for i in date:
        drawDigit(eval(i))  #通過eval()函數(shù)將數(shù)字變?yōu)檎麛?shù)
def main():
    turtle.setup(800, 350, 200, 200)
    turtle.penup()
    turtle.fd(-300)
    turtle.pensize(5)
    drawDate('20181010')
    turtle.hideturtle()
    turtle.done()
main()

七段數(shù)碼管版本二

#SevenDigitsDrawV2.py
import turtle, time
def drawGap(): #繪制數(shù)碼管間隔
    turtle.penup()
    turtle.fd(5)
def drawLine(draw):   #繪制單段數(shù)碼管
    drawGap()
    turtle.pendown() if draw else turtle.penup()
    turtle.fd(40)
    drawGap()
    turtle.right(90)
def drawDigit(d): #根據(jù)數(shù)字繪制七段數(shù)碼管
    drawLine(True) if d in [2,3,4,5,6,8,9] else drawLine(False)
    drawLine(True) if d in [0,1,3,4,5,6,7,8,9] else drawLine(False)
    drawLine(True) if d in [0,2,3,5,6,8,9] else drawLine(False)
    drawLine(True) if d in [0,2,6,8] else drawLine(False)
    turtle.left(90)
    drawLine(True) if d in [0,4,5,6,8,9] else drawLine(False)
    drawLine(True) if d in [0,2,3,5,6,7,8,9] else drawLine(False)
    drawLine(True) if d in [0,1,2,3,4,7,8,9] else drawLine(False)
    turtle.left(180)
    turtle.penup()
    turtle.fd(20)
def drawDate(date):
    turtle.pencolor("red")
    for i in date:
        if i == '-':
            turtle.write('年',font=("Arial", 18, "normal"))
            turtle.pencolor("green")
            turtle.fd(40)
        elif i == '=':
            turtle.write('月',font=("Arial", 18, "normal"))
            turtle.pencolor("blue")
            turtle.fd(40)
        elif i == '+':
            turtle.write('日',font=("Arial", 18, "normal"))
        else:
            drawDigit(eval(i))
def main():
    turtle.setup(800, 350, 200, 200)
    turtle.penup()
    turtle.fd(-350)
    turtle.pensize(5)
#    drawDate('2018-10=10+')
    drawDate(time.strftime('%Y-%m=%d+',time.gmtime()))
    turtle.hideturtle()
    turtle.done()
main()

科赫曲線繪制源代碼

#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)
def main():
    turtle.setup(800,400)
    turtle.penup()
    turtle.goto(-300, -50)
    turtle.pendown()
    turtle.pensize(2)
    koch(600,3)     # 0階科赫曲線長度,階數(shù)
    turtle.hideturtle()
main()

科赫雪花繪制源代碼

#KochDrawV2.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(600,600)
    turtle.penup()
    turtle.goto(-200, 100)
    turtle.pendown()
    turtle.pensize(2)
    level = 3      # 3階科赫雪花,階數(shù)
    koch(400,level)     
    turtle.right(120)
    koch(400,level)
    turtle.right(120)
    koch(400,level)
    turtle.hideturtle()
main()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容