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

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ù)傳遞的兩種方式

函數(shù)的返回值

  • return保留字用來(lái)傳遞返回值
  • 函數(shù)可以有返回值妄迁,也可以沒(méi)有,可以有return李命,也可以沒(méi)有
  • return可以傳遞0個(gè)返回值登淘,也可以傳遞r任意多個(gè)返回值

局部變量和全局變量

局部變量和全局變量

舉例:
程序說(shuō)明

規(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ù)遞歸的理解

數(shù)學(xué)遞歸舉例

兩關(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ù)列

斐波那契數(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ǔ)框架圖形
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末俊鱼,一起剝皮案震驚了整個(gè)濱河市刻像,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌并闲,老刑警劉巖细睡,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異帝火,居然都是意外死亡溜徙,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)犀填,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蠢壹,“玉大人,你說(shuō)我怎么就攤上這事九巡⊥济常” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵冕广,是天一觀的道長(zhǎng)疏日。 經(jīng)常有香客問(wèn)我,道長(zhǎng)佳窑,這世上最難降的妖魔是什么制恍? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮神凑,結(jié)果婚禮上净神,老公的妹妹穿的比我還像新娘。我一直安慰自己溉委,他們只是感情好鹃唯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著瓣喊,像睡著了一般坡慌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上藻三,一...
    開(kāi)封第一講書(shū)人閱讀 51,727評(píng)論 1 305
  • 那天洪橘,我揣著相機(jī)與錄音跪者,去河邊找鬼。 笑死熄求,一個(gè)胖子當(dāng)著我的面吹牛渣玲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播弟晚,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼忘衍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了卿城?” 一聲冷哼從身側(cè)響起枚钓,我...
    開(kāi)封第一講書(shū)人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瑟押,沒(méi)想到半個(gè)月后搀捷,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡多望,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年指煎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片便斥。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖威始,靈堂內(nèi)的尸體忽然破棺而出枢纠,到底是詐尸還是另有隱情,我是刑警寧澤黎棠,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布晋渺,位于F島的核電站,受9級(jí)特大地震影響脓斩,放射性物質(zhì)發(fā)生泄漏木西。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一随静、第九天 我趴在偏房一處隱蔽的房頂上張望八千。 院中可真熱鬧,春花似錦燎猛、人聲如沸恋捆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)沸停。三九已至,卻和暖如春昭卓,著一層夾襖步出監(jiān)牢的瞬間愤钾,已是汗流浹背瘟滨。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留能颁,地道東北人杂瘸。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像劲装,于是被迫代替她去往敵國(guó)和親胧沫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

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