Python笔记(2)函数
python中一切皆對(duì)象,函數(shù)也看做對(duì)象。函數(shù)被函數(shù)名所引用,但是同樣的他也可以被其他標(biāo)識(shí)符所引用,可以作為參數(shù)傳遞。
def f():return "hi"
可見(jiàn)a引用了函數(shù)返回值,b引用了函數(shù)本身,a不可調(diào)用,b可調(diào)用。而函數(shù)作為參數(shù),即引用函數(shù)本身,下面的裝飾器就是以函數(shù)作為參數(shù),引用的函數(shù)本身,而不是返回值。
常用的幾個(gè)內(nèi)建函數(shù)Map,Reduce,Filter,lamda。
Filter
篩選出滿足過(guò)濾條件的元素
s = "@431$%$314&6i7(431)^&^%2l#%^i6861642k765e&$%65%^$^#$p%^&*%66757y%*^&%th%*&^%&^$o$&*^n4637"
print filter(str.isalpha,s)
Map
接收兩個(gè)參數(shù),第一個(gè)是函數(shù),第二個(gè)是list,返回結(jié)果
l = [random.randint(0,100) for i in range(10)]def sub50(a):return a-50print map(sub50,l) Reduce?
和map一樣接收兩個(gè)參數(shù),但是他返回一個(gè)結(jié)果,會(huì)迭代第二個(gè)參數(shù)list,不停的計(jì)算。
# 1+2+3+...+99
def f_add(a,b):return a+b
print reduce(f_add,range(1,100))
python3中Reduce被從全局命名空間中移除,要想使用需要--from functools import reduce,在函數(shù)式中reduce所表達(dá)的概念稱為規(guī)約fold。
?這里的map reduce和大數(shù)據(jù)中的map reduce不是一回事。
Lambda
lambda就是一個(gè)匿名函數(shù),在需要一個(gè)函數(shù),但是不用費(fèi)力起名字的時(shí)候用lambda.
map(lambda x:x*x, [x for x in range(10)])
##等價(jià)于
def pf(x):return x * xmap(pf, [x for x in range(10)])
map,filter,reduce并沒(méi)有列表解析容易理解,3里面返回的是一個(gè)iterator而不再是一個(gè)list。
回調(diào) CallBack?也即函數(shù)作為參數(shù),運(yùn)行到callback()返回上一層
閉包c(diǎn)losure
綁定外部變量的函數(shù)
閉包和裝飾器 都是函數(shù)作為返回值
def pow_x(x):def echo(value):return value**xreturn echolst = [pow_x(2),pow_x(3),pow_x(4)]
for p in lst:print "closure",p(2) 1.嵌套函數(shù)
2.內(nèi)部函數(shù)用了外部變量
3.外部函數(shù)返回了內(nèi)部函數(shù)
如果外部變量是list,是可以改變的。但是只是一個(gè)變量,是無(wú)法改變的。
函數(shù)內(nèi)部要注意LEGB原則,有局部變量的時(shí)候,就不再調(diào)用外部變量。
裝飾器decorator
裝飾就是在原有函數(shù)的基礎(chǔ)上,加一些其他的功能,他是函數(shù)作為返回值,函數(shù)作為參數(shù)的一種應(yīng)用。
多層嵌套就是用了閉包,被修飾函數(shù)作為綁定量。
兩層嵌套結(jié)構(gòu)
目標(biāo)函數(shù)可以帶參數(shù)
def time_cost(f):def _f(*arg, **kwarg):start = time.clock()a=f(*arg,**kwarg)end = time.clock()print f.__name__,"run cost time is ",end-startreturn areturn _f@time_cost
def list_comp(length):return [(x,y) for x in range(length) for y in range(length) if x*y > 25]if __name__ == '__main__':list_comp(1000)
三層嵌套結(jié)構(gòu)
不僅目標(biāo)函數(shù)可以帶參數(shù),裝飾器也可以帶參數(shù)
遞歸
遞歸就是1)函數(shù)自己調(diào)用自己2)有明確的出口。常用于Fibonacci數(shù)列,樹(shù)圖的遍歷等數(shù)據(jù)或是結(jié)構(gòu)上定義為遞歸的情況。遞歸和循環(huán)是等價(jià)的。
遞歸的次數(shù)過(guò)多,會(huì)造成棧溢出,并且Python并不支持尾遞歸優(yōu)化。
#字符串取反
def reverse_str(s):if len(s) <= 1:return selse:return reverse_str(s[1:]) + s[0]
?
轉(zhuǎn)載于:https://www.cnblogs.com/zephyr-1/p/5489303.html
總結(jié)
以上是生活随笔為你收集整理的Python笔记(2)函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 流浪地球电影下载资源
- 下一篇: Servlet、MySQL中文乱码