【筆記】《python語言程序設(shè)計》—函數(shù)和代碼復(fù)用

一、前言

學(xué)習(xí)就是一個不斷的自下而上,自上而下的過程。

前段時間,學(xué)著用python實現(xiàn)網(wǎng)站的數(shù)據(jù)爬取,隱約get到python的一些語法和用法,感覺就是語法不難,關(guān)鍵在于解決問題的思維。

這是需求驅(qū)動后的學(xué)習(xí)。接下來,就需要對python進行系統(tǒng)地了解。

很早之前搜知乎的時候,就搜到MOOC上的一門《python語言程序設(shè)計》課程,講得很好,而且,我還下載了課件,溜了一遍,感覺就挺有趣的。

趁著有了實戰(zhàn)經(jīng)驗,就把這門入門課刷了一遍。果然是門好課!很適合小白入門,并系統(tǒng)學(xué)習(xí),整個教學(xué)過程循序漸進,深入淺出,提綱挈領(lǐng),很有意思!

課程是北京理工大學(xué)嵩天老師的《python語言程序設(shè)計》課程,現(xiàn)在已經(jīng)開了11次課了。課程每個小視頻短則幾分鐘,最長也不超過20分鐘,不容易勸退。每章講解有復(fù)習(xí)回顧及小結(jié),在平臺python123上有每章的練習(xí)和測試,直接反饋結(jié)果,激發(fā)繼續(xù)學(xué)下去的興趣。

個人感覺,老師說話速度慢了些,調(diào)成了2倍速播放,然后,花了大約3天的時間,把所有的視頻,課件,練習(xí)和測試都刷了一遍,感覺對python的了解更系統(tǒng)了!

趁熱打鐵,把每章的知識點和練習(xí)、測試再進行整理回顧一下。

以下內(nèi)容均來自課程:《python語言程序設(shè)計》平臺python123,感興趣的看課程視頻,親自練習(xí),效果更好~

二、知識點

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

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

    ①一段具有特定功能的,可重用的語句組

    ②一種功能的抽象,一般函數(shù)表達特定功能

    ③兩個作用:降低編程難度和代碼復(fù)用

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

    ④函數(shù)定義時,所指定的參數(shù)是一種占位符;如果不經(jīng)過調(diào)用,不會被執(zhí)行;參數(shù)是輸入,函數(shù)體是處理,結(jié)果是輸出(IPO)

  2. 函數(shù)的使用及調(diào)用過程

    ①調(diào)用是運行函數(shù)代碼的方式

    ②調(diào)用時要給出實際參數(shù);實際參數(shù)替換定義中的參數(shù);函數(shù)調(diào)用后得到返回值;

函數(shù)調(diào)用過程.png
  1. 函數(shù)的參數(shù)傳遞

    ①函數(shù)可以有參數(shù),也可以沒有,但必須保留括號;

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

    ③函數(shù)定義時可以設(shè)計可變數(shù)量參數(shù),即不確定參數(shù)總數(shù)量

    def <函數(shù)名>(<參數(shù)>,*b):
        <函數(shù)體>
        return <返回值>
    
可變參數(shù)傳遞.png

④函數(shù)調(diào)用時,參數(shù)可以按照位置或名稱方式傳遞;

#默認(rèn)參數(shù)m為1
def fact(n,m=1):
    s=1
    for i in range(1,n+1):
        s*=i
    return s//m
#位置傳遞
fact(10,5)
#名稱傳遞
fact(m=5,n=10)
  1. 函數(shù)的返回值

    ①函數(shù)可以返回0個或多個結(jié)果

    ②可以有return,也可以沒有

    ③多個返回結(jié)果以元組類型呈現(xiàn)

多個返回值.png
  1. 局部變量和全局變量

    ①局部變量和全局變量是不同變量:局部變量是函數(shù)內(nèi)部的占位符,與全局變量可能重名但不同;函數(shù)運算結(jié)束后,局部變量被釋放;可以使用global保留字在函數(shù)內(nèi)部使用全局變量;

規(guī)則1.png

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

規(guī)則2.png
  1. lambda函數(shù)

    ①lambda函數(shù)返回函數(shù)名作為結(jié)果

    ②lambda函數(shù)是一種匿名函數(shù),即沒有名字的函數(shù)

    ③使用lambda保留字定義,函數(shù)名是返回結(jié)果

    ④lambda函數(shù)用于定義簡單的、能夠在一行內(nèi)表示的函數(shù)

    ⑤謹(jǐn)慎使用lambda函數(shù):該函數(shù)主要用作一些特定函數(shù)或方法的參數(shù);該函數(shù)有一些固定使用方式,建議逐步掌握;一般情況,建議使用def定義的普通函數(shù)

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

2.實例7:七段數(shù)碼管繪制

繪制效果:

time_paint.gif
import turtle,time
# 繪制數(shù)碼管間隔
def drawGap():
    turtle.penup()
    turtle.fd(5)
# 繪制單段數(shù)碼管
def drawLine(draw):
    drawGap()
    turtle.pendown() if draw else turtle.penup()
    turtle.fd(40)
    drawGap()
    turtle.right(90)
# 根據(jù)數(shù)字繪制七段數(shù)碼管
def drawDigit(digit):
    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()
    turtle.fd(20)
# 繪制時間
def drawDate(date):
    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():
    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()

3.代碼復(fù)用與函數(shù)遞歸

  1. 代碼復(fù)用與模塊化設(shè)計

    ①代碼復(fù)用:把代碼當(dāng)成資源進行抽象:代碼資源化(程序代碼是一種用來表達計算的“資源”);代碼抽象化(使用函數(shù)等方法對代碼賦予更高級別的定義);代碼復(fù)用(同一份代碼在需要時可以被重復(fù)使用)

    ②函數(shù)和對象(屬性和方法)是代碼復(fù)用的兩種主要形式;

    ③模塊化設(shè)計:通過函數(shù)或?qū)ο蠓庋b將程序劃分為模塊及模塊間的表達;分而治之;

    ④緊耦合和松耦合:前者表示兩個部分之間交流很多,無法獨立存在;后者表示兩個部分之間交流較少,可以獨立存在;模塊內(nèi)部緊耦合,模塊之間松耦合;

  2. 函數(shù)遞歸的理解

    ①遞歸:函數(shù)定義中調(diào)用函數(shù)自身的方式;

    ②兩個關(guān)鍵特征:(1)鏈條:計算過程存在遞歸鏈條;(2)基例:存在一個或多個不需要再次遞歸的基例;

  3. 函數(shù)遞歸的調(diào)用過程

    ①遞歸本身是一個函數(shù),需要函數(shù)定義方式描述;

    ②函數(shù)內(nèi)部,采用分支語句對輸入?yún)?shù)進行判斷;

    ③基例和鏈條,分別編寫對應(yīng)代碼;

  4. 函數(shù)遞歸實例解析

    ①字符串反轉(zhuǎn)

    #將字符串s反轉(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)
    

4.模塊4:Pyinstaller庫的使用

  1. Pyinstaller庫基本介紹

    ①將.py源代碼轉(zhuǎn)換成無需源代碼的可執(zhí)行文件;

    ②第三方庫,使用pip install pyinstaller安裝;

  2. Pyinstaller庫使用說明

    ①簡單使用:(cmd命令行)pyinstaller -F <文件名.py>

    ②常用參數(shù):

    參數(shù) 描述
    -h 查看幫助
    --clean 清理打包過程中的臨時文件
    -D,--onedir 默認(rèn)值,生成dist文件夾
    -F,--onefile 在dist文件夾中只生成獨立的打包文件
    -i <圖標(biāo)文件名.ico> 指定打包程序使用的圖標(biāo)(icon)文件

    舉例:

    pyinstaller -i curve.ico -F SevenDigitsDrawV2.py

5.實例8:科赫雪花小包裹

描述:科赫曲線,也叫雪花曲線。繪制科赫曲線。獲得用戶輸入的整數(shù)N,作為階,繪制N階科赫曲線。

下圖為3階科赫曲線。

科赫雪花小包裹.png
import turtle
def koch(size, n):
    if n==0:
        turtle.fd(size)
    else:
        for angel in [0,60,-120,60]:
            turtle.left(angel)
            koch(size/3,n-1)
def main(level):
    turtle.setup(800,800)
    turtle.penup()
    turtle.goto(-200, 100)
    turtle.pendown()
    turtle.pensize(2)
    turtle.hideturtle()
    koch(300,level)
    turtle.right(120)
    koch(300,level)
    turtle.right(120)
    koch(300,level)
    turtle.done() 
try:
    level = eval(input("請輸入科赫曲線的階: "))
    main(level)
except:
    print("輸入錯誤")

三、練習(xí)

1. 實例7:七段數(shù)碼管繪制

同上

2. 實例8:科赫雪花小包裹

同上

3. 任意累積

描述:請根據(jù)編程模板補充代碼,計算任意個輸入數(shù)字的乘積。

注意,僅需要在標(biāo)注...的地方補充一行或多行代碼。

def cmul(*b):
    m=1
    for i in b:
        m*=i
    return m
print(eval("cmul({})".format(input())))

4. 斐波那契數(shù)列計算

描述:根據(jù)編程模板補充代碼,計算斐波那契數(shù)列的值,具體功能如下:

  1. 獲取用戶輸入整數(shù)N,其中,N為正整數(shù)

  2. 計算斐波那契數(shù)列的值

如果將斐波那契數(shù)列表示為fbi(N),對于整數(shù)N,值如下:

fbi(1)和fbi(2)的值是1,當(dāng)N>2時,fbi(N) = fbi(N-1) + fbi(N-2)
請采用遞歸方式編寫。

def fbi(n):
    if (n==1) or (n==2):
        f=1
    else:
        f=fbi(n-1)+fbi(n-2)
    return f
n = eval(input())
print(fbi(n))

5.漢諾塔實踐

描述:漢諾塔問題大家都清楚,這里不再贅述。

請補充編程模板中代碼,完成如下功能:

有三個圓柱A、B、C,初始時A上有N個圓盤,N由用戶輸入給出,最終移動到圓柱C上。

每次移動步驟的表達方式示例如下:[STEP 10] A->C。其中,STEP是步驟序號,寬度為4個字符,右對齊。

請編寫代碼,獲得輸入N后,輸出漢諾塔移動的步驟。

輸入格式

一個整數(shù)

輸出格式

每個步驟一行,每行參考格式如下:[STEP 10] A->C

steps = 0
def hanoi(src, des, mid, n):
    global steps
    if n == 1:
        steps+=1
        print("[STEP{:>4}] {}->{}".format(steps, src, des))
    else:
        hanoi(src,mid,des,n-1)
        steps+=1
        print("[STEP{:>4}] {}->{}".format(steps, src, des))
        hanoi(mid,des,src,n-1)
N = eval(input())
hanoi("A", "C", "B", N)

四、測試

1.選擇題

  1. 以下選項不是函數(shù)作用的是:

    A 復(fù)用代碼

    B 提高代碼執(zhí)行速度

    C 降低編程復(fù)雜度
    D 增強代碼可讀性

函數(shù)不能直接提高代碼執(zhí)行速度。

  1. 下列程序的輸出結(jié)果為:
def f(a,b):
  a=4
  return  a+b
def main():
  a=5
  b=6
  print(f(a,b),a+b)
main()

A 10 11

B 11 10

C 11 11

D 10 10

這里沒有全局變量,都是函數(shù)局部變量的運算。

  1. 以下關(guān)于Python函數(shù)說法錯誤的是:
def func(a,b):
  c=a**2+b
  b=a
  return c
a=10
b=100
c=func(a,b)+a

A 該函數(shù)名稱為func

B 執(zhí)行該函數(shù)后,變量a的值為10

C 執(zhí)行該函數(shù)后,變量c的值為200

D 執(zhí)行該函數(shù)后,變量b的值為100

這里沒有全局變量,請在IDLE中執(zhí)行代碼觀察結(jié)果。

  1. 以下關(guān)于函數(shù)調(diào)用描述正確的是:

    A 函數(shù)和調(diào)用只能發(fā)生在同一個文件中

    B 自定義函數(shù)調(diào)用前必須定義

    C Python內(nèi)置函數(shù)調(diào)用前需要引用相應(yīng)的庫

    D 函數(shù)在調(diào)用前不需要定義,拿來即用就好

函數(shù)調(diào)用前必須已經(jīng)存在函數(shù)定義,否則無法執(zhí)行。

Python內(nèi)置函數(shù)直接使用,不需要引用任何模塊。

  1. 以下關(guān)于模塊化設(shè)計描述錯誤的是:

    A 應(yīng)盡可能合理劃分功能塊,功能塊內(nèi)部耦合度低

    B 應(yīng)盡可能合理劃分功能塊,功能塊內(nèi)部耦合度高

    C 高耦合度的特點是復(fù)用較為困難

    D 模塊間關(guān)系盡可能簡單,模塊之間耦合度低

模塊內(nèi)高耦合、模塊間低耦合。

  1. 以下對遞歸描述錯誤的是:

    A 遞歸程序都可以有非遞歸編寫方法

    B 書寫簡單

    C 一定要有基例

    D 執(zhí)行效率高

遞歸不提高程序執(zhí)行效率。

任何遞歸程序都可以通過堆棧或隊列變成非遞歸程序(這是程序的高級應(yīng)用)。

  1. 以下關(guān)于函數(shù)說法錯誤的是:

    A 函數(shù)可以看做是一段具有名字的子程序

    B 對函數(shù)的使用必須了解其內(nèi)部實現(xiàn)原理

    C 函數(shù)通過函數(shù)名來調(diào)用

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

調(diào)用函數(shù)不需要知道函數(shù)內(nèi)部實現(xiàn)原理,只需要知道調(diào)用方法(即接口)即可。

  1. 哪個選項對于函數(shù)的定義是錯誤的?

    A def vfunc(*a,b):

    B def vfunc(a,b):

    C def vfunc(a,*b):

    D def vfunc(a,b=2):

def vfunc(a, b) 是錯誤的定義:a表示可變參數(shù),可變參數(shù)只能放在函數(shù)參數(shù)的最后。

  1. 關(guān)于return語句,以下選項描述正確的是:

    A 函數(shù)中最多只有一個return語句

    B return只能返回一個值

    C 函數(shù)可以沒有return語句

    D 函數(shù)必須有一個return語句

函數(shù)可以包含0個或多個return語句

  1. 以下關(guān)于遞歸函數(shù)基例的說法錯誤的是:

    A 遞歸函數(shù)必須有基例

    B 遞歸函數(shù)的基例決定遞歸的深度

    C 遞歸函數(shù)的基例不再進行遞歸

    D 每個遞歸函數(shù)都只能有一個基例

每個遞歸函數(shù)至少存在一個基例,但可能存在多個基例。

2.程序設(shè)計題

  1. 隨機密碼生成

描述:補充編程模板中代碼,完成如下功能:

以整數(shù)17為隨機數(shù)種子,獲取用戶輸入整數(shù)N為長度,產(chǎn)生3個長度為N位的密碼,密碼的每位是一個數(shù)字。每個密碼單獨一行輸出。

產(chǎn)生密碼采用random.randint()函數(shù)

import random
def genpwd(length):
    a=10**(length-1)
    b=10**length-1
    return '{}'.format(random.randint(a,b))
length = eval(input())
random.seed(17)
for i in range(3):
    print(genpwd(length))
  1. 連續(xù)質(zhì)數(shù)計算

描述:補充編程模板中代碼,完成如下功能:

獲得用戶輸入數(shù)字N,計算并輸出從N開始的5個質(zhì)數(shù),單行輸出,質(zhì)數(shù)間用逗號,分割。

注意:需要考慮用戶輸入的數(shù)字N可能是浮點數(shù),應(yīng)對輸入取整數(shù);最后一個輸出后不用逗號。

def prime(m):
    for i in range(2,m):
        if m % i == 0:
            return False
    return True

n = eval(input())
n_ = int(n)
n_ = n_+1 if n_ < n else n_
count = 5

while count > 0:
    if prime(n_):
        if count > 1:
            print(n_, end=",")
        else:
            print(n_, end="")
        count -= 1 
    n_ += 1

這個代碼注意:
(1) 需要對輸入小數(shù)情況進行判斷,獲取超過該輸入的最小整數(shù)(這里沒用floor()函數(shù));
(2) 對輸出格式進行判斷,最后一個輸出后不增加逗號(這里沒用.join()方法)。

【筆記】《python語言程序設(shè)計》—Python基本語法元素

【筆記】《python語言程序設(shè)計》—Python基本圖形繪制

【筆記】《python語言程序設(shè)計》——基本數(shù)據(jù)類型

【筆記】《python語言程序設(shè)計》——程序的控制結(jié)構(gòu)

【筆記】《python語言程序設(shè)計》——函數(shù)和代碼復(fù)用

【筆記】《python語言程序設(shè)計》——組合數(shù)據(jù)類型

【筆記】《python語言程序設(shè)計》——文件和數(shù)據(jù)格式化

【筆記】《python語言程序設(shè)計》——程序設(shè)計方法學(xué)

【筆記】《python語言程序設(shè)計》——python計算生態(tài)概覽

最后編輯于
?著作權(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ù)。

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