小白學 Python(16):基礎數據類型(函數)(上)

  • 2019 年 11 月 7 日
  • 筆記

人生苦短,我選Python

前文傳送門

小白學 Python(1):開篇

小白學 Python(2):基礎數據類型(上)

小白學 Python(3):基礎數據類型(下)

小白學 Python(4):變數基礎操作

小白學 Python(5):基礎運算符(上)

小白學 Python(6):基礎運算符(下)

小白學 Python(7):基礎流程式控制制(上)

小白學 Python(8):基礎流程式控制制(下)

小白學 Python(9):基礎數據結構(列表)(上)

小白學 Python(10):基礎數據結構(列表)(下)

小白學 Python(11):基礎數據結構(元組)

小白學 Python(12):基礎數據結構(字典)(上)

小白學 Python(13):基礎數據結構(字典)(下)

小白學 Python(14):基礎數據結構(集合)(上)

小白學 Python(15):基礎數據結構(集合)(下)

引言

跟各位同學講一個好消息,當你看到這篇連載的時候,整個 Python 基礎內容部分已經過大半了。

希望各位同學再接再厲,努力把剩下的部分也看完。

函數

提到函數,沒有接觸過編程的同學會不會想到這個:

y = f(x)

但是,我們在 Python 中使用到的函數和數學中的函數沒有半毛錢關係(額,可能稍微有點關係)。

在 Python 中,我們使用函數是為了簡化問題,將同一類的操作定義為一個函數,在遇到相同的問題調用對應的函數,類似於 y = f(x)x = 1 的時候 y = 1x = 2 的時候 y = 2

所以,函數就是重複使用的程式碼。

定義函數

定義函數的規則如下:

  • 函數程式碼塊以 def 關鍵詞開頭。
  • 後接函數名稱和圓括弧 ()
  • 圓括弧中可以使用參數。
  • 函數內容以冒號起始,並且縮進。
  • return 結束函數,可以選擇性地返回一個值。不帶 return 相當於返回 None。

定義一個函數大致長這樣:

def 函數名(形式參數):      函數體      return 返回值

def 是系統關鍵字,至於什麼是系統關鍵字後面我們再聊,這裡僅需要知道 def 是用來定義函數的即可。

系統關鍵字在 PyCharm 中都會高亮顯示,如果沒有高亮,那麼一定是你打錯了。

比如我們現在定義一個求兩數之和的函數:

def add(a, b):      c = a + b      return c

這個有看不懂的么?

沒有的話我就接著往下聊了,有的話就給我留言吧。

以上我們就完成了一個函數的定義。

函數調用

函數定義好以後我們還需要調用函數才能執行,一個函數放在那裡是不會自動執行的。

廢話,我哪知道你要傳什麼參數過來。。。

我們調用一下剛才寫好的函數:

c = add(1, 2)  print(c)

列印結果如下:

3

這裡我們介紹兩個名詞:

  • 實際參數:簡稱實參,我們剛才在調用函數的時候傳入 1 和 2 就是實參。主要體現在實際執行函數的時候使用。
  • 形式參數:簡稱形參,我們剛才在定義函數的時候 add(a, b) 中的 a 和 b 就是形參。主要體現在它只是一個形式和格式,真正要執行的時候還是要看傳入的實參。

整個函數調用就是將實參傳遞給形參,完成計算後返回,並且列印返回值。

Python 中有很多內置的函數,比如我們之前常用的 print()len()type()id() 等等。

這些函數都是內置的,無需我們定義,所以可以直接拿來使用。

參數的傳遞

按照位置順序傳遞

參數的傳遞有很多種方式,比如剛才我們調用時使用的就是按照位置順序傳遞。

add(1, 2)

按照賦值傳遞

除了按照位置順序傳遞,我們還可以按照賦值來傳遞:

這裡我們先定義一個減法函數。

def subtraction(a, b):      return a - b      print(subtraction(b=5, a=10))

列印結果如下:

5

默認賦值

那麼除了以上兩種情況,還有沒有其他情況?

當然還有,如果參數有兩個,但是其中一個可能不會傳遞,這時我們可以給它一個默認值。

這裡我們定義一個除法:

def division(a, b=1):      return a / b      print(division(5))  print(division(10, 5))

在除法中,除數不能為 0 ,不然會報錯,這裡我們給了一個默認值是 1 ,當除數不存在的時候,我們可以取到默認值。

結果列印如下:

5.0  2.0

變長度參數傳遞(元組)

這一塊是難點,注意聽,仔細看,看完細細品。

我們先定義一個列印的函數:

def print_a(a, b):      print(a, b)

這時我們可以列印出來 a 和 b ,但是如果我現在不止想列印兩個參數了,我想列印 3 個參數,怎麼辦?

當然,我們可以給這個函數再加一個參數 c ,沒問題:

def print_a(a, b, c):      print(a, b, c)

問題又來了,如果我想列印 100 個參數怎麼辦?

emmmmmmmmm,要麼我們就加 100 個形參?

當然不是這麼寫啦,我們可以在參數 b 前面加一個 * ,表示這個參數是可變長參數,當前面的參數都賦值結束後,剩下的參數順次給這個參數賦值。

def print_a(a, *b):      print(a, b)      print_a(1, 2, 3, 4, 5, 6)

輸出結果如下:

1 (2, 3, 4, 5, 6)

看到沒,這裡剩餘的參數被轉換成了元組的形式進行了輸出列印。

變長度參數傳遞(字典)

我們還可以給這個參數前面加兩個 * ,表示這個參數可以傳遞的數據類型是以字典的形式傳遞的。

def print_b(a, **b):      print_a(a, b)      print_b(1, q='q', w='w', e='e')

列印結果如下:

1 ({'q': 'a', 'w': 'b', 'e': 'c'},)

當然,變長參數傳遞時,元組和字典也可以不存在,如下:

print_a(1)  print_b(1)

結果如下:

1 ()  1 ({},)

這時,列印出來的就是空元組和空字元串了。

希望各位同學一定要自己動手敲程式碼。

示例程式碼

本系列的所有程式碼小編都會放在程式碼管理倉庫 Github 和 Gitee 上,方便大家取用。

示例程式碼-Github

示例程式碼-Gitee