函數是組織好的,可重複使用的,用來實作單一,或相關聯功能的代碼段。
函數能提高應用的子產品性,和代碼的重複使用率。你已經知道Python提供了許多内建函數,比如print()。但你也可以自己建立函數,這被叫做使用者自定義函數。
你可以定義一個由自己想要功能的函數,以下是簡單的規則:
函數代碼塊以 def 關鍵詞開頭,後接函數辨別符名稱和圓括号()。
任何傳入參數和自變量必須放在圓括号中間。圓括号之間可以用于定義參數。
函數的第一行語句可以選擇性地使用文檔字元串—用于存放函數說明。
函數内容以冒号起始,并且縮進。
return [表達式] 結束函數,選擇性地傳回一個值給調用方。不帶表達式的return相當于傳回 None。
def functionname( parameters ):
"函數_文檔字元串"
function_suite
return [expression]
預設情況下,參數值和參數名稱是按函數聲明中定義的順序比對起來的。
以下為一個簡單的Python函數,它将一個字元串作為傳入參數,再列印到标準顯示裝置上。
def printme( str ):
"列印傳入的字元串到标準顯示裝置上"
print str
return
定義一個函數隻給了函數一個名稱,指定了函數裡包含的參數,和代碼塊結構。
這個函數的基本結構完成以後,你可以通過另一個函數調用執行,也可以直接從Python提示符執行。
如下執行個體調用了printme()函數:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 定義函數
"列印任何傳入的字元串"
# 調用函數
printme("我要調用使用者自定義函數!")
printme("再次調用同一函數")
以上執行個體輸出結果:
在 python 中,類型屬于對象,變量是沒有類型的:
a=[1,2,3]
a="Runoob"
以上代碼中,<b>[1,2,3]</b> 是 List 類型,<b>"Runoob"</b> 是 String 類型,而變量 a 是沒有類型,她僅僅是一個對象的引用(一個指針),可以是 List 類型對象,也可以指向 String 類型對象。
在 python 中,strings, tuples, 和 numbers 是不可更改的對象,而 list,dict 等則是可以修改的對象。
<b></b>
不可變類型:變量指派 <b>a=5</b> 後再指派 <b>a=10</b>,這裡實際是新生成一個 int 值對象 10,再讓 a 指向它,而 5 被丢棄,不是改變a的值,相當于新生成了a。
可變類型:變量指派 <b>la=[1,2,3,4]</b> 後再指派 <b>la[2]=5</b> 則是将 list la 的第三個元素值更改,本身la沒有動,隻是其内部的一部分值被修改了。
python 函數的參數傳遞:
不可變類型:類似 c++ 的值傳遞,如 整數、字元串、元組。如fun(a),傳遞的隻是a的值,沒有影響a對象本身。比如在 fun(a)内部修改 a 的值,隻是修改另一個複制的對象,不會影響 a 本身。
可變類型:類似 c++ 的引用傳遞,如 清單,字典。如 fun(la),則是将 la 真正的傳過去,修改後fun外部的la也會受影響
python 中一切都是對象,嚴格意義我們不能說值傳遞還是引用傳遞,我們應該說傳不可變對象和傳可變對象。
def ChangeInt( a ):
a = 10
b = 2
ChangeInt(b)
print b # 結果是 2
執行個體中有 int 對象 2,指向它的變量是 b,在傳遞給 ChangeInt 函數時,按傳值的方式複制了變量 b,a 和 b 都指向了同一個 Int 對象,在 a=10 時,則新生成一個 int 值對象 10,并讓 a 指向它。
# 可寫函數說明
def changeme( mylist ):
"修改傳入的清單"
mylist.append([1,2,3,4])
print "函數内取值: ", mylist
# 調用changeme函數
mylist = [10,20,30]
changeme( mylist )
print "函數外取值: ", mylist
執行個體中傳入函數的和在末尾添加新内容的對象用的是同一個引用,故輸出結果如下:
以下是調用函數時可使用的正式參數類型:
必備參數
關鍵字參數
預設參數
不定長參數
必備參數須以正确的順序傳入函數。調用時的數量必須和聲明時的一樣。
調用printme()函數,你必須傳入一個參數,不然會出現文法錯誤:
#可寫函數說明
#調用printme函數
printme()
關鍵字參數和函數調用關系緊密,函數調用使用關鍵字參數來确定傳入的參數值。
使用關鍵字參數允許函數調用時參數的順序與聲明時不一緻,因為 Python 解釋器能夠用參數名比對參數值。
以下執行個體在函數 printme() 調用時使用參數名:
printme( str = "My string")
下例能将關鍵字參數順序不重要展示得更清楚:
def printinfo( name, age ):
print "Name: ", name
print "Age ", age
#調用printinfo函數
printinfo( age=50, name="miki" )
調用函數時,預設參數的值如果沒有傳入,則被認為是預設值。下例會列印預設的age,如果age沒有被傳入:
def printinfo( name, age = 35 ):
printinfo( name="miki" )
你可能需要一個函數能處理比當初聲明時更多的參數。這些參數叫做不定長參數,和上述2種參數不同,聲明時不會命名。基本文法如下:
def functionname([formal_args,] *var_args_tuple ):
加了星号(*)的變量名會存放所有未命名的變量參數。不定長參數執行個體如下:
def printinfo( arg1, *vartuple ):
"列印任何傳入的參數"
print "輸出: "
print arg1
for var in vartuple:
print var
# 調用printinfo 函數
printinfo( 10 )
printinfo( 70, 60, 50 )
python 使用 lambda 來建立匿名函數。
lambda隻是一個表達式,函數體比def簡單很多。
lambda的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。
lambda函數擁有自己的命名空間,且不能通路自有參數清單之外或全局命名空間裡的參數。
雖然lambda函數看起來隻能寫一行,卻不等同于C或C++的内聯函數,後者的目的是調用小函數時不占用棧記憶體進而增加運作效率。
lambda函數的文法隻包含一個語句,如下:
如下執行個體:
sum = lambda arg1, arg2: arg1 + arg2
# 調用sum函數
print "相加後的值為 : ", sum( 10, 20 )
print "相加後的值為 : ", sum( 20, 20 )
return語句[表達式]退出函數,選擇性地向調用方傳回一個表達式。不帶參數值的return語句傳回None。之前的例子都沒有示範如何傳回數值,下例便告訴你怎麼做:
def sum( arg1, arg2 ):
# 傳回2個參數的和."
total = arg1 + arg2
print "函數内 : ", total
return total
total = sum( 10, 20 )
一個程式的所有的變量并不是在哪個位置都可以通路的。通路權限決定于這個變量是在哪裡指派的。
變量的作用域決定了在哪一部分程式你可以通路哪個特定的變量名稱。兩種最基本的變量作用域如下:
全局變量
局部變量
定義在函數内部的變量擁有一個局部作用域,定義在函數外的擁有全局作用域。
局部變量隻能在其被聲明的函數内部通路,而全局變量可以在整個程式範圍内通路。調用函數時,所有在函數内聲明的變量名稱都将被加入到作用域中。如下執行個體:
total = 0 # 這是一個全局變量
#傳回2個參數的和."
total = arg1 + arg2 # total在這裡是局部變量.
print "函數内是局部變量 : ", total
#調用sum函數
sum( 10, 20 )
print "函數外是全局變量 : ", total