python入門教程(三)——函數

本教程根據《python編程快速上手》製作,如需轉載,請註明出處。

函數的一個主要目的就是將需要多次執行的代碼放在一起。這樣如果需要修改就會很方便,不用每個地方都要改,只要該函數內部即可。

一、定義函數的格式

需要以下幾點:


  1. def關鍵字
  2. 函數名和括號,可能還包括參數
  3. 冒號
  4. 縮進的函數體

例子1:

執行結果:

第一行是 def 語句,它定義了一個名爲 hello()的函數。def 語句之後的代碼塊是函數體。函數之後的 hello()語句行是函數調用。


例子2:

執行結果:

例子2定義了一個帶參數的函數。在這個程序的 hello()函數定義中,有一個名爲 name 的變元。“變元”是一個變量,當函數被調用時,參數就存放在其中。當調用函數時,就把傳入的參數賦值給這個“變元”。

二、返回值和return語句

一般來說,函數調用求值的結果,稱爲函數的“返回值”。

用 def 語句創建函數時,可以用 return 語句指定應該返回什麼值。return 語句包含以下部分:


  1. return 關鍵字;
  2. 函數應該返回的值或表達式

如果在 return 語句中使用了表達式,返回值就是該表達式求值的結果。

例子1:

請注意,因爲可以將返回值作爲參數傳遞給另一個函數調用。

因此最後三行可以寫成一行。如下:

三、None值

在 Python 中有一個值稱爲 None,它表示沒有值。None 是 NoneType 數據類型的唯一值(其他編程語言可能稱這個值爲 null、nil 或 undefined)。就像布爾值 True和 False 一樣,None 必須大寫首字母 N。

在幕後,對於所有沒有 return 語句的函數定義,Python 都會在末尾加上 return None。

四、關鍵字參數和print()

大多數參數是由它們在函數調用中的位置來識別的。

例如:

我把random.randint中小的數放在後面,就會報錯。

但是,“關鍵字參數”是由函數調用時加在它們前面的關鍵字來識別的。關鍵字參數通常用於可選變元。這在後面會碰到很多。

例如,print()函數有可選的變元 end 和 sep,分別指定在參數末尾打印什麼,以及在參數之間打印什麼來隔開它們。


例子1:

執行結果:

這兩個字符串出現在獨立的兩行中,因爲 print()函數自動在傳入的字符串末尾添加了換行符。但是,可以設置 end 關鍵字參數,將它變成另一個字符串。


例子2:

執行結果:


例子3:

如果向 print()傳入多個字符串值,該函數就會自動用一個空格分隔它們。


例子4:

你可以傳入 sep 關鍵字參數,替換掉默認的分隔字符串。就如同上面的逗號分隔開一樣。

五、局部和全局作用域

這又是老生常談的話題了。以前看C語言看了好多遍,python之中的原理也是類似的。

在被調用函數內賦值的變元和變量,處於該函數的“局部作用域”。在所有函數之外賦值的變量,屬於“全局作用域”。處於局部作用域的變量,被稱爲“局部變量”。處於全局作用域的變量,被稱爲“全局變量”。一個變量必是其中一種,不能既是局部的又是全局的。

可以將“作用域”看成是變量的容器。當作用域被銷燬時,所有保存在該作用域內的變量的值就被丟棄了。只有一個全局作用域,它是在程序開始時創建的。如果程序終止,全局作用域就被銷燬,它的所有變量就被丟棄了。否則,下次你運行程序的時候,這些變量就會記住它們上次運行時的值。

一個函數被調用時,就創建了一個局部作用域。在這個函數內賦值的所有變量,存在於該局部作用域內。該函數返回時,這個局部作用域就被銷燬了,這些變量就丟失了。下次調用這個函數,局部變量不會記得該函數上次被調用時它們保存的值。

1、局部變量不能在全局作用域內使用

例子1:

執行結果:

所以,如果在全局變量中調用局部變量中的參數,就會報錯,名稱沒有定義。因爲函數調用的時候,eggs變量被創建,調用完成之後,eggs變量就銷燬了。因此全局變量中無法再進行訪問了。

2、局部作用域不能使用其他局部作用域內的變量

例子2:

調用spam()函數時的eggs是其內部定義的那個99的值,與bacon中定義的eggs沒有關係,並不受其影響。

3、全局變量可以在局部作用域中讀取

例子3:

首先調用spam()函數,打印全局變量中的eggs,然後調用第5行的print()函數打印出結果。

以上,說明了局部作用域可以訪問全局變量,但這是有條件的。

4、名稱相同的局部變量和全局變量

例子4:稍微改了一下例子3的程序

全局作用域定義了一個eggs,spam()函數的局部作用域內也定義了一個eggs,然後spam()函數內的print()函數打印的是50,說明同名的局部變量屏蔽了同名的全局變量在局部中的訪問

5、global關鍵字

如果需要在一個函數內修改全局變量,就使用 global 語句。

例子5:

執行結果:

自己體會下,不是全局作用域訪問量局部變量,而是在局部作用域內通過聲明global,進而修改了全局變量。

6、如何區分局部變量和全局變量

六、異常處理

先舉個例子:

執行結果:

也就是除數爲0的那個錯誤。

然而一般用戶是看不懂這些錯誤的,你好不容易開發個程序,結果用戶已用,就出這種賊長的bug提示,還看不懂,這很不友好。聰明的程序員應該事先檢查可能出錯的地方,並作出相應的處理。然後就需要try 和except這對關鍵字了。

錯誤可以由 try 和 except 語句來處理。那些可能出錯的語句被放在 try 子句中。如果錯誤發生,程序執行就轉到接下來的 except 子句開始處。

再看下面這個例子。

執行結果:

這樣是不是跟剛纔比,友好多了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章