裝飾器生成器
迭代器裝飾器 decorator
或者稱為包裝器,是對函式的一種包裝。
它能使函式的功能得到擴充,而同時不用修改函式本身的**。
它能夠增加函式執行前、執行後的行為,而不需對呼叫函式的**做任何改變
defbar....showtime(f):
definner():
start =time.time()
f()end =time.time()
print("
spend %s
" % (end -start))
return
inner
@showtime
#bar=showtime(bar)
defbar():
print('
bar....')
time.sleep(3)
bar()
#結果
spend 3.000171661376953
importtime
defshowtime(f):
definner(x,y):
start =time.time()
f(x,y)
end =time.time()
print("
spend %s
" % (end -start))
return
inner
@showtime
#add=showtime(add)
defadd(a,b):
print(a+b)
time.sleep(1)
add(1,2)
#結果3
spend 1.0000572204589844
import24time
defshowtime(f):
def inner(*x,**y):
start =time.time()
f(*x,**y)
end =time.time()
print("
spend %s
" % (end -start))
return
inner
@showtime
#bar=showtime(bar)
def add1(*a,**b):
sums =0
for i in
a: sums +=i
(sums)
time.sleep(2)
add1(1,2,5,7,9)
#結果
spend 2.0001144409179688
import24time
#裝飾器引數
def logger(flag=''
):
defshowtime(f):
def inner(*x, **y):
start =time.time()
f(*x, **y)
end =time.time()
print("
spend %s
" % (end -start))
if flag == "
true":
print("
日誌記錄")
return
inner
return
showtime
@logger(
"true
")#showtime
def add1(*a,**b):
sums =0
for i in
a: sums +=i
(sums)
time.sleep(2)
add1(1,2,5,7,9)
#結果
spend 2.0001144409179688
日誌記錄
在 python 中,使用了 yield 的函式被稱為生成器(generator)
生成器都是迭代器,迭代器不一定是生成器
在呼叫生成器執行的過程中,每次遇到 yield 時函式會暫停並儲存當前所有的執行資訊,返回 yield 的值, 並在下一次執行 next() 方法時從當前位置繼續執行。每執行到乙個 yield 語句就會中斷,並返回乙個迭代值,下次執行時從 yield 的下乙個語句繼續執行。
def使用 yield 實現斐波那契數列:f():
print("ok"
)
yield 1
print("ok"
)
yield 2
return
none
g =f()
print(g) #
next(g)
next(g)
next(g)
#報stopiteration
import代器是訪問集合元素的一種方式。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束,而在一系列結果的末尾時,會引發stopiteration錯誤。迭代器只能往前不會後退。sysdef
fib(max):
n,a,b = 0,0,1
while n
yield
a a,b = b,a+b
n += 1f = fib(7) #
f 是乙個迭代器,由生成器返回生成
print(f) #
while true: #
0 1 1 2 3 5 8
try:
print(next(f),end="")
except
stopiteration:
sys.exit()
迭代器有兩個基本的方法:iter()和next()。
可以直接作用於for迴圈的物件統稱為可迭代物件:
一類是集合資料型別,如list、tuple、dict、set、str等
一類是generator,包括生成器和帶yield的generator function。
l=[1,2,3,5]view coded = iter(l) #
建立迭代器物件
print(d) #
print(next(d)) #
輸出迭代器的下乙個元素
(next(d))
(next(d))
(next(d))
print(next(d)) #
報stopiteration
自定義迭代器
把乙個類作為乙個迭代器使用需要在類中實現兩個方法 __iter__() 與 __next__():
__iter__() 方法返回乙個特殊的迭代器物件, 這個迭代器物件實現了 __next__() 方法並通過 stopiteration 異常標識迭代的完成。
__next__() 方法(python 2 裡是 next())會返回下乙個迭代器物件。
classmynum:
def__iter__
(self):
self.a = 1
return
self
def__next__
(self):
if self.a <= 20:
x =self.a
self.a += 1
return
x
else
:
raise
stopiteration
mynum =mynum()
itr =iter(mynum)
for x in
itr:
print(x)
學習C 基礎知識(七)
1 由於 web 服務是跨越 web進行訪問的,並可以從任何平台呼叫,因此應避免在 web服務中使用圖形使用者介面 gui 2 使用webservice l 建立webservice 檔案,需要被其他檔案呼叫的方法需要加上 webmethod 標記 如 webmethod public int ad...
Python學習基礎知識
1 python中的布林運算 1 python把0 空字串 和none看成 false,其他數值和非空字串都看成 true 2 python直譯器在做布林運算時,只要能提前確定計算結果,它就不會往後算了,直接返回結果。2 python中的list 新增 2 用list的 insert 方法,它接受兩...
Python基礎知識學習
anaconda環境配置 anaconda pycharm環境 參考 直譯器 參考 和 python入門 anaconda和pycharm的安裝和配置 print and input print hello,world x 12 print x s hello y len s print the l...