python高级函数,将函数作为变量、返回函数
python中使用函數(shù)作為參數(shù)
在python中,我們可以用一個變量來存放函數(shù)。示例:
a = len length = a([1,2,3,4,5]) print(length)在上面我將len()函數(shù)賦值給了變量a。那么我們以后我們使用len()函數(shù)的的時候就完全可以使用a這個變量來代替了。
既然我們可以用一個變量來存放函數(shù),那么函數(shù)一可以當作一個函數(shù)的參數(shù)使用。
示例代碼:
def add(x,y,f):return f(x)+f(y)result = add(1,-2,abs) print(result)在上面的函數(shù)中,擁有3個變量,x,y表示傳入的值,f表示傳入的函數(shù)
我們在調(diào)用此函數(shù)的時候就傳入了1,-2兩個值,然后將abs函數(shù)傳入了進去,(abs()就是獲取值的絕對值)
這樣,我們就實現(xiàn)了將函數(shù)作為參數(shù)傳入?yún)?shù)中去。
再例如,我們需要求
這個表達式的值,那么我們可以這樣做:
這樣,我們就可以求出上面表達式的值了。
python中的map()函數(shù)
map()是 Python 內(nèi)置的高階函數(shù),它接收一個函數(shù) f 和一個 list,并通過把函數(shù) f依次作用在list 的每個元素上,得到一個新的 list 并返回。
例如,將一個列表中的所有值都變?yōu)樵瓉淼钠椒?/p> def func(x):return x*xnew_list = map(func,[1,2,3,4,5,6,7,8,9])for list in new_list:print(list)
需求:假設用戶輸入的英文名字不規(guī)范,沒有按照首字母大寫,后續(xù)字母小寫的規(guī)則,請利用map()函數(shù),把一個list(包含若干不規(guī)范的英文名字)變成一個包含規(guī)范英文名字的list:
輸入:['adam', 'LISA', 'barT'] 輸出:['Adam', 'Lisa', 'Bart']代碼:
def format_name(s):return s[0].upper() + s[1:].lower()new_list = map(format_name,['adam', 'LISA', 'barT']) for list in new_list:print(list)python中的reduce()函數(shù)
reduce()函數(shù)也是Python內(nèi)置的一個高階函數(shù)。reduce()函數(shù)接收的參數(shù)和 map()類似,一個函數(shù) f,一個list,但行為和 map()不同,reduce()傳入的函數(shù) f 必須接收兩個參數(shù),reduce()對list的每個元素反復調(diào)用函數(shù)f,并返回最終結(jié)果值。
在python3中,reduce()函數(shù)已經(jīng)從全局函數(shù)中移除了,放在fucntools,所以我們首先得導入從fucntools中導入reduce()函數(shù)
from functools import reducedef add1(x,y):return x+ysum = reduce(add1,[1,3,5,7,9]) print(sum)執(zhí)行上面的代碼的時候,reduce()函數(shù)會做一下計算:
上述計算實際上是對 list 的所有元素求和。雖然Python內(nèi)置了求和函數(shù)sum(),但是,利用reduce()求和也很簡單。
reduce()還可以接收第3個可選參數(shù),作為計算的初始值。如果把初始值設為100,計算:
sum = reduce(add1,[1,3,5,7,9],100)那么結(jié)果將會變成125,因為第一輪計算是:計算初始值和第一個元素:f(100, 1),結(jié)果為101。
Python內(nèi)置了求和函數(shù)sum(),但沒有求積的函數(shù),我么來嘗試一下用reduce()函數(shù)求積:
例如:
代碼:
def prod(x,y):return x*ysum = reduce(prod,[2,4,5,7,12]) print(sum)這樣就能達到我們想要的效果了。
python中filter()函數(shù)
filter()函數(shù)是 Python 內(nèi)置的另一個有用的高階函數(shù),filter()函數(shù)接收一個函數(shù) f 和一個list,這個函數(shù) f 的作用是對每個元素進行判斷,返回 True或 False,filter()根據(jù)判斷結(jié)果自動過濾掉不符合條件的元素,返回由符合條件元素組成的新list。
例如,要從一個list [1, 4, 6, 7, 9, 12, 17]中刪除偶數(shù),保留奇數(shù),首先,要編寫一個判斷奇數(shù)的函數(shù):是奇數(shù)返回True,否則返回False
def is_odd(x):return x%2 == 1然后使用filter()過濾偶數(shù):
new_list2 = filter(is_odd,[1,2,3,4,5,6,7,8,9]) for list in new_list2:print(list)這樣就能將偶數(shù)過濾掉了。
利用filter(),可以完成很多有用的功能,例如,刪除 None 或者空字符串:
def is_not_empty(s):return s and len(s.strip()) > 0new_list4 = filter(is_not_empty, ['test', None, '', 'str', ' ', 'END']) for list in new_list4:print(list)需求:請利用filter()過濾出1~100中平方根是整數(shù)的數(shù),即結(jié)果應該是:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
python中返回函數(shù)
Python的函數(shù)不但可以返回int、str、list、dict等數(shù)據(jù)類型,還可以返回函數(shù)!
示例:
def f():print('我是外層函數(shù)')def g():print('我是內(nèi)層函數(shù),被返回的函數(shù)')return gf() print('*'*10) test = f() print('*'*10) test()然后我們可以查看運行結(jié)果
可以看到,當我們執(zhí)行函數(shù)f的時候,并不會執(zhí)行里面的函數(shù)。當我們用一個變量test接收f函數(shù)的返回值時,然后再調(diào)用test()才執(zhí)行了g函數(shù)里面的代碼
需求:請編寫一個函數(shù)calc_prod(lst),它接收一個list,返回一個函數(shù),返回函數(shù)可以計算參數(shù)的乘積。
from functools import reducedef calc_prod(lst):def lazy_prod():def f(x, y):return x * yreturn reduce(f, lst, 2)return lazy_prod f = calc_prod([1, 2, 3, 4]) result = f() print(result)這樣就實現(xiàn)了我們的需求了。
python閉包
閉包本身是一個晦澀難懂的概念,在這里我們以簡單粗暴地理解為閉包就是一個定義在函數(shù)內(nèi)部的函數(shù),閉包使得變量即使脫離了該函數(shù)的作用域范圍也依然能被訪問到。
例如:
def func(x):def func1(y):return x + yreturn func1test = func(4) print(test) tes1 = test(5) print(tes1)在上面的func函數(shù)中擁有x變量,但是在func1函數(shù)中并沒有x變量,但是因為python中函數(shù)支持閉包操作,也就是在函數(shù)中定義一個函數(shù)可以訪問函數(shù)范圍之外的變量。
python中l(wèi)ambda表達式
簡單來說,編程中提到的 lambda 表達式,通常是在需要一個函數(shù),但是又不想費神去命名一個函數(shù)的場合下使用,也就是指匿名函數(shù)。其一般有如下幾種使用方式:
f= lambda x: x*x print(f(3))上面的代碼相當于
def test(x):return x*x print(test(3))參考連接:https://www.imooc.com/video/6064
總結(jié)
以上是生活随笔為你收集整理的python高级函数,将函数作为变量、返回函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 爬取百度图片的高清原图
- 下一篇: 网络流量分析软件 mysql_网络流量监