5.1函數(shù)的定義與使用
函數(shù)是一段代碼的表示
函數(shù)是一段具有特定功能的驻襟、可重用的語句組
函數(shù)是一種功能的抽象震桶,一般函數(shù)表達(dá)特定功能
兩個(gè)作用:降低編程難度 和 代碼復(fù)用
def<函數(shù)名>(<參數(shù)(0個(gè)或多個(gè))>)
? ? <函數(shù)體>
? ? return<返回值>
案例:計(jì)算n煤辨!
def fact(n):
? ? s = 1
? ? for i in range(1,n+1)
? ? s* = i
? ? return s
y=f(x)
函數(shù)定義時(shí)袭异,所指定的參數(shù)是一種占位符
函數(shù)定義后珊豹,如果不經(jīng)過調(diào)用威创,不會(huì)被執(zhí)行
函數(shù)定義時(shí),參數(shù)是輸入析显、函數(shù)體是處理鲫咽、結(jié)果是輸出(IPO)
函數(shù)的調(diào)用
調(diào)用是運(yùn)行函數(shù)代碼的方式
調(diào)用時(shí)要給出實(shí)際參數(shù)
實(shí)際參數(shù)替換定義中的參數(shù)
函數(shù)調(diào)用后得到返回值
函數(shù)的參數(shù)傳遞
函數(shù)可以有參數(shù),也可以沒有谷异,但必須保留括號(hào)
def fact()
? ? ? print("我也是函數(shù)")
可選參數(shù)傳遞
函數(shù)定義時(shí)可以為某些參數(shù)指定默認(rèn)值分尸,構(gòu)成可選參數(shù)
def <函數(shù)名>(<非可選參數(shù)>,<可選參數(shù)>)
? ? ? <函數(shù)體>
? ? return <返回值>
(可選參數(shù)必須在非可選參數(shù)之后)
可變參數(shù)傳遞
函數(shù)定義時(shí)可以設(shè)計(jì)可變數(shù)量參數(shù),及不確定參數(shù)總數(shù)量
def <函數(shù)名>(<參數(shù)>,*b):
? ? ? <函數(shù)體>
? ? ? return<返回值>
函數(shù)調(diào)用時(shí)歹嘹,參數(shù)可以安裝位置或名稱方式傳遞 :
函數(shù)的返回值
return保留字用來傳遞返回值
函數(shù)可以有返回值箩绍,也可以沒有,可以有return尺上,也可以沒有
return可以傳遞0個(gè)返回值材蛛,也可以傳遞r任意多個(gè)返回值
局部變量和全局變量:
舉例
規(guī)則1:局部變量和全局變量是不同變量
局部變量是函數(shù)內(nèi)部的占位符,與全局變量可能重名但不同
函數(shù)運(yùn)算結(jié)束后怎抛,局部變量被釋放
可以使用global保留字在函數(shù)內(nèi)部使用全局變量
規(guī)則2:局部變量為組合數(shù)據(jù)類型且未創(chuàng)建卑吭,等同于全局變量
使用規(guī)則:
基本數(shù)據(jù)類型,無論是否重名马绝,局部變量與全局變量不同
可以通過global保留字在函數(shù)內(nèi)部聲明全局變量
組合數(shù)據(jù)類型豆赏,如果局部變量未真實(shí)創(chuàng)建,則是全局變量
lambda函數(shù)
lambda函數(shù)返回函數(shù)名作為結(jié)果
lambda函數(shù)是一種匿名函數(shù),即沒有名字的函數(shù)
使用lambda保留自定義掷邦,函數(shù)名是返回結(jié)果
lambda函數(shù)用于定義簡(jiǎn)單的白胀、能夠在一行內(nèi)表示的內(nèi)涵
<函數(shù)名> = lambda<參數(shù)>:<表達(dá)式>
等價(jià)于:
def<函數(shù)名>(<參數(shù)>):
? ? <函數(shù)體>
? ? return<返回值>
謹(jǐn)慎使用lambda函數(shù)
lambda函數(shù)主要作一些特定函數(shù)或方法的參數(shù)
lambda函數(shù)有一些固定使用方式,建議逐步掌握
一般情況耙饰,建議使用def定義的普通函數(shù)
5.2七段數(shù)碼管繪制
turtle繪圖體系==>七段數(shù)碼管繪制
實(shí)例講解(上)
步驟1:回執(zhí)單個(gè)數(shù)字對(duì)應(yīng)的數(shù)碼管
步驟2:獲得一串?dāng)?shù)字纹笼,繪制對(duì)應(yīng)的數(shù)碼管
步驟3:獲得當(dāng)前系統(tǒng)的時(shí)間,繪制對(duì)應(yīng)的數(shù)碼管
步驟1:繪制單個(gè)數(shù)碼管
七段數(shù)碼管由七個(gè)基本線條組成
七段數(shù)碼管可以有固定順序
不同數(shù)字顯示不同的線條
繪制一條線:
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)
調(diào)用函數(shù)DrawDigit:根據(jù)參數(shù)digit來決定如何繪制對(duì)應(yīng)的數(shù)字(是否繪制)DrawDate函數(shù):逐一解析字符串中的每一個(gè)字符苟跪,并且把每一個(gè)字符變成對(duì)應(yīng)的數(shù)字廷痘,去繪制七段數(shù)碼管
步驟2:獲取一段數(shù)字,繪制多個(gè)數(shù)碼管:
步驟2
實(shí)例講解(下)
步驟3:獲取當(dāng)前的系統(tǒng)時(shí)間件已,繪制對(duì)應(yīng)的數(shù)碼管
增加七段數(shù)碼管之間線條間隔
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)
...(略)
使用time庫獲得系統(tǒng)當(dāng)前時(shí)間
增加年月日
年月日顏色不同
import turtle,time
...(略)
def drawDate(date):? ? #date為日期笋额,格式為'%Y-%m=%d+'
? ? ? 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():
...(略)?
進(jìn)一步獲取當(dāng)前系統(tǒng)時(shí)間
import turtle,time
...(略)
def drawDate(date):
...(略)
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()
舉一反三
應(yīng)用問題的擴(kuò)展:
模塊化思維:確定模塊接口,封裝功能
規(guī)則化思維:抽象過程為規(guī)則篷扩,計(jì)算機(jī)自動(dòng)執(zhí)行
化繁為簡(jiǎn):將大公能變?yōu)樾」δ芙M合兄猩,分而治之
應(yīng)用問題的擴(kuò)展:
繪制帶小數(shù)點(diǎn)的七段數(shù)碼管
帶刷新的時(shí)間倒計(jì)時(shí)效果
繪制高級(jí)的數(shù)碼管
5.3代碼復(fù)用與函數(shù)遞歸
代碼復(fù)用與模塊化設(shè)計(jì)
代碼復(fù)用
把代碼當(dāng)成資源進(jìn)行抽象:
代碼資源化:程序代碼是一種用來表達(dá)計(jì)算的“資源”
代碼抽象化:使用函數(shù)等方法對(duì)代碼賦予更高級(jí)別的定義
代碼復(fù)用:同一份代碼在需要時(shí)可以被重復(fù)使用
模塊化設(shè)計(jì)
分而治之
通過函數(shù)或?qū)ο蠓庋b將程序劃分為模塊及模塊間的表達(dá)
具體包括:主程序、子程序和子程序間關(guān)系
分而治之:一種分而治之鉴未、分層抽象枢冤、體系化的設(shè)計(jì)思想
兩個(gè)概念:緊耦合、松耦合
緊耦合:兩個(gè)部分之間交流很多铜秆,無法獨(dú)立存在
松耦合:兩個(gè)部分之間交流較少淹真,可以獨(dú)立存在
模塊內(nèi)部緊耦合、模塊之間松耦合
函數(shù)遞歸的理解
兩關(guān)鍵特征
鏈條:計(jì)算過程存在遞歸鏈條
基例:存在一個(gè)或多個(gè)不需要再次遞歸的基例
實(shí)現(xiàn)n连茧!遞歸函數(shù):
def fact(n):
? ? if n==0:
? ? ? ? return 1
? ? else:
? ? ? ? return n*fact(n-1)
函數(shù)遞歸的調(diào)用過程
遞歸實(shí)現(xiàn):
遞歸本身是一個(gè)函數(shù)核蘸,需要函數(shù)定義方式描述
函數(shù)內(nèi)部,采用分支語句對(duì)參數(shù)進(jìn)行判斷
基例和鏈條啸驯,分別編寫對(duì)應(yīng)代碼
遞歸的調(diào)用規(guī)則
函數(shù)遞歸實(shí)例解析
將字符串s反轉(zhuǎn)后輸出>>>s[::-1]
函數(shù)+分支結(jié)構(gòu)
遞歸鏈條
遞歸基例
def rvs(s):? ? ? ? ?
? ? if s=="":
? ? ? ? return s? ? ?
? ? else:
? ? ? ? return rvs(s[1:]+s[0]
數(shù)學(xué)斐波那契數(shù)列
F(n)=F(n-1)+F(n-2)
def f(n)
? ? ? if n == 1 or n == 2
? ? ? ? ? ? return 1
? ? ? else:
? ? ? ? ? ? return f(n-1) + f(n-2)
最經(jīng)典的問題:漢諾塔問題
count = 0
def hanoi(n,src,dst,mid)
? ? global count
? ? if n == 1:
? ? ? ? print("{}:{}->{}".format(1,src,dst))
? ? ? ? count += 1
? ? else :
? ? ? ? hanoi(n-1,src,mid,dst)
? ? ? ? print("{}:{}->{}".format(n,src,dst))
? ? ? ? count += 1
? ? ? ? hanoi(n-1,mid,dst,src)
(遞歸過程只關(guān)心遞歸鏈條客扎。步驟:將n-1個(gè)圓盤先從A柱子搬到中間柱子,再將A柱子剩余最后一個(gè)柱子搬運(yùn)到最后一個(gè)柱子罚斗,最后將中間柱子的n-1個(gè)圓盤搬運(yùn)到最后一個(gè)柱子)
5.4 模塊4:PyInstaller庫基本介紹
pyInstaller庫基本介紹
將.py源代碼轉(zhuǎn)換成無需源代碼的可執(zhí)行文件
PyInstaller庫是第三方庫
官方網(wǎng)站:http://www.pyinstaller.org
第三方庫:使用前需要安裝額外安裝
安裝第三方庫需要使用pip工具
PyInstaller使用說明
參數(shù)
描述
-h
查看幫助
--clean
清理打包過程中的臨時(shí)文件
-D,--onedir
默認(rèn)值徙鱼,生成dist文件夾
-F,--onefile
在dist文件夾中只生成獨(dú)立的打包文件
-i<圖標(biāo)文件名.ico>
指定打包程序使用的圖標(biāo)icon)文件
5.5科赫雪花小包裹
實(shí)例講解(上)
繪制過程:將一條直線切分成三段,去掉中間一段针姿,然后讓中間繪制一個(gè)凸起的三角形
曲線繪制:利用遞歸和海龜繪圖體系
#KochDrawV1.py? ? ? # 定義函數(shù)
import turtle? ? ? ? ? ? ? ? ? ?
def koch(size, n):? ? ? # 參數(shù)size--長(zhǎng)度袱吆,n--階數(shù)
? ? if n == 0:
? ? ? ? turtle.fd(size)
? ? else:
? ? ? ? for angle in [0, 60, -120, 60]:? ? ? # 繪制第一個(gè)科赫曲線? ? ?
? ? ? ? ? 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階科赫曲線長(zhǎng)度,階數(shù)
? ? turtle.hideturtle()
main()
實(shí)例講解(下)
曲線==>雪花(雪花是由對(duì)三角形每一個(gè)邊進(jìn)行分形搓幌、繪制而形成的)
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()
舉一反三
修改分形幾何繪制階數(shù)
修改科赫曲線的基本定義及旋轉(zhuǎn)角度
修改繪制科赫雪花的基礎(chǔ)框架圖形