標籤:
本節將學習如何用Python定義函數,調用函數,以及學習匿名函數的使用
1.定義函數
Python中定義函數用關鍵字def,如下例所示,testFun為函數名
def testFun():
print "hello world"
2.函數參數
一個函數可以有0個或多個形式參數:
def testAdd(x,y):
print x+y
函數的形式參數值可以初始化,使用了初始值的參數,在調用的時候可以不需要指定該參數。
def testSum(z,x=1,y=0):
print x+y+z
調用函數:
testSum(3) # 將列印出:4
testSum(10,y=1) # 將列印出:12
testSum(y=1,x=2,z=10) #將列印出:13
注意:定義函數時,沒有初始化的形式參數必須放在初始化形式參數的前面,否則會報錯
調用函數時,必須指定未初始化的參數,且參數的順序要與函數定義的參數順序一致(除非調用時指定了參數名)
3.函數傳回值
Python函數可以通過return語句返回函數值,如果沒有return語句或者return語句後什麼都沒有,函數將返回:None
def testSub(x,y):
return x-y
調用函數:
x=testSub(10,2)
print x #將列印出:8
4.字典和元組形式的函數參數
Python函數的形式參數個數有時候不確定,這時候,我們可以使用*args或**args的形式參數。*args以元組的形式接收參數,而**args以字典的形式接收參數,當兩者都存在時,定義函數時,*args必須定義在**args前面
字典形參(**args)例子:
def testDict(a,**b):
print ‘a is:‘,a
print ‘b is:‘,b
調用函數方法一:
tict={‘x‘:1,‘y‘:2,‘z‘:3}
testDict(10,**tict)
調用函數方法二:
testDict(10,x=1,y=2,z=3)
輸出結果:
>>>
a is: 10
b is: {‘y‘: 2, ‘x‘: 1, ‘z‘: 3}
元組形參(*args)例子:
def testTuple(a,*b):
print ‘a is :‘ ,a
print b
調用函數方法一:
tup=(‘a‘,1,2,‘b‘)
testTuple(1,*tup)
調用函數方法二:
testTuple(1,‘a‘,1,2,‘b‘)
輸出結果:
>>>
a is : 1
(‘a‘, 1, 2, ‘b‘)
5.匿名函數
Python可以用關鍵字lambda定義一個匿名函數,當需要一個函數類型的對象時,可以建立一個匿名函數來實現
def testLambda(x):
return lambda x:x+y #這裡將返回一個函數對象
函數調用:
f=testLambda(10) #建立了一個函數對象:f
print f(5) #將會列印出:15
6.要點記錄
當多次調用一個具有初始化參數的函數時,該參數只會在第一次調用時被初始化一次。 這使得當形式參數為可變對象,如:列表、字典或者類的執行個體時,其結果可能和我們預期的不一樣:
def testParam(x=[]):
x.append(10)
print x
多次調用函數(可能我們希望調用函數的結果是:都列印出列表[10]):
testParam()
testParam()
testParam()
testParam()
實際輸出結果:
>>>
[10]
[10, 10]
[10, 10, 10]
[10, 10, 10, 10]
當形式參數為不可變對象時,又是怎樣的情況呢?我們再觀察另一個例子:
def testParam(x=2):
x=x+2
print x
調用函數:
testParam()
testParam()
testParam()
testParam()
實際輸出結果:
>>>
4
4
4
4
備忘:
python中,萬物皆對象。
python中不存在所謂的傳值調用,一切傳遞的都是對象的引用,也可以認為是傳址。
不可變對象(immutable):int、字串(string)、float、(數值型number)、元組(tuple)
可變對象(mutable):字典型(dictionary)、列表型(list)、類的執行個體
Python 學習筆記(第4課)