day12 裝飾器高階

2022-08-10 05:48:13 字數 4461 閱讀 5652

day12 裝飾器高階

#裝飾器高階

#functools.wraps

#帶引數的裝飾器

#多個裝飾器裝飾用乙個函式

def outer(*args,**kwargs):#接收的時候是聚合(成元祖的形式)

print(args)

print(*args)

def inner(*args):

print('inner:',args)

inner(*args) #呼叫的時候是打散

outer(1,2,3,4) #outer(*[1,2,3,4])

outer(*[1,2,3,4])

#可迭代物件包括:字串、列表、元祖、字典、集合

from

collections.abc import iterable

l = [1, 2, 3, 4

]t = (1, 2, 3, 4

)d =

s =

print(isinstance(l, iterable))

print(isinstance(t, iterable))

print(isinstance(d, iterable))

print(isinstance(s, iterable))

#迭代:可以將某個資料集內的資料「乙個挨著乙個的取出來」

#3.可迭代協議:就是內部實現了__iter__方法

print(dir([1,2

]))print(dir((

2,3)))

print(dir())

print(dir())

l = [1,2,3,4

]l_iter =l.__iter__()

item =l_iter.__next__()

print(item)

item =l_iter.__next__()

print(item)

item =l_iter.__next__()

print(item)

item =l_iter.__next__()

print(item)

item =l_iter.__next__()

print(item)

#這是一段會報錯的**,如果我們一直取next取到迭代器裡已經沒有元素了,

# 就會丟擲乙個異常stopiteration,告訴我們,列表中已經沒有有效的元素了。

l = [1,2,3,4

]l_iter =l.__iter__()

while

true:

try:

item =l_iter.__next__()

print(item)

except stopiteration:

break

#迭代器遵循迭代器協議:必須擁有__iter__方法和__next__方法。

#還賬:next和iter方法

'''python中提供的生成器:

1.生成器函式:常規函式定義,但是,使用yield語句而不是return語句返回結果。yield語句一次返回乙個結果,在每個結果中間,掛起函式的狀態,以便下次重它離開的地方繼續執行

2.生成器表示式:類似於列表推導,但是,生成器返回按需產生結果的乙個物件,而不是一次構建乙個結果列表'''

import time

def genrator_fun1():

a = 1

print(

'現在定義了a變數')

yield

a b = 2

print(

'現在又定義了b變數')

yield

b

g1 =genrator_fun1()

print(

'g1 :

',g1) #列印g1可以發現g1就是乙個生成器

print('-

'*20

) #我是華麗的分割線

print(next(g1))

time.sleep(

1) #sleep一秒看清執行過程

print(next(g1))

#普通函式

def generator():

print(1)

return 'a'

ret = generator()

print(ret)

#生成器函式

#只要含有yield關鍵字的函式都是生成器函式

#yield不可以跟return共用,函式裡有了yield就不能用return,且需要寫在函式內部

#生成器函式:執行之後會得到乙個生成器作為返回值(函式內部**不會執行)

ret = generator()

print(ret)

print(ret.__next__())

# ret.__iter__()

def generator():

print(1)

yield 'a'

print(2)

yield 'b'

yield 'c'

g=generator()

for i in g:

print(i)

print(g.__next__())

print(g.__next__())

print(g.__next__())

#哇哈哈

def wahaha():

or i in range(2000000):

yield '娃哈哈%s'%i

g = wahaha()

count = 0

for i in g:

count+=1

print(i)

if count > 50:

break

print('***********',g.__next__())

for i in g:

count+=1

print(i)

if count > 100:

break

#監聽檔案輸入

#帶引數的裝飾器(三層裝飾器:最多三層)

import time

flag = true

def timmer_out(flag):

def timmer(func):

def inner(*args,**kwargs):

if flag:

start=time.time()

ret = func(*args,**kwargs)

end = time.time()

print(end-start)

return ret

else:

ret = func(*args, **kwargs)

return ret

return inner

return timmer

#timmer = timmer_out(flag)等同於timmer_out=timmer_out(func)

python學習day12 裝飾器高階

裝飾器的高階 functools.wraps 帶引數的裝飾器 多個裝飾器裝飾同乙個函式 裝飾器 開發原則 開放封閉原則 裝飾器的作用 在不改變原函式的呼叫方式的情況下,在函式的前後新增功能 裝飾器的本質 閉包函式 def inner args,kwargs print 在被裝飾的函式執行之前做的事 ...

day12 作業裝飾器

寫乙個裝飾器 tag要求滿足如下功能 def tag name def test func def new func args,kwargs result func args,kwargs return f return new func return test tag name p defrend...

python 學習筆記 day12 裝飾器高階

裝飾器的原則 開放封閉原則 對擴充套件是開放的,對修改是封閉的 裝飾器的作用 在不改變原函式呼叫的情況下,擴充套件被裝飾函式的功能 可以在裝飾器函式內部,在被裝飾函式的前後分別新增相應的功能 裝飾器函式的本質 裝飾器函式本質上就是乙個閉包函式 裝飾器函式固定模式 裝飾器函式 def inner ar...