函數(shù)
4.1函數(shù)的定義與使用
4.1.1 函數(shù)的理解與定義
定義:函數(shù)是一段具有特定功能的提佣、可重用的語(yǔ)句組煤痕。
作用:降低編程難度、代碼復(fù)用
def <函數(shù)名> (<參數(shù)(零個(gè)或多個(gè))>):
<函數(shù)體>
return<返回值>
特點(diǎn):函數(shù)定義時(shí)困食,所指定參數(shù)為占位符碗脊,參數(shù)是輸入啼肩,參數(shù)體為處理,結(jié)果為輸出(IPO)
? 函數(shù)定義后衙伶,如果結(jié)果不經(jīng)調(diào)用祈坠,則不會(huì)執(zhí)行
實(shí)例:計(jì)算n!
def fact(n):
s=1
for i in range (1,n+1):
s*=i
return s
4.1.2 函數(shù)的使用及調(diào)用
定義:是運(yùn)行代碼的方式,調(diào)用時(shí)要給出實(shí)際參數(shù)痕支,用實(shí)際參數(shù)替換給定參數(shù)
方法:將 fact(X)帶入即可
4.1.3 函數(shù)的參數(shù)傳遞
特點(diǎn):無論函數(shù)是否具有參數(shù)颁虐,都必須有()
def fact():
print("...")
函數(shù)定義時(shí)可以為某些參數(shù)指定默認(rèn)值,構(gòu)成可選參數(shù)卧须。
def <函數(shù)名> (<非可選函數(shù)>,<可選函數(shù)>):
<函數(shù)體>
return<返回值>
實(shí)例:計(jì)算n!//m
def fact(n,m=1):
s=1
for i in range (1,n+1):
s*=i
return s//m
實(shí)例:計(jì)算n!乘數(shù)
def fact(n,*b):
s=1
for i in range (1,n+1):
s*=i
for item in b:
s*=item
return s
函數(shù)調(diào)用時(shí)參數(shù)可以按照位置或者名稱方式傳遞:
fact(m=5,n=10)或者fact(5,10)
4.1.4 函數(shù)返回值
定義:返回零個(gè)或者多個(gè)結(jié)果另绩,return保留字來傳遞返回值
特征:返回值可以有也可以無
return n//m,n,m
(10,5,3)
4.1.5局部變量及全局變量
局部變量:函數(shù)內(nèi)部的變量
全局變量:服務(wù)于整個(gè)函數(shù)的變量
特征:1.局部變量和全局變量是不同的兩種變量,局部變量是占位符花嘶,與全局變量可能重名但是不相同笋籽,運(yùn)算結(jié)束后,局部變量被釋放椭员,也可使用global保留字在函數(shù)中用全局變量车海。
? 2.局部變量為組合數(shù)據(jù)類型且未創(chuàng)建時(shí),等同于全局變量隘击。
局部變量實(shí)例:
n,s=10,100
def fact(n):
s=1
for i in range (1,n+1):
s*=i
return s
print(fact(n),s)
全局變量實(shí)例:
n,s=10,100
def fact(n):
global s
for i in range (1,n+1):
s*=i
return s
print(fact(n),s)
局部變量可以用作全局變量實(shí)例:
ls=["f","F"]
def func(a):
ls.append(a)
return
func("C")
print(ls)
4.1.6 lambda函數(shù)
定義:返回函數(shù)名作為一種結(jié)果侍芝,是一種匿名函數(shù),用于簡(jiǎn)單的埋同,用于一行表示的函數(shù)州叠。
<函數(shù)名>=lambda<函數(shù)參數(shù)>:<函數(shù)表達(dá)式>
f=lambda x, y : x+y
f(10,15)
用途:主要用作于特定或方法參數(shù),固定使用形式凶赁,建議一般用def定義咧栗。
4.2 七段數(shù)碼管繪制實(shí)例
4.2.1 繪制特定數(shù)字?jǐn)?shù)碼管
要求:首先繪制單個(gè)數(shù)字對(duì)應(yīng)的數(shù)碼管逆甜,然后獲得一串?dāng)?shù)字繪制響應(yīng)的數(shù)碼管
特征:由七個(gè)基本線條組成,七段數(shù)碼管可以由特定的順序致板,不同數(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ù)字繪制七段代碼管
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() #為繪制后續(xù)數(shù)字確定位置
turtle.fd(20)
def drawDate(date): #獲得需要輸出數(shù)字
for i in date:
drawDigit(eval(i))
def main():
turtle.setup(800,350,200,200)
turtle.penup()
turtle.fd(-300)
turtle.pensize(5)
drawDate('20200212')
turtle.hideturtle()
turtle.done()
main()
4.2.2 繪制當(dāng)前時(shí)間數(shù)字?jǐn)?shù)碼管
要求:使用time庫(kù)獲得當(dāng)前時(shí)間交煞,增加年月日標(biāo)記,年月日不同顏色
舉例:
#SevenDigitsDrawV2.py
import turtle,time
def drawGap():
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(digit): #根據(jù)數(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() #為繪制后續(xù)數(shù)字確定位置
turtle.fd(20)
def drawDate(date): #獲得需要輸出數(shù)字
for i in date:
if i =='-':
turtle.write('年',font=("Arial",30,"normal"))
turtle.pencolor("green")
turtle.fd(40)
elif i =='=':
turtle.write('月',font=("Arial",30,"normal"))
turtle.pencolor("blue")
turtle.fd(40)
elif i =='+':
turtle.write('日',font=("Arial",30,"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()
4.3 代碼復(fù)用與函數(shù)遞歸
4.3.1 代碼復(fù)用與模塊化設(shè)計(jì)
定義:將代碼當(dāng)做一種資源進(jìn)行抽象斟或,使用函數(shù)等方法對(duì)代碼賦予更高意義素征。
代碼復(fù)用:同一份代碼在需要時(shí)可以被重復(fù)使用
主要形式:函數(shù)、對(duì)象
函數(shù):將代碼命名缕粹,在代碼層面建立初步抽象稚茅。
對(duì)象:屬性及方法纸淮,<a>.<b>和<a>.<b>()在函數(shù)上再次組織抽象
模塊化設(shè)計(jì):分而治之平斩,通過函數(shù)或者對(duì)象封裝將程序劃分為模塊及之間的表達(dá)。
包括:主程序咽块、子程序绘面、子程序之間的關(guān)系
主程序:模塊之間的關(guān)系
子程序:模塊
特點(diǎn):分而治之的核心是模塊化思想,模塊化是分而治之侈沪、分層抽象揭璃、體系化的設(shè)計(jì)思想。
模塊化設(shè)計(jì)概念:緊耦合亭罪、松耦合
緊耦合:兩個(gè)部分之間交流很多瘦馍,無法獨(dú)立存在
松耦合:兩個(gè)部分之間交流很少,可以獨(dú)立存在
模塊內(nèi)部緊耦合应役,模塊之間松耦合
4.3.2 函數(shù)遞歸的理解
特征:鏈條情组、基例
鏈條:計(jì)算過程中的遞歸鏈條
基例:存在一個(gè)或多個(gè)不用再次遞歸的基例
4.3.3 遞歸的調(diào)用過程
實(shí)例:
def fact(n):
if n == 0:
return 1
else:
return n*fact(n-1)
遞歸函數(shù)實(shí)現(xiàn)方法:函數(shù)和分支語(yǔ)句
遞歸本身是一個(gè)函數(shù),用函數(shù)定義式方法描述箩祥,函數(shù)內(nèi)部采用分支語(yǔ)句對(duì)輸入內(nèi)容進(jìn)行判斷院崇,基例和鏈條形成對(duì)應(yīng)的代碼
4.3.4 遞歸實(shí)例
實(shí)例一:字符串反轉(zhuǎn)
字符串切片方法: s[::-1]
遞歸法:
def rvs(s):
if s =="":
return s
else:
return rvs(s[1:])+s[0]
實(shí)例二:斐波那契數(shù)列
def f(n):
if n==1 or n==2:
return 1
else:
return f(n-1)+f(n-2)
實(shí)例三:漢諾塔問題
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)
hanoi(3,"A","B","C")
print(count)
4.4 PyInstaller庫(kù)的使用
4.4.1 PyInstaller庫(kù)簡(jiǎn)介
定義: PyInstaller庫(kù)是第三方庫(kù),使用前需要額外安裝袍祖,安裝時(shí)需要用到pip命令
安裝方法:在Windows系統(tǒng)的cmd命令中輸入:pip install PyInstaller
4.4.2 PyInstaller庫(kù)使用
常用參數(shù) | 用途 |
---|---|
-h | 查看幫助 |
--clean | 清理打包過程中臨時(shí)文件 |
-D,--onedir | 生成dist文件夾 |
-F,--onefile | 在dist文件夾中生成獨(dú)立打包文件 |
-i<圖標(biāo)文件名.ico> | 指定打包應(yīng)用程序使用的圖標(biāo)(icon)文件 |
實(shí)例:
在windows中cmd體系下輸入指令:
PyInstaller -i curve.ico -F SevenDigistDrawV2.py
4.5 科赫雪花小包裹實(shí)例講解
4.5.1 科赫雪花繪制
分形幾何:一種迭代的幾何圖形底瓣,廣泛存在與自然界中
科赫曲線:也叫雪花曲線,用于分形的曲線蕉陋,用python繪制
實(shí)例:
#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(600,600)
turtle.penup()
turtle.goto(-200,100)
turtle.pendown()
turtle.pensize(2)
level=3
koch(400,level)
turtle.right(120)
koch(400,level)
turtle.right(120)
koch(400,level)
turtle.hideturtle()
main()
4.5.2科赫雪花打包
打包:可以使未安裝python的計(jì)算機(jī)打開此實(shí)例
實(shí)例:
pyinstaller -i curve.ico -F KochDrawV2.py