python學習筆記 函數

一等函數

在python中,函數是一等對象。編程語言理論家把「一等對象」定義爲知足如下條件的程序實體:python

  • 在運行時建立
  • 能賦值給變量或數據結構中的元素
  • 能做爲參數傳給函數
  • 能做爲函數的返回結果

在python中,整數、字符串和字典都是一等對象,沒有什麼特別之處。編程

標題「一等函數」是「把函數視做一等對象」的簡稱,雖然並不完美,但只是一種稱謂。數據結構

>>> def factorial(n):
...     '''returns n'''
...     return 1 if n < 2 else n * factorial(n - 1)
...
>>> factorial(42)
1405006117752879898543142606244511569936384000000000
>>> type(factorial)
<class 'function'>
>>> fact = factorial
>>> fact
<function factorial at 0x00000228D7391EA0>
>>> fact(5)
120
>>> map(factorial, range(11))
<map object at 0x00000228D92236D8>
>>> list(map(factorial, range(11)))
[1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]
>>>

程序中定義了一個階乘函數 factorial, 其自己是一個遞歸函數,能夠理解爲函數能夠做爲函數的返回值(的一部分),能夠作正常運算,也能夠複製給另外一個變量fact,也能夠做爲高等函數map 的一個參數。app

高等函數

接受函數做爲參數,或者把函數做爲結果返回的函數是高等函數編程語言

python中經常使用的高等函數包括map, filter, sorted, reduce等等函數

>>> fruits = ['strawberry', 'apple', 'banana', 'peach', 'fig', 'cherry']
>>> sorted(fruits)
['apple', 'banana', 'cherry', 'fig', 'peach', 'strawberry']
>>> def reverse(word):
...     return word[::-1]
...
>>> reverse('testing')
'gnitset'
>>> sorted(fruits, key=reverse)
['banana', 'apple', 'fig', 'peach', 'strawberry', 'cherry']

sorted 是一個高級函數,其能夠接受函數 reverse 做爲參數ui

>>> from functools import reduce
>>> from operator import add
>>> reduce(add, range(100))
4950
>>> sum(range(100))
4950

從python3.0 起,reduce再也不是內置函數,其做用被減弱,可輕易被替代。上例是計算0~99 的和。sum 和 reduce 的通用思想是把某個操做連續運用到序列的元素上,累積計算,把一系列值規約成一個值。code

匿名函數

lambda關鍵字在python表達式內建立匿名函數對象

然而,python簡單的句法限制了 lambda 函數的定義體只能使用純表達式,即lambda 函數的定義體中不能賦值,不能使用while、try等python語句。遞歸

匿名函數適合用於做爲函數的參數

>>> fruits
['strawberry', 'apple', 'banana', 'peach', 'fig', 'cherry']
>>> sorted(fruits, key=lambda word: word[::-1])
['banana', 'apple', 'fig', 'peach', 'strawberry', 'cherry']
相關文章
相關標籤/搜索