天天看點

函數

一:定義函數

1.定義函數

  • 函數代碼塊以 def 關鍵詞開頭,後接函數辨別符名稱和圓括号()。
  • 任何傳入參數和自變量必須放在圓括号中間。圓括号之間可以用于定義參數。
  • 函數的第一行語句可以選擇性地使用文檔字元串—用于存放函數說明。
  • 函數内容以冒号起始,并且縮進。
  • return [表達式] 結束函數,選擇性地傳回一個值給調用方。不帶表達式的return相當于傳回 None。

2.函數調用

1 # -*- coding: UTF-8 -*-
 2 # 定義函數
 3 def printme(str):
 4     "列印任何傳入的字元串"
 5     print str;
 6     return;
 7 
 8 # 調用函數
 9 printme("我要調用使用者自定義函數!");
10 printme("再次調用同一函數");      

3.效果

  

二:參數傳遞的問題

1.介紹

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

函數

2.程式

1 # -*- coding: UTF-8 -*-
 2 #################################################
 3 def ChangeInt( a ):
 4     a = 10
 5 b = 2
 6 ChangeInt(b)
 7 print b
 8 
 9 #################################################
10 # 可寫函數說明
11 def changeme(mylist):
12     "修改傳入的清單"
13     mylist.append([1, 2, 3, 4]);
14     print "函數内取值: ", mylist
15     return
16 # 調用changeme函數
17 mylist = [10, 20, 30];
18 changeme(mylist);
19 print "函數外取值: ", mylist      
函數

三:參數

  必備參數

  關鍵字參數

  預設參數

  不定長參數

2.必備參數

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

  就是定義的函數中有參數,調用的時候必須将參數傳遞進去。

3.關鍵字參數

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

1 # -*- coding: UTF-8 -*-
 2 #################################################
 3 # 可寫函數說明
 4 def printinfo(name, age):
 5     "列印任何傳入的字元串"
 6     print "Name: ", name;
 7     print "Age ", age;
 8     return;
 9 
10 # 調用printinfo函數
11 printinfo(age=50, name="miki");      

4.效果

函數

4.預設參數

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

1 # -*- coding: UTF-8 -*-
 2 #################################################
 3 # 可寫函數說明
 4 def printinfo(name, age=35):
 5     "列印任何傳入的字元串"
 6     print "Name: ", name;
 7     print "Age ", age;
 8     return;
 9 
10 # 調用printinfo函數
11 printinfo(name="miki");      

5.效果

函數

6.不定長參數

  你可能需要一個函數能處理比當初聲明時更多的參數。

1 # -*- coding: UTF-8 -*-
 2 # 可寫函數說明
 3 def printinfo(arg1, *vartuple):
 4     "列印任何傳入的參數"
 5     print "輸出: "
 6     print arg1
 7     for var in vartuple:
 8         print var
 9     return;
10 
11 # 調用printinfo 函數
12 printinfo(10);
13 printinfo(70, 60, 50);      

四:匿名函數

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

  • lambda隻是一個表達式,函數體比def簡單很多。
  • lambda的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。
  • lambda函數擁有自己的命名空間,且不能通路自有參數清單之外或全局命名空間裡的參數。
  • 雖然lambda函數看起來隻能寫一行,卻不等同于C或C++的内聯函數,後者的目的是調用小函數時不占用棧記憶體進而增加運作效率。
1 # -*- coding: UTF-8 -*-
2 # 可寫函數說明
3 sum = lambda arg1, arg2: arg1 + arg2;
4 
5 # 調用sum函數
6 print "相加後的值為 : ", sum(10, 20)
7 print "相加後的值為 : ", sum(20, 20)      
函數

五:全局變量與局部變量

1.global

  加上global就會變成全局變量,但是這個需要使得函數内的值指派到全局。

  如下:

1 # -*- coding: UTF-8 -*-
 2 globvar = 0
 3 
 4 def set_globvar_to_one():
 5     global globvar    # 使用 global 聲明全局變量
 6     globvar = 1
 7 
 8 def print_globvar():
 9     print(globvar)     # 沒有使用 global
10 
11 print  globvar        # 輸出 0
12 set_globvar_to_one()
13 print  globvar        # 輸出 1
14 print_globvar()       # 輸出 1,函數内的 globvar 已經是全局變量      

2.效果

函數

六:小事例

1.清單翻轉

1 # -*- coding: UTF-8 -*-
 2 def reverse(ListInput):
 3     RevList=[]
 4     for i in range (len(ListInput)):
 5         RevList.append(ListInput.pop())
 6     return RevList
 7 
 8 ListInput=[1,2,3,4,5,6]
 9 ListInput=reverse(ListInput);
10 print ListInput