自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

五分鐘輕松理解 Python 閉包與裝飾日高級(jí)概念

開發(fā)
閉包和裝飾器是Python中非常實(shí)用的高級(jí)概念,它們可以幫助你編寫更優(yōu)雅、更靈活的代碼。

Python的魅力在于它簡(jiǎn)潔的語(yǔ)法和強(qiáng)大的特性,其中閉包和裝飾器是兩個(gè)經(jīng)常被提及的高級(jí)概念。雖然聽(tīng)起來(lái)有些高深,但一旦理解,它們將極大地豐富你的編程技巧。讓我們一步步揭開它們的神秘面紗。

什么是閉包?

閉包聽(tīng)起來(lái)復(fù)雜,實(shí)際上是一種函數(shù)內(nèi)部定義的函數(shù),能夠訪問(wèn)其外部函數(shù)的變量,即使外部函數(shù)已經(jīng)執(zhí)行完畢。這得益于Python的變量作用域規(guī)則。

理解閉包

例子時(shí)間:

def outer_func(msg):
    # 外部函數(shù)的局部變量
    def inner_func():
        print(msg)
    # 返回內(nèi)部函數(shù)
    return inner_func

# 調(diào)用outer_func并保存返回的內(nèi)部函數(shù)
greeting = outer_func("你好,世界!")
# 現(xiàn)在調(diào)用greeting函數(shù),盡管msg已不在作用域內(nèi),但仍能打印
greeting()

解釋:這里,outer_func返回了inner_func,并且inner_func能夠訪問(wèn)outer_func中的局部變量msg,這就是閉包。

進(jìn)階:閉包中的變量綁定

閉包允許內(nèi)部函數(shù)記住并訪問(wèn)外部函數(shù)的局部變量,即使外部函數(shù)執(zhí)行完畢。

def counter(start):
    count = start  # count在這里是外部函數(shù)的局部變量
    
    def increment():
        nonlocal count  # 聲明count不是局部變量,而是外部函數(shù)的
        count += 1
        return count
    
    return increment

# 創(chuàng)建一個(gè)計(jì)數(shù)器
counter_a = counter(1)
print(counter_a())  # 輸出: 2
print(counter_a())  # 輸出: 3

注意:使用nonlocal關(guān)鍵字告訴Python count不是內(nèi)部函數(shù)的局部變量,而是外層函數(shù)的。

跨越到裝飾器

裝飾器本質(zhì)上是一個(gè)接受函數(shù)作為參數(shù)并返回一個(gè)新的函數(shù)的函數(shù)。它為函數(shù)添加額外的功能,而無(wú)需修改原始函數(shù)的代碼,是閉包的一個(gè)常見(jiàn)應(yīng)用。

裝飾器基礎(chǔ)

示例:

def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()

解讀:這里,@my_decorator是一個(gè)語(yǔ)法糖,等價(jià)于將say_hello傳遞給my_decorator并用返回值替換原來(lái)的say_hello。wrapper函數(shù)執(zhí)行了額外的操作(前后打印信息),但對(duì)調(diào)用者來(lái)說(shuō),就像是直接調(diào)用say_hello一樣。

裝飾器參數(shù)

裝飾器也可以接受參數(shù),使得它們更加靈活。

def repeat(n):
    def decorator_repeat(func):
        def wrapper(*args, **kwargs):
            for _ in range(n):
                func(*args, **kwargs)
        return wrapper
    return decorator_repeat

@repeat(3)
def greet(name):
    print(f"Hello, {name}!")

greet("Alice")  # 輸出 "Hello, Alice!" 三次

技巧提示:使用嵌套函數(shù)讓裝飾器可以接受參數(shù),這樣可以保持裝飾器使用的簡(jiǎn)潔性。

實(shí)戰(zhàn)案例分析

假設(shè)我們需要記錄函數(shù)的執(zhí)行時(shí)間,可以創(chuàng)建一個(gè)裝飾器來(lái)實(shí)現(xiàn)這一需求。

import time

def timing_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__} took {end_time - start_time} seconds to execute.")
        return result
    return wrapper

@timing_decorator
def test_function():
    time.sleep(1)

test_function()

分析:這個(gè)裝飾器在每次調(diào)用test_function時(shí)都會(huì)計(jì)算并打印執(zhí)行時(shí)間,展示了裝飾器增強(qiáng)函數(shù)功能的強(qiáng)大能力。

結(jié)語(yǔ)

閉包和裝飾器是Python中非常實(shí)用的高級(jí)概念,它們可以幫助你編寫更優(yōu)雅、更靈活的代碼。通過(guò)上述示例和解釋,希望能讓你對(duì)這兩個(gè)概念有更清晰的理解。

責(zé)任編輯:趙寧寧 來(lái)源: 手把手PythonAI編程
相關(guān)推薦

2024-07-30 14:09:19

裝飾器Python代碼

2023-12-06 08:48:36

Kubernetes組件

2011-08-08 09:22:10

Python

2024-09-18 08:21:24

JavaScriptTypeScriptprototype

2011-05-26 09:03:17

JSONjavascript

2023-07-26 07:11:50

LVM底層抽象

2023-02-07 07:47:52

Python裝飾器函數(shù)

2017-04-25 12:07:51

AndroidWebViewjs

2021-01-11 09:33:37

Maven數(shù)目項(xiàng)目

2020-11-10 09:01:52

DPDK網(wǎng)絡(luò)監(jiān)控

2024-03-21 09:51:22

Python爬蟲瀏覽網(wǎng)站

2024-07-10 18:55:09

Python定時(shí)

2010-06-29 08:39:25

Python閉包

2017-12-20 09:42:39

PythonNginx日志

2009-11-04 16:13:18

ADO.NET數(shù)據(jù)表

2009-11-16 10:53:30

Oracle Hint

2025-03-13 06:22:59

2024-12-11 07:00:00

面向?qū)ο?/a>代碼

2020-06-16 08:47:53

磁盤

2016-01-04 11:18:00

KubernetesKubernetes概容器技術(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)