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

函數(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ù)字顯示不同的線條


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 繪制當(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)用過程

image.png

實(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

image.png

4.5 科赫雪花小包裹實(shí)例講解

4.5.1 科赫雪花繪制

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

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


image.png
image.png

實(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


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捐凭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子凳鬓,更是在濱河造成了極大的恐慌茁肠,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件村视,死亡現(xiàn)場(chǎng)離奇詭異官套,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門奶赔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惋嚎,“玉大人,你說我怎么就攤上這事站刑×砦椋” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵绞旅,是天一觀的道長(zhǎng)摆尝。 經(jīng)常有香客問我,道長(zhǎng)因悲,這世上最難降的妖魔是什么堕汞? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮晃琳,結(jié)果婚禮上讯检,老公的妹妹穿的比我還像新娘。我一直安慰自己卫旱,他們只是感情好人灼,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著顾翼,像睡著了一般投放。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上适贸,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天灸芳,我揣著相機(jī)與錄音,去河邊找鬼取逾。 笑死耗绿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的砾隅。 我是一名探鬼主播误阻,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼晴埂!你這毒婦竟也來了究反?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤儒洛,失蹤者是張志新(化名)和其女友劉穎精耐,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體琅锻,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卦停,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年向胡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惊完。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡僵芹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出小槐,到底是詐尸還是另有隱情拇派,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布凿跳,位于F島的核電站件豌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏控嗜。R本人自食惡果不足惜茧彤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望躬审。 院中可真熱鬧棘街,春花似錦蟆盐、人聲如沸承边。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)博助。三九已至,卻和暖如春痹愚,著一層夾襖步出監(jiān)牢的瞬間富岳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工拯腮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留窖式,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓动壤,卻偏偏與公主長(zhǎng)得像萝喘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子琼懊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容