【第五周】函數(shù)和代碼的復(fù)用

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ǔ)框架圖形

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末迅箩,一起剝皮案震驚了整個(gè)濱河市溉愁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖拐揭,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撤蟆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡堂污,警方通過查閱死者的電腦和手機(jī)家肯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盟猖,“玉大人讨衣,你說我怎么就攤上這事∈礁洌” “怎么了反镇?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)娘汞。 經(jīng)常有香客問我歹茶,道長(zhǎng),這世上最難降的妖魔是什么你弦? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任惊豺,我火速辦了婚禮,結(jié)果婚禮上禽作,老公的妹妹穿的比我還像新娘尸昧。我一直安慰自己,他們只是感情好领迈,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布彻磁。 她就那樣靜靜地躺著,像睡著了一般狸捅。 火紅的嫁衣襯著肌膚如雪衷蜓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天尘喝,我揣著相機(jī)與錄音磁浇,去河邊找鬼。 笑死朽褪,一個(gè)胖子當(dāng)著我的面吹牛置吓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播缔赠,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼衍锚,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了嗤堰?” 一聲冷哼從身側(cè)響起戴质,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后告匠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體戈抄,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年后专,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了划鸽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡戚哎,死狀恐怖裸诽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情型凳,我是刑警寧澤崭捍,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站啰脚,受9級(jí)特大地震影響殷蛇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜橄浓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一粒梦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧荸实,春花似錦匀们、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至露氮,卻和暖如春祖灰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背畔规。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國打工局扶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叁扫。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓三妈,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親莫绣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子畴蒲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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