創(chuàng)建函數(shù)
函數(shù)callable在Python3.0不再可用演熟,需要使用表達(dá)式hassttr(func, call)代替衰抑。
文檔化函數(shù)
文檔字符串
>>> def square(x):
'Calculates the square of the number x.'
return x * x
>>> square.__doc__
'Calculates the square of the number x.'
上面的位于函數(shù)語句塊兒中的第一行的字符串稱為文檔字符串
文檔字符串可見于:def語句后面、模塊兒或類的開頭
函數(shù)可以返回一個(gè)以上的值,元祖中返回即可掉房。
doc是函數(shù)屬性,屬性中的雙下劃線表示屬性為特殊屬性累驮。
并非真正函數(shù)的函數(shù)
沒有return語句或者雖然有return語句但return后面沒有跟任何值的函數(shù)不返回值府怯,但如果非要接收可以接收到一個(gè)None值。
我們改變參數(shù)嗎
在函數(shù)欸為參數(shù)賦予新值不會(huì)改變?nèi)魏瓮獠孔兞康闹?br>
當(dāng)兩個(gè)變量同時(shí)引用一個(gè)列表時(shí)位岔,它們的確是同時(shí)引用一個(gè)列表如筛。如果想回避這種情況,可以復(fù)制一個(gè)列表副本抒抬。當(dāng)在程序中做切片的時(shí)候杨刨,返回的切片總是一個(gè)副本。
setdefault是Python中字典的特有方法
字典中的鍵并沒有特定的順序擦剑,所以多次打印同一個(gè)字典結(jié)果可能會(huì)不同妖胀。
關(guān)于字典和函數(shù)的一個(gè)例子
def init(dic):
dic['first'] = {}
dic['midle'] = {}
dic['last'] = {}
def lookup(dic, label, name):
return dic[label].get(name)
def storge(dic, full_name):
names = full_name.split()
if len(names) == 2: names.insert(1, ' ')
labels = 'first', 'midle', 'last'
for label, name in zip(labels, names):
people = lookup(dic, label, name)
if people:
people.append(full_name)
else:
dic[label][name] = [full_name]
if __name__ == '__main__':
dic = {}
init(dic)
my_name = 'zhang qing tian'
storge(dic, my_name)
people = lookup(dic, 'midle', 'qing')
print people
作用域
Python給變量賦值后相當(dāng)于產(chǎn)生了一個(gè)不可見字典芥颈,可以通過鍵(變量名)引用值(變量值),內(nèi)建的vars函數(shù)可以返回這個(gè)不可見字典赚抡。
>>> x = 1
>>> scape = vars()
>>> scape['x']
1
>>> scape['x'] += 1
>>> x
2
- 屏蔽引發(fā)的問題
當(dāng)有局部變量或參數(shù)和全局變量同名時(shí)會(huì)屏蔽全局變量爬坑,這是如果必須訪問全局變量,在Python中可以使用globals函數(shù)怕品,可以返回全局變量字典(locals函數(shù)返回局部變量字典)
>>> def conbin(name):
print 'hello,',name
>>> name = 'zhangsan'
>>> conbin('lisi')
hello, lisi
>>> def conbin(name):
print 'hello,',globals()['name']
>>> conbin('lisi')
hello, zhangsan
重新綁定全局變量
>>> x = 1
>>> def add():
global x
x = x + 1
>>> add()
>>> x
2
- 嵌套作用域
Python的函數(shù)是可以嵌套的妇垢,也就是可以將一個(gè)函數(shù)放到另一個(gè)里面。
>>> def multiplier(factor):
def multiplyByFactor(number):
return number * factor
return multiplyByFactor
>>> double = multiplier(2)
>>> double(2)
4
>>> multiplier(2)(2)
4
類似multiplyByFactor存儲(chǔ)子封閉區(qū)域的行為叫閉包
外部作用域的變量一般不允許重新綁定肉康,但是Python3.0提供了一個(gè)nonlocal關(guān)鍵字闯估,它的使用方式和global關(guān)鍵字類似,可以讓用戶對(duì)外部作用域變量賦值吼和。
>>> def multiplier(factor):
def multiplyByFactor(number):
nonlocal factor
factor = 1
return number * factor
return multiplyByFactor
>>> double = multiplier(2)
>>> double(2)
2
遞歸
標(biāo)準(zhǔn)庫(kù)中的bisect模塊可以很有效地實(shí)現(xiàn)二分查找
- 函數(shù)式編程
函數(shù)的使用方法和其他對(duì)象(字符串涨薪、數(shù)值、序列等)基本一樣炫乓,可以分配給變量刚夺、作為參數(shù)傳遞以及作為返回值返回。
Python中支持函數(shù)式編程的機(jī)制有:map末捣、filter和reduce(apply:被前面提到的拼接函數(shù)替代)map和filter函數(shù)在目前版本的Python中并不是特別有用侠姑,而且可以被列表推導(dǎo)式替代。map的一個(gè)很重要的功能是他可以將序列中的元素全部傳遞給一個(gè)函數(shù)
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> map(str, range(10))
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
filter函數(shù)可以以一個(gè)返回bool值的函數(shù)為準(zhǔn)箩做,過濾掉序列中不滿足條件的元素
>>> def func(x):
return x.isalnum() #判斷一個(gè)字符串是否僅僅由字母和數(shù)字組成
>>> seq = ["foo", "x41", "?!", "***"]
>>> filter(func, seq)
['foo', 'x41']
此處可以由列表推導(dǎo)式替代莽红,如下
>>> [x for x in seq if x.isalnum()]
['foo', 'x41']
lambda關(guān)鍵字可以用在此處來定義一個(gè)短小的函數(shù)
>>> filter(lambda x : x.isalnum(), seq)
['foo', 'x41']
reduce函數(shù):以一個(gè)函數(shù)為規(guī)則,作用于序列中的前兩個(gè)元素邦邦,再作用于返回值和第3個(gè)元素安吁,以此類推,直到把序列中數(shù)據(jù)遍歷完燃辖。下面是一個(gè)求和的例子
>>> number = [1, 2, 3, 4, 81, 33, 43, 88]
>>> reduce(lambda x, y : x + y, number)
255