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