函數(shù)介紹
如果在開發(fā)程序時(shí),需要某塊代碼多次,但是為了提高編寫的效率以及代碼的重用,所以把具有獨(dú)立功能的代碼塊組織為一個(gè)小模塊,這就是函數(shù)。
函數(shù)定義和調(diào)用
定義函數(shù)
格式如下:
def 函數(shù)名():
代碼
示例:
# 定義一個(gè)函數(shù),能夠完成打印信息的功能
def printInfo():
print '------------------------------------'
print ' 人生苦短,我用Python'
print '------------------------------------'
調(diào)用函數(shù)
定義了函數(shù)之后,就相當(dāng)于有了一個(gè)具有某些功能的代碼,想要讓這些代碼能夠執(zhí)行,需要調(diào)用它。調(diào)用函數(shù)很簡(jiǎn)單,通過(guò)函數(shù)名()即可完成調(diào)用。
示例:
# 定義完函數(shù)后,函數(shù)是不會(huì)自動(dòng)執(zhí)行的,需要調(diào)用它才可以
printInfo()
函數(shù)的文檔說(shuō)明
>>> def test(a,b):
... "用來(lái)完成對(duì)2個(gè)數(shù)求和"
... print("%d"%(a+b))
...
>>>
>>> test(11,22)
33
如果執(zhí)行,以下代碼:
>>> help(test)
能夠看到test函數(shù)的相關(guān)說(shuō)明:
Help on function test in module __main__:
test(a, b)
用來(lái)完成對(duì)2個(gè)數(shù)求和
(END)
函數(shù)參數(shù)
定義帶有參數(shù)的函數(shù)
def add2num(a, b):
c = a+b
print c
調(diào)用帶有參數(shù)的函數(shù)
def add2num(a, b):
c = a+b
print c
add2num(11, 22) #調(diào)用帶有參數(shù)的函數(shù)時(shí),需要在小括號(hào)中,傳遞數(shù)據(jù)
調(diào)用帶有參數(shù)函數(shù)的運(yùn)行過(guò)程:

調(diào)用函數(shù)時(shí)參數(shù)的順序:
>>> def test(a,b):
... print(a,b)
...
>>> test(1,2)
1 2
>>> test(b=1,a=2)
2 1
>>>
>>> test(b=1,2)
File "<stdin>", line 1
SyntaxError: positional argument follows keyword argument
>>>
缺省參數(shù)
調(diào)用函數(shù)時(shí),缺省參數(shù)的值如果沒(méi)有傳入,則被認(rèn)為是默認(rèn)值。下例會(huì)打印默認(rèn)的age,如果age沒(méi)有被傳入:
def printinfo( name, age = 35 ):
# 打印任何傳入的字符串
print "Name: ", name
print "Age ", age
# 調(diào)用printinfo函數(shù)
printinfo(name="miki" )
printinfo( age=9,name="miki" )
以上實(shí)例輸出結(jié)果:
Name: miki
Age 35
Name: miki
Age 9
注意:帶有默認(rèn)值的參數(shù)一定要位于參數(shù)列表的最后面。
>>> def printinfo(name, age=35, sex):
... print name
...
File "<stdin>", line 1
SyntaxError: non-default argument follows default argument
不定長(zhǎng)參數(shù)
有時(shí)可能需要一個(gè)函數(shù)能處理比當(dāng)初聲明時(shí)更多的參數(shù)。這些參數(shù)叫做不定長(zhǎng)參數(shù),聲明時(shí)不會(huì)命名。
基本語(yǔ)法如下:
def functionname([formal_args,] *args, **kwargs):
"函數(shù)_文檔字符串"
function_suite
return [expression]
加了星號(hào)( * )的變量args會(huì)存放所有未命名的變量參數(shù),args為元組;而加**的變量kwargs會(huì)存放命名參數(shù),即形如key=value的參數(shù), kwargs為字典。
示例:
>>> def fun(a, b, *args, **kwargs):
... """可變參數(shù)演示示例"""
... print "a =", a
... print "b =", b
... print "args =", args
... print "kwargs: "
... for key, value in kwargs.items():
... print key, "=", value
...
>>> fun(1, 2, 3, 4, 5, m=6, n=7, p=8) # 注意傳遞的參數(shù)對(duì)應(yīng)
a = 1
b = 2
args = (3, 4, 5)
kwargs:
p = 8
m = 6
n = 7
>>>
>>>
>>>
>>> c = (3, 4, 5)
>>> d = {"m":6, "n":7, "p":8}
>>> fun(1, 2, *c, **d) # 注意元組與字典的傳參方式
a = 1
b = 2
args = (3, 4, 5)
kwargs:
p = 8
m = 6
n = 7
>>>
>>>
>>>
>>> fun(1, 2, c, d) # 注意不加星號(hào)與上面的區(qū)別
a = 1
b = 2
args = ((3, 4, 5), {'p': 8, 'm': 6, 'n': 7})
kwargs:
引用傳參
Python中函數(shù)參數(shù)是引用傳遞(注意不是值傳遞)。對(duì)于不可變類型,因變量不能修改,所以運(yùn)算不會(huì)影響到變量自身;而對(duì)于可變類型來(lái)說(shuō),函數(shù)體中的運(yùn)算有可能會(huì)更改傳入的參數(shù)變量。
示例:
>>> def selfAdd(a):
... """自增"""
... a += a
...
>>> a_int = 1
>>> a_int
1
>>> selfAdd(a_int)
>>> a_int
1
>>> a_list = [1, 2]
>>> a_list
[1, 2]
>>> selfAdd(a_list)
>>> a_list
[1, 2, 1, 2]
函數(shù)返回值
帶有返回值的函數(shù)
想要在函數(shù)中把結(jié)果返回給調(diào)用者,需要在函數(shù)中使用return。如下:
def add2num(a, b):
c = a+b
return c
函數(shù)返回多個(gè)值
本質(zhì)其實(shí)是利用了元組。
>>> def divid(a, b):
... shang = a//b
... yushu = a%b
... return shang, yushu
...
>>> sh, yu = divid(5, 2)
>>> sh
5
>>> yu
1
四種函數(shù)的類型
函數(shù)根據(jù)有沒(méi)有參數(shù),有沒(méi)有返回值,可以相互組合,一共有4種:
- 無(wú)參數(shù),無(wú)返回值
- 無(wú)參數(shù),又反悔
- 有參數(shù),無(wú)返回值
- 有參數(shù),有返回值
函數(shù)的嵌套調(diào)用
示例:
def testB():
print('---- testB start----')
print('這里是testB函數(shù)執(zhí)行的代碼...(省略)...')
print('---- testB end----')
def testA():
print('---- testA start----')
testB()
print('---- testA end----')
testA()
結(jié)果:
---- testA start----
---- testB start----
這里是testB函數(shù)執(zhí)行的代碼...(省略)...
---- testB end----
---- testA end----
局部變量與全局變量
局部變量
- 在函數(shù)內(nèi)部定義的變量
- 不同的函數(shù),可以定義相同的名字的局部變量,但是各個(gè)不會(huì)產(chǎn)生影響
- 局部變量是為了臨時(shí)保存數(shù)據(jù)需要在函數(shù)中定義變量來(lái)進(jìn)行存儲(chǔ)
全局變量
- 在函數(shù)外邊定義的變量叫做全局變量
- 全局變量能夠在所有的函數(shù)中進(jìn)行訪問(wèn)
- 如果在函數(shù)中修改全局變量,那么就需要使用global進(jìn)行聲明,否則出錯(cuò)
- 如果全局變量的名字和局部變量的名字相同,那么使用的是局部變量的
遞歸函數(shù)
函數(shù)在內(nèi)部調(diào)用自己本身。

匿名函數(shù)
用lambda關(guān)鍵詞能創(chuàng)建小型匿名函數(shù)。這種函數(shù)得名于省略了用def聲明函數(shù)的標(biāo)準(zhǔn)步驟。
lambda函數(shù)的語(yǔ)法只包含一個(gè)語(yǔ)句,如下:
lambda [arg1 [,arg2,.....argn]]:expression
如下實(shí)例:
sum = lambda arg1, arg2: arg1 + arg2
#調(diào)用sum函數(shù)
print "Value of total : ", sum( 10, 20 )
print "Value of total : ", sum( 20, 20 )
以上實(shí)例輸出結(jié)果:
Value of total : 30
Value of total : 40
示例:
>>> def fun(a, b, opt):
... print "a =", a
... print "b =", b
... print "result =", opt(a, b)
...
>>> fun(1, 2, lambda x,y:x+y)
a = 1
b = 2
result = 3