文章原創(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()


