天天看點

小朋友學Python(15):函數

函數是組織好的、可重複使用的、用來實作單一或相關聯功能的代碼段。

函數能提高應用的子產品性,和代碼的重複使用率。

Python提供了許多内建函數,比如print()。但程式設計人員也可以自己建立函數,這叫做使用者自定義函數。

一、定義一個函數

你可以定義一個由自己想要功能的函數,以下是簡單的規則:

函數代碼塊以 def 關鍵詞開頭,後接函數辨別符名稱和圓括号()。

任何傳入參數和自變量必須放在圓括号中間。圓括号之間可以用于定義參數。

函數的第一行語句可以選擇性地使用文檔字元串—用于存放函數說明。

函數内容以冒号起始,并且縮進。

return [表達式] 結束函數,選擇性地傳回一個值給調用方。不帶表達式的return相當于傳回 None。

例1

def printme( str ):
   " Print input string "
   print str
   return      

二、函數調用

定義一個函數隻是給了函數一個名稱,指定了函數裡包含的參數,和代碼塊結構。

這個函數的基本結構完成以後,可以通過另一個函數調用執行,也可以直接從Python提示符執行。

例2

# define function 
def printme( str ):
   "Print input string"
   print str;
   return;

# invoke function
printme("invoke self defined function!");
printme("invoke the same function again");      

運作結果:

invoke self defined function!
invoke the same function again!      

三、參數傳遞

在 python 中,類型屬于對象,變量是沒有類型的:

a = [1,2,3]

a = "Newbie"      

以上代碼中,[1,2,3] 是 List 類型,”Newbie” 是 String 類型,而變量 a 是沒有類型,它僅僅是一個對象的引用(一個指針),可以是 List 類型對象,也可以指向 String 類型對象。

(一)可更改(mutable)與不可更改(immutable)對象

在 python 中,strings, tuples, 和 numbers 是不可更改的對象,而 list,dict 等則是可以修改的對象。

不可變類型:變量指派 a=5 後再指派 a=10,這裡實際是新生成一個 int 值對象 10,再讓 a 指向它,而 5 被丢棄,不是改變a的值,相當于新生成了a。

可變類型:變量指派 la=[1,2,3,4] 後再指派 la[2]=5 則是将 list la 的第三個元素值更改,本身la沒有動,隻是其内部的一部分值被修改了。

(二)python 函數的參數傳遞

不可變類型:類似 c++ 的值傳遞,如 整數、字元串、元組。如fun(a),傳遞的隻是a的值,沒有影響a對象本身。比如在 fun(a)内部修改 a 的值,隻是修改另一個複制的對象,不會影響 a 本身。

可變類型:類似 c++ 的引用傳遞,如 清單,字典。如 fun(la),則是将 la 真正的傳過去,修改後fun外部的la也會受影響

(三)python 傳不可變對象的例子

例3

def ChangeInt( a ):
    a = 10

b = 2
ChangeInt(b)
print      

運作結果:

2      

(四)傳可變對象例子

例4

def changeme( mylist ):
    "modify input list"
    mylist.append([1,2,3]);
    print mylist
    return

mylist = [10,20,30];
changeme( mylist );
print      

因為list是可變對象,是以函數内外的mylist指向了同一個對象,值自然也就相同。故運作結果如下:

[10, 20, 30, [1, 2, 3]]
[10, 20, 30, [1, 2, 3]]      

四、參數類型

以下是調用函數時可使用的正式參數類型:

必備參數

關鍵字參數

預設參數

不定長參數

(一)必備參數

必備參數須以正确的順序傳入函數。調用時的數量必須和聲明時的一樣。

調用printme()函數,你必須傳入一個參數,不然會出現文法錯誤:

例5

def printme( str ):
   print str;
   return;

printme();      

運作結果:

Traceback (most recent call last):
  File "test.py", line 5 in <module>
    printme();      

(二)關鍵字參數

關鍵字參數和函數調用關系緊密,函數調用使用關鍵字參數來确定傳入的參數值。

使用關鍵字參數允許函數調用時參數的順序與聲明時不一緻,因為 Python 解釋器能夠用參數名比對參數值。

以下執行個體在函數 printme() 調用時使用參數名做為關鍵字:

例6

def printme( str ):
   print str;
   return;

printme( str = "Hello World!");      

運作結果:

Hello World!      

注意,這裡str是關鍵字,是以不能改為别的名稱。以下都是錯的:

s = “Hello World!”
abc = “Hello World!”      

下例能将關鍵字參數順序不重要展示得更清楚:

例7

def printinfo( name, age ):
   print "Name: ", name;
   print "Age: ", age;
   return;

printinfo( age=9, name="Theodore"      

運作結果:

Name: Theodore
Age: 9      

(三)預設參數

調用函數時,預設參數的值如果沒有傳入,則被認為是取預設值。

例8

def printinfo( name, age = 18:
   print "Name: ", name
   print "Age ", age;
   return;

printinfo( age=9, name="Theodore" )
printinfo( name="Li Lei"      

運作結果:

Name: Theodore
Age: 9
Name: Li Lei
Age: 18      

(四)不定長參數

你在定義函數時可能事先不知道函數被調用時會傳入多少個參數,這時你可以聲明不定長參數。

不定長參數聲明時不會命名,基本文法如下:

def functionname([formal_args,] *var_args_tuple ):
   "函數說明"
   function_suite
   return      

加了星号的變量名會存放所有未命名的變量參數。

例9

def printinfo( arg1, *vartuple ):
   print arg1
   for var in vartuple:
      print var
   return

printinfo( 10 )
printinfo( 70, 60, 50      

運作結果:

10
70
60
50      

五、匿名函數

python 使用 lambda 來建立匿名函數。

lambda隻是一個表達式,函數體比def簡單很多。

lambda的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。

文法

lambda函數的文法隻包含一個語句,如下:

lambda [arg1 [,arg2,.....argn]]:expression      

例10

sum = lambda arg1, arg2: arg1 + arg2;
print sum( 10, 20 )
print sum( 20, 20      

運作結果:

30
40      
更多内容請關注微信公衆号