天天看點

day12裝飾器的進階裝飾器進階(來自女神——Eva_J)上周作業講解生成器函數上面代碼的輸出效果是如此圖所示的。

裝飾器進階(來自女神——Eva_J)

functools.wraps

帶參數的裝飾器

多個裝飾器裝飾同一個函數

上周作業講解

1.檔案操作

2.字元串操作

3.流程控制

複習:

裝飾器開發原則:開放封閉原則

裝飾器的作用:在不改變原函數的第哦啊用方式的情況下,在函數的前後添加功能

裝飾器的本質:閉包函數

# 例:
def wrapper(func):
    def inner(*args,**kwargs):
        print('Hello!')
        ret = func(*args,**kwargs)
        print('在被裝飾的函數執行後做的事')
        return ret
    return inner
    
    
@wrapper
def holiday(day):
    print('全體放假%s天'%day)
    return 'Happy'

ret = holiday(3)
print(ret)
   
    
           
Hello!
全體放假3天
在被裝飾的函數執行後做的事
Happy
           

生成器函數

#普通函數
def generator():
    print("hello Boy")
    return "a"  #return是一個關鍵字 yield也是一個關鍵字

rete = generator()
print(ret)

# 隻要含有yield關鍵字的函數都是生成器,yield必須寫在函數裡,并且不能與return并用
# 隻要是生成器函數,執行之後會得到一個生成器作為傳回值   看到yield就會立馬生成一個生成器,
#而生成器就是一個疊代器


# 用yield的生成器
def generator1():
    print("Yahoo")
    yield 'a'
    
rea = generator1()
print(rea)
print(rea.__next__())
           
hello Boy
Happy
<generator object generator1 at 0x000001F108F02D68>
Yahoo
a
           
def generator2():
    print(1)
    yield 'a'
    print(2)
    yield 'bb'

g = generator2()  # 如果隻寫這一步是不會執行的,必須寫以下這一步
roc = g.__next__()
print(roc)
           
1
a
           

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-6bWyJJnS-1584025743521)(attachment:image.png)]

# 寫一個生成器,我們直接就可以拿到了一個生成器,而清單是一個可疊代(在for循環中,
#每次都得到一個新的疊代器)的對象。   疊代器不占記憶體。
def wahaha():
    for i in range(15):
        yield '中國必勝,武漢必勝!%s'%i
fox = wahaha()
count = 0
for i in fox: # 此處生成了一個疊代器
    count += 1
    print(i)
    if count > 10:
        break
print('**********',fox.__next__())  #可以接着往下走,生成器隻記錄下一個值的狀态,
#隻要我們去找,他就能給我們生成
           
中國必勝,武漢必勝!0
中國必勝,武漢必勝!1
中國必勝,武漢必勝!2
中國必勝,武漢必勝!3
中國必勝,武漢必勝!4
中國必勝,武漢必勝!5
中國必勝,武漢必勝!6
中國必勝,武漢必勝!7
中國必勝,武漢必勝!8
中國必勝,武漢必勝!9
中國必勝,武漢必勝!10
********** 中國必勝,武漢必勝!11
           
def tailer(filename):
    fo = open(filename,encoding = 'utf-8')
    while True:
        line = fo.readline()
        if line.strip():
            yield line.strip()
tailer('file')
           

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-6bU0z31P-1584025743527)(attachment:image.png)]

上面代碼的輸出效果是如此圖所示的。

# 新例:
def tailer(filename):
    fo = open(filename,encoding = 'utf-8')
    while True:
        line = fo.readline()
        if line.strip():
            yield line.strip()

g = tailer('file.txt')
for i in g:
      if 'python' in i:
            print('****',i)
           

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-GE3BzhRz-1584025743528)(attachment:image.png)]

不知道是什麼原因在jupyter notebook裡面無法顯示此圖,是以按照老師的作法,我在pycharm上運作了之後截圖到這裡,上面一段代碼的輸出就結果就是這樣了,用女神的話說就是,我隻關心我關心的,是以說,當源文檔裡面出現了python時,程式自動就輸出了****python