Python 3 学习——函数扩展and迭代器生成器装饰器
Python 學(xué)習(xí)的第九小節(jié)
?寫此博客 是為了激勵(lì)自己,并且將自己的心得以及遇到的問題與人分享
一、學(xué)習(xí)筆記
1.?高階函數(shù)
函數(shù)名可以作為函數(shù)參數(shù)輸入 、可以進(jìn)行賦值、還可以作為返回值。
2.作用域
在Python中,只有模塊、類以及函數(shù)才會(huì)引入新的作用域,其它的代碼塊(if? try? for)是不會(huì)引入新的作用域。
3.遞歸函數(shù)
關(guān)于階層的遞歸函數(shù):
def fact(n):if n ==1 :return 1return n * fact(n-1)print(fact(2)) 特點(diǎn):1.調(diào)用自身函數(shù) 2.有一個(gè)結(jié)束條件 3.每進(jìn)入更深一層遞歸時(shí),問題規(guī)模相比上次要有所減少。
但凡是遞歸可以寫的程序,循環(huán)都可以解決。遞歸的效率在一定情況下非常低。
4.內(nèi)置函數(shù)
重點(diǎn):
filter( 函數(shù)名字 , 序列 ) ---------------注意map?與 filter?的區(qū)別
遍歷序列的元素,每個(gè)元素進(jìn)入函數(shù)里面,可以起到一個(gè)過濾器的作用。不會(huì)改變?cè)?#xff0c;最多就是過濾。
map(?函數(shù)名字,序列 )
遍歷序列的元素,每個(gè)元素進(jìn)入函數(shù)中,可以對(duì)元素進(jìn)行一個(gè)處理。
reduce(?函數(shù)名字,序列 )
調(diào)用之前要加------------?from? functools? import? reduce?
reduce?的結(jié)果就是一個(gè)值。
lamda? ------------匿名函數(shù)?
lamda? 參數(shù) :?代碼塊
函數(shù)式編程用的多,可以用在reduce?這類配合進(jìn)行使用。
5.閉包
定義:如果在一個(gè)內(nèi)部函數(shù)中,對(duì)在外部作用域的變量(但不是在全局作用域中)進(jìn)行引用,這就叫做閉包。
def outer():x = 10 定義函數(shù)時(shí)的環(huán)境def inner():#條件一 inner就是內(nèi)部函數(shù) 函數(shù)塊print(x)#條件二 外部環(huán)境的一個(gè)變量 return inner()#結(jié)論 內(nèi)部函數(shù)inner就是一個(gè)閉包 關(guān)于閉包:閉包 =?函數(shù)快 +?定義函數(shù)時(shí)的環(huán)境?
6.裝飾器(重點(diǎn)!!!)
遵守開放封閉原則:對(duì)修改封閉,對(duì)擴(kuò)展開放。
裝飾器的作用就是為已經(jīng)存在的對(duì)象添加額外的功能。
#author:"LFD" #date: 2018/3/27 import timedef show_time(f): #裝飾器函數(shù)def inner():start = time.time()f()end = time.time()print('spend %s' % (end - start))return inner()@show_time def foo():print('liufeiduo')time.sleep(2) @show_time def bar():print('chengjunfei')time.sleep(3)# foo=show_time(foo) # # bar = show_time(bar)功能函數(shù)加參數(shù)
import time # 加法器 并且計(jì)算加法器運(yùn)行的時(shí)間。 def show_time(f): #裝飾器函數(shù)def inner(*x,**y):start = time.time()f(*x,**y)end = time.time()print('spend %s' % (end - start))return inner@show_time def add(*args):sums = 0for i in args:sums += iprint(sums)time.sleep(1)add(1,2,3,4,5)裝飾器參數(shù)
#author:"LFD" #date: 2018/3/27 import time# 裝飾器加參數(shù) def logger(flag=' '):def show_time(f): #裝飾器函數(shù)def inner(*x,**y):start = time.time()f(*x,**y)end = time.time()print('spend %s' % (end - start))if flag == ' ': #當(dāng)logger參數(shù)為空時(shí),打印日志記錄。不為空時(shí)則不打印。print('日志記錄')return innerreturn show_time@logger(' ') # @show_time def add(*args):sums = 0for i in args:sums += iprint(sums)time.sleep(1)add(1,2,3,4,5)7.列表生成式
def f(n):return n**3a = [y for y in range(10)] b = [f(x) for x in range(10)] #列表生成器可以使用函數(shù)進(jìn)行生成print(a) print(b)? 8.生成器
?
生成器就是一個(gè)可迭代對(duì)象( Iterable )
?
s = (x for x in range(3)) # # print(s) # # print(next(s)) #等價(jià)于s._next_() in Py2: s.next() # print(next(s)) # # print(next(s))for i in s:print(i)生成器一共有兩種創(chuàng)建方式:
①就是上面那種小括號(hào)的形式
②yield 的方式?
生成器本質(zhì)上就是一個(gè)函數(shù),但跟函數(shù)具有區(qū)別。
def foo():print('ok')yield 1 # 只要有yield的就是生成器對(duì)象 # return 1print('ok2')yield 2foo() # 生成器對(duì)象 g = foo() next(g) # 調(diào)用生成器對(duì)象 next(g) for i in foo(): #會(huì)將yield也打印出來 也就是下面的1 和 2 。 print(i)--------------
ok
ok2
ok
1
ok
2
--------------
注意:生成器在創(chuàng)建的時(shí)候就已經(jīng)決定了能計(jì)算出來的個(gè)數(shù),調(diào)用next?的次數(shù)超過這個(gè)值就會(huì)報(bào)StopIteration?
什么是可迭代對(duì)象:
內(nèi)部具有 _Iter_?方法的都是可迭代對(duì)象。列表、元組、字典、字符串都是可迭代對(duì)象。
yield 有一個(gè)保持狀態(tài)的作用。
9.send?方法
send 比 next 多一個(gè)功能,向函數(shù)體中傳值,向yield 前面的變量傳一個(gè)值。
send():f().send(None) #等價(jià)于next(f())?
10.迭代器
生成器都是迭代器,迭代器不一定都是生成器。
什么是迭代器:
①有 iter?方法 ②有 next?方法
l = [1,2,34,5] d = iter(l) print(d) #<list_iterator object at 0x000001D9FFF09438>print(next(d))# for 循環(huán)做了三件事: # 1.調(diào)用可迭代對(duì)象的iter 方法返回一個(gè)迭代器對(duì)象。 # 2.通過一個(gè)while循環(huán)不斷的調(diào)用迭代器的next 方法。 # 3.處理StopIteration異常。 for i in [1,2,34,5]: 一般都是通過for i in Iterable 進(jìn)行取值iter([1,2,34,5])?
二、心得
Python中的函數(shù)有著更多的方法作用,感覺功能強(qiáng)大但需要去發(fā)掘,裝飾器也是起到了豐富其功能,使其可以用更短的代碼做更多的事,裝飾器的作用需要繼續(xù)去體會(huì),要代碼量的上升才可以對(duì)它的了解更加深入。掌握Python的內(nèi)置函數(shù),通過內(nèi)置函數(shù)縮短自己的代碼行數(shù)。生成器以及迭代器兩者的關(guān)系還沒有弄透,以及如何搭配使用,實(shí)現(xiàn)更加復(fù)雜的功能還要進(jìn)行多次實(shí)驗(yàn)。
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/jinzejun/p/8632513.html
總結(jié)
以上是生活随笔為你收集整理的Python 3 学习——函数扩展and迭代器生成器装饰器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言编译器C11,如何检测c11支持编
- 下一篇: Python简单的抓取静态网页内容