[討論] 黑馬python教程 - 01-21 - 函數 - 討論區

[討論] 黑馬python教程 - 01-21 - 函數

文章瀏覽次數 83 文章回覆數 2

Mingo

Mingo圖像(預設)

2021-05-23 06:44:21

From:39.10.230.118

函數

133 函數 01 明確學習目標

目標

  1. 函數的快速體驗 開發中使用函數有什麼好處
  2. 函數的基本使用
  3. 函數的參數
  4. 函數的返回值
  5. 函數的嵌套調用
  6. 在模塊中定義函數

以現在的理解 模塊 就是個工具包 函數呢就是模塊中的一個工具

134 函數 02 函數的概念以及作用

所謂函數,就是把 具有獨立功能的代碼塊 組織為一個小模塊,在需要的時候 調用

函數的使用包含兩個步驟:

  1. 定義函數:封裝 獨立的功能
  2. 調用函數:享受 封裝 的成果

曾經編寫過的代碼 直接放到一個韓數理 在後續任何需要這個功能的時候 直接調用 享受曾經的勞動成果 而不需要把曾經的代碼 一遍一遍的重新編寫 達到提高效率的目的 專業的說 無須代碼的重用 這就是函數的好處了

135 函數 03 函數的快速體驗

函數的快速體驗

演練步驟

  1. 新建  04_函數  項目
  2. 覆制之前完成的 乘法表 文件
  3. 修改文件,增加函數定義 multiple_table():
  4. 新建另外一個文件,使用 import 導入並且調用函數
上面是 pycharm 的演練步驟

1. 建立一個檔案 _99.py
2. 將之前演練的九九乘法表貼到 _99.py 中
3. 在 _99.py 開頭加上 def multiple_table():
4. 代碼塊都多一個縮進

_99.py

def multiple_table():  # 之後會教怎麼定義函數
    row = 1

    # 最大打印 9 行
    while row <= 9:
        # 定義起始列
        col = 1

        # 最大打印 row 列
        while col <= row:

            # end = "",表示輸出結束後,不換行
            # "\t" 可以在控制台輸出一個制表符,協助在輸出文本時對齊
            print("%d * %d = %d" % (col, row, row * col), end="\t")

            # 列數 + 1
            col += 1

        # 一行打印完成的換行
        print("")

        # 行數 + 1
        row += 1

在建立一個檔案 02_python.py 內容如下

02_python.py
import _99
_99.multiple_table()

兩個檔案放在同一個資料夾如 _python
找到 _python 資料夾(先別點開)
按下 shift + enter
找到已 cmd 打開或著 power shell 開啟的字樣  在按下 enter 進入終端模式
接著輸入 python 02_python.py
可以享受勞動成果了

函數基本使用

136 函數基本使用 01 函數定義語法

定義函數的格式如下:

def 函數名():

    函數封裝的代碼
    ……
1. def 是英文  define  的縮寫
2. 函數名稱 應該能夠表達 函數封裝代碼 的功能,方便後續的調用
3. 函數名稱 的命名應該 符合 標識符的命名規則
  由 字母、下劃線 和 數字 組成
  不能以數字開頭
  不能與關鍵字重名
4. 封裝的代碼應該以 def 為參照增加四個空格的縮進

137 函數基本使用 02 第一個函數演練

需求

  1. 編寫一個打招呼  say_hello  的函數,封裝三行打招呼的代碼
  2. 在函數下方調用打招呼的代碼
name = "小明"

# 解釋器知道這里定義了一個函數
# 定義函數只代表了這個函數封裝了一段代碼而已 如果不調用函數他是不會執行的
def say_hello():
    print("hello 1")
    print("hello 2")
    print("hello 3")

print(name)
# 只有在調用函數時,之前定義的函數才會被執行
# 函數執行完成之後,會重新回到之前的程序中,繼續執行後續的代碼
say_hello()  # 調用函數很簡單的,通過  函數名()  即可完成對函數的調用

139 函數基本使用 04 應該先定義函數再調用函數

思考
能否將 函數調用 放在 函數定義 的上方?
不能!
因為在 使用函數名 調用函數之前,必須要保證  Python  已經知道函數的存在
否則控制台會提示  NameError: name 'say_hello' is not defined  (名稱錯誤:say_hello 這個名字沒有被定義)

# 解釋器在執行程序時會由上到下執行程序  所以先調用 在定義 的情況就會發生錯誤  解士氣非常盟B(沒有這個函數啊!!!)
test()

def test():
    print("in test function")
    print("testting")
    print("end of test")
# 你可以試試以上的代碼

141 函數基本使用 06 函數的文檔注釋

在開发中,如果希望給函數添加注釋,應該在 定義函數 的下方,使用 連續的三對引號
在連續的三對引號 之間編寫對函數的說明文字
在函數調用位置,使用快捷鍵 CTRL + Q 可以查看函數的說明信息
注意:因為 函數體相對比較獨立,函數定義的上方,應該和其他代碼(包括注釋)保留兩個空行

# 與註解保留兩個控行 是不是不太好閱讀  所以就有了函數註解塊

def hi():
    """
    打招呼
    """
    print("hi, how are you")

函數的參數

142 函數參數 01 沒有參數的函數過於死板

演練需求

  1. 開发一個 sum_2_num 的函數
  2. 函數能夠實現 兩個數字的求和 功能

演練代碼如下:

def sum_2_num():
    """
    對兩個數字的求和
    """
    num1 = 10
    num2 = 20
    result = num1 + num2

    print("%d + %d = %d" % (num1, num2, result))

# 函數只是把代碼封裝了 要執行你還是得調用他
sum_2_num()

思考一下存在什麼問題
函數只能處理 固定數值 的相加
如何解決?
如果能夠把需要計算的數字,在調用函數時,傳遞到函數內部就好了!
參數的作用 就是在調用函數的時候 把外部的數據以參數的形式傳遞給函數 函數接收到之後 就可在內部使用參數
如何定義與調用參數呢? 繼續往下看下去就知道啦

143 函數參數 02 函數參數的使用以及作用

在函數名的後面的小括號內部填寫 參數
多個參數之間使用 , 分隔

# sum_2_num 需要處理兩個數據 num1 , num2

def sum_2_num(num1, num2):  # 定義了兩個參數 事實上就是兩個變亮 之後輸入的數據就會存在 num1 num2 裡面

    result = num1 + num2

    print("%d + %d = %d" % (num1, num2, result))

sum_2_num(50, 20)
sum_2_num(1000 , 2000)
sum_2_num(99999 , 9999999)

當你調用 sum_2_num(10 , 20) 的時候
num1 = 10
num2 = 20
會先將兩個數值存在變亮中
而函數裡面的 result = num1 + num2
舊會寫成 result = 10 + 20
然後打印出 result

簡單整理:
函數,把具有獨立功能的代碼塊 組織為一個小模塊,在需要的時候調用
函數的參數,增加函數的通用性,針對相同的數據處理邏輯,能夠 適應更多的數據

  1. 在函數 內部,把參數當做 變量 使用,進行需要的數據處理
  2. 函數調用時,按照函數定義的參數順序,把 希望在函數內部處理的數據,通過參數 傳遞

144 函數參數 03 形參和實參

形參:定義函數時,小括號中的參數,是用來接收參數用的,在函數內部作為變量使用 def sum_2_num(num1 , num2):
實參:調用函數時,小括號中的參數,是用來把數據傳遞到函數內部用的 sum_2_num(10 , 20)

形參的作用有二:

  1. 告訴外界能夠傳遞的參數數量
  2. 在函數內部當作便量使用

函數的返回值

145 函數的返回值 01 返回值的應用場景和格式

在程序開发中,有時候,會希望一個函數執行結束後,告訴調用者一個結果,以便調用者針對具體的結果做後續的處理
返回值是函數完成工作後,最後給調用者的一個結果

把溫度計當作一個函數的話 執行結果應該會得到一個溫度的數值
若你測量玩 溫度計沒有辦法顯示結果 也就無法得當當前要測量的溫度

在函數中使用 return 關鍵字可以返回結果 將要傳回的質放在 return 關鍵字後面舊型
調用函數一方,可以 使用變量 來 接收 函數的返回結果

146 函數的返回值 02 改造求和函數

上面的 sum_2_num() 函數只有在函數內部才知道相加的結果 在函數外部 也就是調用函數事實上是沒有辦法知道結果的
之所以能看到他 是因為我們在函數內使用了 print()
要知道結果 你就需要使用 return 將值傳遞出來

def sum_2_num(num1, num2):
    """對兩個數字的求和"""

    return num1 + num2  # 可以使用返回職 告訴調用函數的一方 計算結果

執行後沒有結果產出是很正常的
雖然函數有返回職 調用的一方並沒有接收結果

def sum_2_num(num1, num2):
    """對兩個數字的求和"""

    return num1 + num2  # 可以使用返回職 告訴調用函數的一方 計算結果

# 調用函數,並使用 result 變量接收計算結果
result = sum_2_num(10, 20)

print("計算結果是 %d" % result)

147 函數的返回值 03 return 關鍵字的注意事項

return 表示返回(返回到函數調用的地方),return 後續的代碼都不會被執行

函數的嵌套調用

148 函數的嵌套調用 01 函數嵌套調用的執行線路圖

一個函數里面 又調用 了 另外一個函數,這就是 函數嵌套調用
如果函數  test2  中,調用了另外一個函數  test1 
那麼執行到調用  test1  函數時,會先把函數  test1  中的任務都執行完
才會回到  test2  中調用函數  test1  的位置,繼續執行後續的代碼

def test1():
    print("start test1")

    print("test 1")

    print("end test1")

def test2():
    print("start test2")
    print("test 2")
    test1()
    print("end test2")
test2()

以下是執行結果

start test2
test 2
start test1
test 1
end test1
end test2

所以可以看的出來當 test2() 調用 test1() 會先去執行 test1() 接著在執行 test2() 之後的代碼

事實上嵌套函數的調用與定義 與一班情況沒有什麼區別的

函數 函數嵌套的演練

150 分隔線演練 01 利用參數增加分隔線的靈活度

體會一下工作中 需求是多變 的
需求 1 定義一個  print_line  函數能夠打印  *  組成的一條分隔線

def print_line():

    print("*" * 50)

需求 2 定義一個函數能夠打印 由任意字符組成的分隔線

def print_line(char):

    print(char * 50)

print_line("-")

需求 3 定義一個函數能夠打印 任意重覆次數 的分隔線

def print_line(char, times):

    print(char * times)

print_line("-" , 100)

151 分隔線演練 02 打印多條分隔線

需求 4 定義一個函數能夠打印 5 行 的分隔線,分隔線要求符合需求 3
提示:工作中針對需求的變化,應該冷靜思考,不要輕易修改之前已經完成的,能夠正常執行的函數!
事實上我們只要利用一個 while 巡完重複調用第三個需求的函數就行了

def print_line(char, times):

    print(char * times)

def print_lines():

    row = 0

    while row < 5:
        print_line('-' , 10)

        row += 1

print_lines()

152 分隔線演練 03 增加多行分隔線函數的參數

def print_line(char, times):

    print(char * times)

def print_lines(char , times):

    row = 0

    while row < 5:
        print_line(char , times)

        row += 1

print_lines('*' , 120)

在我們封裝一個函數的時候 應該盡量讓函數具有更好的靈活性與通用性 而函數想要有兩個性質 就應該把函數內部可辨的數據 都改變成參數的刑事 由調用函數時從外部傳遞進去 函數在執行的時候 就可以根據傳遞進來的數據 靈活變化...

使用模塊中的函數

154 模塊 01 概念介紹

模塊是 Python 程序架構的一個核心概念
  模塊 就好比是 工具包,要想使用這個工具包中的工具,就需要 導入 import 這個模塊
  每一個以擴展名 py 結尾的 Python 源代碼文件都是一個模塊
  在模塊中定義的 全局變量 、 函數 都是模塊能夠提供給外界直接使用的工具

155 模塊 02 使用模塊演練

步驟
新建 hm_10_ 分隔線模塊.py 
  覆制  hm_09_打印多條分隔線.py  中的內容,最後一行 print 代碼除外
  增加一個字符串變量
    name = "黑馬程序員"

# 新增 hm_10_.py 文件
name = '黑馬程序元'

def print_line(char, times):

    print(char * times)

def print_lines(char , times):

    row = 0

    while row < 5:
        print_line(char , times)

        row += 1

# 新建 test_print_lines.py 文件,並且編寫以下代碼:
import hm_10_

hm_10_.print_line("-", 80)
print(hm_10_.name)

進入終端模式 找到檔案 用 python test_print_lines.py 執行看看

體驗小結
可以 在一個 Python 文件 中 定義變量或者函數
然後在 另外一個文件中 使用 import 導入這個模塊
導入之後,就可以使用  模塊名.變量  /  模塊名.函數  的方式,使用這個模塊中定義的變量或者函數

模塊可以讓 曾經編寫過的代碼 方便的被覆用!

156 模塊 03 模塊名也是一個標識符

標示符可以由 字母、下劃線 和 數字 組成
  不能以數字開頭
  不能與關鍵字重名
注意:如果在給 Python 文件起名時,以數字開頭 是無法在 PyCharm / python 中通過導入這個模塊的

157 模塊 04 科普pyc文件可以提高程序執行速度

C 是 compiled 編譯過 的意思
操作步驟
1. 瀏覽程序目錄會发現一個 __pycache__ 的目錄
2. 目錄下會有一個 hm_10_.cpython-39.pyc 文件,cpython-39 表示 Python 解釋器的版本 版本不同數字也就不一樣了
3. 這個 pyc 文件是由 Python 解釋器將 模塊的源碼 轉換為字節碼  
  Python 這樣保存 字節碼 是作為一種啟動速度的優化
字節碼
  Python 在解釋源程序時是分成兩個步驟的
    1. 首先處理源代碼,編譯 生成一個二進制 字節碼
    2. 再對字節碼進行處理,才會生成 CPU 能夠識別的 機器碼
  有了模塊的字節碼文件之後,下一次運行程序時,如果在 上次保存字節碼之後 沒有修改過源代碼,Python 將會加載 .pyc 文件並跳過編譯這個步驟
  當 Python 重編譯時,它會自動檢查源文件和字節碼文件的時間戳
  如果你又修改了源代碼,下次程序運行時,字節碼將自動重新創建
提示:有關模塊以及模塊的其他導入方式,後續課程還會逐漸展開!
模塊是 Python 程序架構的一個核心概念

※最後更新時間:2021-05-24 14:34:56 From:39.10.4.5 By:Mingo
※最後更新時間:2021-05-24 16:51:55 From:110.30.160.213 By:Mingo

留言

#1

特種兵

特種兵圖像(預設)

2021-05-24 12:04:05

From:211.23.21.202

def 函數名():
函數封裝的代碼
……

我認為「函數封裝的代碼」應該縮排
最後一行不知道是什麼?

print(name)
# 只有在調用函數時,之前定義的函數才會被執行
# 函數執行完成之後,會重新回到之前的程序中,繼續執行後續的代碼
say_hello()  # 調用函數很簡單的,通過  函數名()  即可完成對函數的調用

print(name)

不太清楚為什麼呼叫完函數澴要加上 print(name)

retrun關鍵字的注意事項

拼錯字
這篇的 print 有單引也有雙引,可以統一一下比較好

#2

特種兵

特種兵圖像(預設)

2021-05-24 12:06:26

From:211.23.21.202

最後一行不知是什麼,是指
and符號hellip;and符號 hellip;