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