5.1函數(shù)的定義與使用
函數(shù)是一段代碼的表示
- 函數(shù)是一段具有特定功能的大年、可重用的語(yǔ)句組
- 函數(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)過(guò)調(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ù)的調(diào)用過(guò)程
函數(shù)的參數(shù)傳遞
函數(shù)可以有參數(shù)释液,也可以沒(méi)有全释,但必須保留括號(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保留字用來(lái)傳遞返回值
- 函數(shù)可以有返回值妄迁,也可以沒(méi)有,可以有return李命,也可以沒(méi)有
- 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ù)類型,無(wú)論是否重名阔籽,局部變量與全局變量不同
- 可以通過(guò)global保留字在函數(shù)內(nèi)部聲明全局變量
- 組合數(shù)據(jù)類型辩撑,如果局部變量未真實(shí)創(chuàng)建,則是全局變量
lambda函數(shù)
lambda函數(shù)返回函數(shù)名作為結(jié)果
- lambda函數(shù)是一種匿名函數(shù)仿耽,即沒(méi)有名字的函數(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來(lái)決定如何繪制對(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庫(kù)獲得系統(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)用問(wèn)題的擴(kuò)展:
- 模塊化思維:確定模塊接口完残,封裝功能
- 規(guī)則化思維:抽象過(guò)程為規(guī)則,計(jì)算機(jī)自動(dòng)執(zhí)行
- 化繁為簡(jiǎn):將大公能變?yōu)樾」δ芙M合横漏,分而治之
應(yīng)用問(wèn)題的擴(kuò)展: - 繪制帶小數(shù)點(diǎn)的七段數(shù)碼管
- 帶刷新的時(shí)間倒計(jì)時(shí)效果
- 繪制高級(jí)的數(shù)碼管
5.3代碼復(fù)用與函數(shù)遞歸
代碼復(fù)用與模塊化設(shè)計(jì)
代碼復(fù)用
把代碼當(dāng)成資源進(jìn)行抽象:
- 代碼資源化:程序代碼是一種用來(lái)表達(dá)計(jì)算的“資源”
- 代碼抽象化:使用函數(shù)等方法對(duì)代碼賦予更高級(jí)別的定義
-
代碼復(fù)用:同一份代碼在需要時(shí)可以被重復(fù)使用
函數(shù)是對(duì)對(duì)象的抽象
模塊化設(shè)計(jì)
分而治之
- 通過(guò)函數(shù)或?qū)ο蠓庋b將程序劃分為模塊及模塊間的表達(dá)
- 具體包括:主程序谨设、子程序和子程序間關(guān)系
- 分而治之:一種分而治之、分層抽象缎浇、體系化的設(shè)計(jì)思想
兩個(gè)概念:緊耦合扎拣、松耦合 - 緊耦合:兩個(gè)部分之間交流很多,無(wú)法獨(dú)立存在
- 松耦合:兩個(gè)部分之間交流較少素跺,可以獨(dú)立存在
- 模塊內(nèi)部緊耦合二蓝、模塊之間松耦合
函數(shù)遞歸的理解
兩關(guān)鍵特征
- 鏈條:計(jì)算過(guò)程存在遞歸鏈條
-
基例:存在一個(gè)或多個(gè)不需要再次遞歸的基例
類似數(shù)學(xué)歸納法
實(shí)現(xiàn)n!遞歸函數(shù):
def fact(n):
if n==0:
return 1
else:
return n*fact(n-1)
函數(shù)遞歸的調(diào)用過(guò)程
遞歸實(shí)現(xiàn):
- 遞歸本身是一個(gè)函數(shù)指厌,需要函數(shù)定義方式描述
- 函數(shù)內(nèi)部刊愚,采用分支語(yǔ)句對(duì)參數(shù)進(jìn)行判斷
- 基例和鏈條,分別編寫(xiě)對(duì)應(yīng)代碼
遞歸的調(diào)用過(guò)程:
遞歸函數(shù)調(diào)用
函數(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)典的問(wèn)題:漢諾塔問(wèn)題
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ò)程只關(guān)心遞歸鏈條仑乌。步驟:將n-1個(gè)圓盤(pán)先從A柱子搬到中間柱子百拓,再將A柱子剩余最后一個(gè)柱子搬運(yùn)到最后一個(gè)柱子琴锭,最后將中間柱子的n-1個(gè)圓盤(pán)搬運(yùn)到最后一個(gè)柱子)
5.4 模塊4:PyInstaller庫(kù)基本介紹
pyInstaller庫(kù)基本介紹
將.py源代碼轉(zhuǎn)換成無(wú)需源代碼的可執(zhí)行文件
PyInstaller庫(kù)是第三方庫(kù)
- 官方網(wǎng)站:http://www.pyinstaller.org
- 第三方庫(kù):使用前需要安裝額外安裝
- 安裝第三方庫(kù)需要使用pip工具
PyInstaller使用說(shuō)明
參數(shù) | 描述 |
---|---|
-h | 查看幫助 |
--clean | 清理打包過(guò)程中的臨時(shí)文件 |
-D,--onedir | 默認(rèn)值,生成dist文件夾 |
-F,--onefile | 在dist文件夾中只生成獨(dú)立的打包文件 |
-i<圖標(biāo)文件名.ico> | 指定打包程序使用的圖標(biāo)icon)文件 |
5.5科赫雪花小包裹
實(shí)例講解(上)
繪制過(guò)程:將一條直線切分成三段衙传,去掉中間一段决帖,然后讓中間繪制一個(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ǔ)框架圖形