python第五講:函數(shù)與代碼復(fù)用

函數(shù)

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

4.1.1 函數(shù)的理解與定義

定義:函數(shù)是一段具有特定功能的、可重用的語句組。

作用:降低編程難度、代碼復(fù)用

def <函數(shù)名> (<參數(shù)(零個或多個)>):
    <函數(shù)體>
    return<返回值>

特點:函數(shù)定義時,所指定參數(shù)為占位符,參數(shù)是輸入,參數(shù)體為處理,結(jié)果為輸出(IPO)

? 函數(shù)定義后,如果結(jié)果不經(jīng)調(diào)用,則不會執(zhí)行

實例:計算n!

def fact(n):
    s=1
    for i in range (1,n+1):
        s*=i
    return s

4.1.2 函數(shù)的使用及調(diào)用

定義:是運行代碼的方式,調(diào)用時要給出實際參數(shù),用實際參數(shù)替換給定參數(shù)

方法:將 fact(X)帶入即可

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

特點:無論函數(shù)是否具有參數(shù),都必須有()

def fact():
    print("...")

函數(shù)定義時可以為某些參數(shù)指定默認值,構(gòu)成可選參數(shù)。

def <函數(shù)名> (<非可選函數(shù)>,<可選函數(shù)>):
    <函數(shù)體>
    return<返回值>

實例:計算n!//m

def fact(n,m=1):
    s=1
    for i in range (1,n+1):
        s*=i
    return s//m

實例:計算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ù)可以按照位置或者名稱方式傳遞:

fact(m=5,n=10)或者fact(5,10)

4.1.4 函數(shù)返回值

定義:返回零個或者多個結(jié)果,return保留字來傳遞返回值

特征:返回值可以有也可以無

return n//m,n,m

(10,5,3)

4.1.5局部變量及全局變量

局部變量:函數(shù)內(nèi)部的變量

全局變量:服務(wù)于整個函數(shù)的變量

特征:1.局部變量和全局變量是不同的兩種變量,局部變量是占位符,與全局變量可能重名但是不相同,運算結(jié)束后,局部變量被釋放,也可使用global保留字在函數(shù)中用全局變量。

? 2.局部變量為組合數(shù)據(jù)類型且未創(chuàng)建時,等同于全局變量。

局部變量實例:

n,s=10,100
def fact(n):
    s=1
    for i in range (1,n+1):
        s*=i
    return s
print(fact(n),s)

全局變量實例:

n,s=10,100
def fact(n):
    global s
    for i in range (1,n+1):
        s*=i
    return s
print(fact(n),s)

局部變量可以用作全局變量實例:

ls=["f","F"]
def func(a):
    ls.append(a)
    return
func("C")
print(ls)

4.1.6 lambda函數(shù)

定義:返回函數(shù)名作為一種結(jié)果,是一種匿名函數(shù),用于簡單的,用于一行表示的函數(shù)。

<函數(shù)名>=lambda<函數(shù)參數(shù)>:<函數(shù)表達式>

f=lambda x, y : x+y
f(10,15)

用途:主要用作于特定或方法參數(shù),固定使用形式,建議一般用def定義。

4.2 七段數(shù)碼管繪制實例

4.2.1 繪制特定數(shù)字數(shù)碼管

要求:首先繪制單個數(shù)字對應(yīng)的數(shù)碼管,然后獲得一串數(shù)字繪制響應(yīng)的數(shù)碼管

特征:由七個基本線條組成,七段數(shù)碼管可以由特定的順序,不同數(shù)字顯示不同的線條


image.png

image.png

舉例:

#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 繪制當前時間數(shù)字數(shù)碼管

要求:使用time庫獲得當前時間,增加年月日標記,年月日不同顏色

舉例:

#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è)計

定義:將代碼當做一種資源進行抽象,使用函數(shù)等方法對代碼賦予更高意義。

代碼復(fù)用:同一份代碼在需要時可以被重復(fù)使用

主要形式:函數(shù)、對象

函數(shù):將代碼命名,在代碼層面建立初步抽象。

對象:屬性及方法,<a>.<b>和<a>.<b>()在函數(shù)上再次組織抽象

模塊化設(shè)計:分而治之,通過函數(shù)或者對象封裝將程序劃分為模塊及之間的表達。

包括:主程序、子程序、子程序之間的關(guān)系

主程序:模塊之間的關(guān)系

子程序:模塊

特點:分而治之的核心是模塊化思想,模塊化是分而治之、分層抽象、體系化的設(shè)計思想。

模塊化設(shè)計概念:緊耦合、松耦合

緊耦合:兩個部分之間交流很多,無法獨立存在

松耦合:兩個部分之間交流很少,可以獨立存在

模塊內(nèi)部緊耦合,模塊之間松耦合

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

特征:鏈條、基例

鏈條:計算過程中的遞歸鏈條

基例:存在一個或多個不用再次遞歸的基例

4.3.3 遞歸的調(diào)用過程

image.png

實例:

def fact(n):
    if n == 0:
        return 1
    else:
        return n*fact(n-1)

遞歸函數(shù)實現(xiàn)方法:函數(shù)和分支語句

遞歸本身是一個函數(shù),用函數(shù)定義式方法描述,函數(shù)內(nèi)部采用分支語句對輸入內(nèi)容進行判斷,基例和鏈條形成對應(yīng)的代碼

4.3.4 遞歸實例

實例一:字符串反轉(zhuǎn)

字符串切片方法: s[::-1]

遞歸法:

def rvs(s):
    if s =="":
        return s
    else:
        return rvs(s[1:])+s[0]

實例二:斐波那契數(shù)列

def f(n):
    if n==1 or n==2:
        return 1
    else:
        return f(n-1)+f(n-2)

實例三:漢諾塔問題

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庫的使用

4.4.1 PyInstaller庫簡介

定義: PyInstaller庫是第三方庫,使用前需要額外安裝,安裝時需要用到pip命令

安裝方法:在Windows系統(tǒng)的cmd命令中輸入:pip install PyInstaller

4.4.2 PyInstaller庫使用

常用參數(shù) 用途
-h 查看幫助
--clean 清理打包過程中臨時文件
-D,--onedir 生成dist文件夾
-F,--onefile 在dist文件夾中生成獨立打包文件
-i<圖標文件名.ico> 指定打包應(yīng)用程序使用的圖標(icon)文件

實例:

在windows中cmd體系下輸入指令:

PyInstaller -i curve.ico -F SevenDigistDrawV2.py

image.png

4.5 科赫雪花小包裹實例講解

4.5.1 科赫雪花繪制

分形幾何:一種迭代的幾何圖形,廣泛存在與自然界中

科赫曲線:也叫雪花曲線,用于分形的曲線,用python繪制


image.png
image.png

實例:

#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的計算機打開此實例

實例:

pyinstaller -i curve.ico -F KochDrawV2.py


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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