python函數式編程

來源:互聯網
上載者:User

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
>>>

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.