您好,登錄后才能下訂單哦!
函數式編程
面向過程的程序設計
基本單元,函數
函數時編程:允許把函數本身作為參數傳入另一個函數,還允許返回一個函數!
高階函數
abs(-10)是函數調用,abs是函數本身
要獲得調用結果,我們可以把結果賦值給變量
也可以把函數本身賦給變量,即變量指向函數,這樣可以實現通過變量來調用函數
>>> abs
>>> f=abs
>>> f(-10)
10
說明變量f現在已經指向了abs函數本身,直接調用abs()函數和調用f()完全相同
函數名也是變量
函數名就是指向函數的變量,
如果把abs指向其他對象呢?
>>> abs(-2)
Traceback (most recent call last):
File "", line 1, in
TypeError: 'int' object is not callable
指向其他對象后,就暫時沒有原來功能了
傳入函數
高階函數,在一個函數中能調用另一個函數
map/reduce
map
>> def f(x):
... return x * x
...
>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]
map()傳入的第一個參數是函數對象f,
L = []
for n in [1, 2, 3, 4, 5, 6, 7, 8, 9]:
L.append(f(n))
print(L)
reduce 看官網吧
filter
正確實現篩選功能
用于過濾序列,例如刪掉偶數只保留奇數,把一個序列的空字符串去掉
def not_empty(s):
return s and s,strip()
list(filter(not_empty,['A','','B',None ,'c','d']))
#結果是 ['A','b','c']
sorted(排序算法)
內置sorted()函數可以對list排序
>>> sorted([1,2,7,6,5,4])
[1, 2, 4, 5, 6, 7]
sorted()函數也是一個高階函數,他還可以接收一個key函數來實現自定義的排序,例如按照絕對值大小排序
>>> sorted([3,5,-1,-2],key=abs)
[-1, -2, 3, 5]
key指定的函數將作用在list的每一個元素上,并根據key函數返回的結果進行排序,對比原來的list和經過key=abs處理過的lsit:
>>> sorted([3,5,-1,-2],key=abs)
[-1, -2, 3, 5]
然后按照key進行排序
sort也可以給字符串排序
>>> sorted(['bob', 'about', 'Zoo', 'Credit'])
['Credit', 'Zoo', 'about', 'bob']
按照accii碼值來排序的
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
['about', 'bob', 'Credit', 'Zoo']
要進行反向排序,不必改動key,可以傳入的三個參數reverse=Ture
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
['Zoo', 'Credit', 'bob', 'about']
高階函數的抽象能力是非常強大的,而且核心代碼可以保持非常簡潔
函數作為返回值
寫完一個求和函數后,不需要立刻求和,而是在后面的代碼中根據需要再計算怎么辦,可以不返回求和的結果,而是返回求和的函數
返回函數沒有立刻執行,而是在主函數中調用了才被執行
閉包無錫看婦科的醫院 http://www.ytsgfk120.com/
在IDLE中寫程序的時候要在最后加上print(),因為他不是交互環境!!!
def count():
fs = []
for i in range(1, 4):
def f():
return i*i
fs.append(f)
return fs
f1,f2,f3= count()#借用count來調用函數!!!
print(f1())
print(f2())
print(f3())
牢記:
返回函數不要引用任何的循環變量,或者后續會發生變化的變量
如果一定要引用循環變量,需要再創建一個函數,用該函數的參數綁定循環變量的值
def count():
def f(j):
def g():
return j*j
return g
fs=[]
for i in range(1,4):
fs.append(f(i))#f立刻被執行,因此i的當前值被傳入f()
return fs
f1,f2,f3 = count()
print(f1())
print(f2())
缺點:代碼較長,可利用lambda函數縮短代碼
小結:
一個函數可以返回一個計算結果,也可以返回一個函數。
返回一個函數時,牢記該函數并未執行,返回函數中不要引用任何可能會變化的量。
匿名函數
好處:因為函數沒有名字,不必擔心函數名沖突
沒有return語句
s=list(map(lambda x:x*x,[1,2,3,4,5,6,7,8,9]))
print(s)
實際上就是
def f(x):
return x*x
關鍵字lambda表示匿名函數,冒號前面的x表示函數參數
匿名函數有個限制,就是只能有一個表達式,不用寫return語句,返回值就是該表達式的結果
匿名函數也是一個函數對象,可以把匿名函數賦給一個變量,再利用變量+參數 來調用函數,
f=lambda x:x*x
print(f(4))
可以把匿名函數作為返回值返回
裝飾器
在代碼運行期間動態增加功能的方式,稱之為“裝飾器”decoator
偏函數
int轉換其他類型的時候,默認按十進制轉換
要想轉化為二進制 int(x,base=2)
如果嫌一直寫太麻煩,可以定義一個函數啊
def int2(x,base=2):
return int(x,base)
偏函數
functools.partial幫助我們創建一個偏函數,不需要我們自己定義int2(),可以直接使用下面的代碼創建一個新的函數
import functools
int2=functools.partial(int base=2)
int2('100000')
64
funtools.partial的作用就是,把一個函數的某些參數給固定住(也就是設置默認值),返回一個新的函數,調用這個新函數會更簡單。
小結:
當函數的參數過多,需要簡化時,使用functools.partial可以創建一個新的函數,這個新函數可以固定住原函數的部分參數,從而在調用的時候更簡單。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。