python 基礎雜談(二)

目錄

裝飾器

裝飾器

多個裝飾器

帶參數的裝飾器

迭代器

生成器


用兩層函數,最外層函數用來接受需要增加新功能的函數,並將內層函數返回

def log_in(func):
    """實現裝飾器"""
    def wrapper():
        print('start...')
        func()
        print('end...')
    return wrapper


@log_in   #使用裝飾器
def hello_wrapper():
    print("hello wrapper")


if __name__ == "__main__":
    hello_wrapper()

多個裝飾器

def log(func):
    """實現裝飾器"""
    def wrapper():
        print('start...')
        func()
        print('end...')
    return wrapper

def log_in(func):
    """實現裝飾器"""
    def wrapper():
        print('開始進入...')
        func()
        print('結束...')
    return wrapper

@log   #使用裝飾器
@log_in
def test():
    print("test..")

if __name__ == "__main__":
    test()

帶參數的裝飾器

例如給hello()函數增加功能

給不帶參數的函數增加功能,在不帶參數的裝飾器的基礎上,再套一層函數,即三層函數,最外層用來接受傳入的形參(非hello()函數的形參),第二層用來接受需要添加功能的函數


def log(name=None):
    """實現裝飾器"""
    def decorator(func):
        def wrapper():
            print('{}.start...'.format(name))
            func()
            print('{}.end...'.format(name))
        return wrapper
    return decorator

@log("from hello")
def hello():
    print("hello world")

if __name__ == "__main__":
    hello()

給帶參數的函數增加功能,在最內層函數傳入參數。

def log(name=None):
    """實現裝飾器"""
    def decorator(func):
        def wrapper(*args, **kwargs):
            print('{}.start...'.format(name))
            func(*args, **kwargs)
            print('{}.end...'.format(name))
        return wrapper
    return decorator

@log("from add")
def add(a, b):
    print("{} + {} = {}".format(a, b, a + b))

if __name__ == "__main__":
    add(5, 4)

給有返回值的函數增加功能,最內層函數需要添加return

def log(name=None):
    """實現裝飾器"""
    def decorator(func):
        def wrapper(*args, **kwargs):
            print('{}.start...'.format(name))
            res = func(*args, **kwargs)
            print('{}.end...'.format(name))
            return res
        return wrapper
    return decorator

@log("from add")
def add(a, b):
    return a + b

if __name__ == "__main__":
    a, b = 3, 5
    print("{} + {} = {}".format(a, b, add(a, b)))

迭代器

  • 迭代:意味着重複多次,就像循環那樣(list,tuple)
  • 實現了方法__iter__的對象是可迭代的,而實現了方法__next__的對象是迭代器
  • 調用方法__next__時(或next()),迭代器返回其下一個值
  • 如果迭代器沒有可供返回的值,觸發Stoplteration異常 從迭代器創建序列 通過對可迭代對象調用內置函數iter,可獲得一個迭代器

生成器

  •  生成器是一種使用普通函數語法定義的迭代器
  • 包含yield語句的函數都被稱爲生成器
  • 不使用return返回一個值,而是可以生成多個值,每次一個
  • 每次使用yield生成一個值後,函數都將凍結,即在此停止執行
  • 被重新喚醒後,函數將從停止的地方開始繼續執行
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章