1 callable內建函數判斷一個名字是否為一個可調用函數
>>> import math>>> x = 1>>> y = math.sqrt>>> callable(x)False>>> callable(y)True
2 記錄函數(文檔字串)
>>> def square(x): 'calculates the square of number x' return x * x>>> square.func_doc'calculates the square of number x'
3 形式參數,實際參數,我能改變參數嗎--字串,數字,元組三者跟序列是有區別的
參數儲存在局部範圍
4 關鍵字參數和預設值
>>> def say_hello(greeting = 'hello',name = 'jmz',biaodian = '!!!'): print '%s,%s%s' % (greeting,name,biaodian)#這樣去調用都可以 >>> say_hello()hello,jmz!!!>>> say_hello(name = 'yyer',biaodian = '~~~')hello,yyer~~~>>> say(name = 'yyer',greeting = 'hi,hi')>>> say_hello(name = 'yyer',greeting = 'hi,hi')hi,hi,yyer!!!
5 收集參數
1)將參數收集為元組
例子1:
>>> def print_params(*params): print params >>> print_params('param1')('param1',)>>> print_params('param1','param2','param3')('param1', 'param2', 'param3')>>>>>>
例子2:
>>> def print_params_2(title,*params): print title print params>>> print_params_2('title',1,2,3,4,5)title(1, 2, 3, 4, 5)
2)將參數收集為字典:
>>> def print_params_4(x,y,z = 3,*pp,**ppp): print x,y,z print pp print ppp >>> print_params_4(1,2,4,'pp1','pp2','pp3',ppp1 = 'aaa',ppp2 = 'bbb')1 2 4('pp1', 'pp2', 'pp3'){'ppp1': 'aaa', 'ppp2': 'bbb'}>>>
3) 收集參數方式的函數調用
>>> def hello(**params): print params['greeting'],params['name'] >>> params = {'greeting':'Hello','name':'JMZ'}>>> hello(**params)Hello JMZ>>>
6 範圍
1)到底什麼是變數,你可以把它看作是值的名字,就像字典一樣,鍵引用值,在執行a = (1,2,3)的時候就把名字引用到元組上。事實上,這已經很接近真實情況,變數和所對應的值是個不可見的字典。
內建的vars()函數可以返回這個字典:
IDLE 2.6.5 ==== No Subprocess ====
>>> vars()
{'__builtins__': <module '__builtin__' (built-in)>, '__file__': '/usr/bin/idle-python2.6', '__package__': None, '__name__': '__main__', 'main': <function main at 0xb6cc1f44>, '__doc__': None}
>>> def printhello():
print 'hello world'
>>> x = 1
>>> a = (1,2,3)
>>> vars()
{'a': (1, 2, 3), 'printhello': <function printhello at 0x9fea6bc>, '__builtins__': <module '__builtin__' (built-in)>, '__file__': '/usr/bin/idle-python2.6', '__package__': None, 'x': 1, '__name__': '__main__', 'main': <function main at 0xb6cc1f44>, '__doc__': None}
>>> vars()['a']
(1, 2, 3)
>>>
2)局部變數與全域變數
在函數內部可以直接引用全域變數,但是要謹慎,過多的使用全部變數容易出錯。
名字屏蔽問題:
如果函數內部局部變數與外部的全域變數名字一樣,這時引用的將是局部變數,可以用globals()函數來擷取全域變數的字典,globals()返回全部變數的字典。globals()['var1']即可返回全域變數var1的值
3)嵌套範圍
在python中,可以在函數內部定義函數:
>>> def outFunction(outVar):
a = 2
def inFunction(inVar):
return outVar * inVar * a
return inFunction
>>> inFunc = outFunction(5)
>>> inFunc(4)
40
>>>
在什麼地方有用:當需要用一個out函數來建立一個in函數時。
規則:out函數的傳回值是一個函數,它返回了in函數這個函數本身。重要的是:返回的函數還可以訪問它的定義所在的範圍,即:返回的內層函數帶著它的環境+它自身的局部變數。
7 函數式編程---一些有用的函數
1)使用map函數將序列中的元素全部傳遞給一個函數:
map(function,序列)
2)使用filter函數可以給予一個返回布爾值的函數對元素進行過濾:
>>> def func(x):
return x.isalnum()
>>> seq = ['foo','x41','!***']
>>> filter(func,seq)
['foo', 'x41']
>>>
當然,也可以使用列表推導式:
>>> [x for x in seq if x.isalnum()]
['foo', 'x41']
3)lambda運算式特性建立短小函數:
>>> filter(lambda x:x.isalnum(),seq)
['foo', 'x41']
4)reduce函數
reduce(func,seq)將一個序列的前兩個元素與給定的函數聯合使用,並且將他們的傳回值與第三個元素繼續聯合和使用,知道整個序列處理完畢:
>>> seq = [1,2,4,6,7,12,23]
>>> reduce(lambda x,y:x + y,seq)
55
>>>