精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Python `*args` 和 `**kwargs`:優(yōu)雅處理可變參數(shù)的終極指南 & 配合 frozenset 實現(xiàn)通用緩存器

開發(fā) 前端
在Python開發(fā)中,我們經(jīng)常會遇到需要處理不定數(shù)量參數(shù)的場景。今天就來聊聊Python中的*args和**kwargs,看看它們如何幫我們優(yōu)雅地解決這類問題。

在Python開發(fā)中,我們經(jīng)常會遇到需要處理不定數(shù)量參數(shù)的場景。今天就來聊聊Python中的*args和**kwargs,看看它們如何幫我們優(yōu)雅地解決這類問題。

從一個實際場景說起

假設你正在開發(fā)一個數(shù)據(jù)處理框架,需要實現(xiàn)一個通用的函數(shù)裝飾器來記錄函數(shù)執(zhí)行時間:

import time
from functools import wraps

def timer(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start = time.perf_counter()
        result = func(*args, **kwargs)
        end = time.perf_counter()
        print(f"{func.__name__} 執(zhí)行耗時: {end - start:.6f} 秒")
        return result
    return wrapper

@timer
def process_data(data, threshold=0.5):
    # 模擬數(shù)據(jù)處理
    time.sleep(1)
    return [x for x in data if x > threshold]

# 使用示例
result = process_data([1, 2, 3, 0.1, 0.4])
# 輸出:process_data 執(zhí)行耗時: 1.003865 秒

注意到裝飾器中的*args和**kwargs了嗎?它們讓我們的裝飾器可以適配任意參數(shù)的函數(shù)。

*args :處理位置參數(shù)

*args允許函數(shù)接收任意數(shù)量的位置參數(shù),這些參數(shù)會被打包成一個元組。

def sum_all(*numbers):
    return sum(numbers)

# 以下調用都是有效的
print(sum_all(1, 2))          # 3
print(sum_all(1, 2, 3, 4))    # 10

**kwargs :處理關鍵字參數(shù)

**kwargs則用于接收任意數(shù)量的關鍵字參數(shù),這些參數(shù)會被打包成一個字典。

def print_user_info(**info):
    for key, value in info.items():
        print(f"{key}: {value}")

# 可以傳入任意數(shù)量的命名參數(shù)
print_user_info(name="Alice", age=30, city="Shanghai")

解包操作: * 和 ** 的另一面

除了在函數(shù)定義時使用,*和**還可以用于解包序列和字典:

def greet(name, age, city):
    print(f"你好,{name}!你{age}歲了,來自{city}?")

# 使用*解包列表/元組
user_data = ["Bob", 25, "Beijing"]
greet(*user_data)  # 你好,Bob!你25歲了,來自Beijing?

# 使用**解包字典
user_dict = {"name": "Charlie", "age": 35, "city": "Guangzhou"}
greet(**user_dict)   # 你好,Charlie!你35歲了,來自Guangzhou?

高級應用:混合使用與順序規(guī)則

在實際開發(fā)中,我們經(jīng)常需要混合使用這些特性:

def complex_function(x, y, *args, default=None, **kwargs):
    print(f"x: {x}")
    print(f"y: {y}")
    print(f"args: {args}")
    print(f"default: {default}")
    print(f"kwargs: {kwargs}")

# 調用示例
complex_function(1, 2, 3, 4, default="test", extra=True, debug=False)

這里有個重要的順序規(guī)則:

  1. 普通位置參數(shù)
  2. *args
  3. 默認參數(shù)
  4. **kwargs

實用技巧:使用 *args 和 **kwargs 實現(xiàn)通用緩存裝飾器

在開發(fā)中,經(jīng)常需要在不修改原函數(shù)簽名的情況下添加新功能:

import time
from typing import Any, Callable
from functools import wraps

class Cache:
    def __init__(self):
        self._cache = {}
    
    def cached_call(self, func: Callable[..., Any], *args, **kwargs) -> Any:
        # 使用frozenset處理kwargs,確保{a:1, b:2}和{b:2, a:1}被視為相同的調用
        key = (func.__name__, args, frozenset(kwargs.items()))

        if key not in self._cache:
            print(f"Cache miss for {func.__name__}, calculating...")
            start = time.perf_counter()
            self._cache[key] = func(*args, **kwargs)
            end = time.perf_counter()
        else:
            print(f"Cache hit for {func.__name__}, returning cached result")
        
        return self._cache[key]

# 創(chuàng)建緩存實例
cache = Cache()

def expensive_operation(x: int, y: int, z: int = 1) -> int:
    """模擬耗時操作"""
    time.sleep(2)  # 模擬耗時計算
    return x + y + z

def measure_time(func: Callable, *args, **kwargs) -> None:
    """測量函數(shù)執(zhí)行時間"""
    start = time.perf_counter()
    result = func(*args, **kwargs)
    end = time.perf_counter()
    print(f"Result: {result}")
    print(f"Time taken: {end - start:.2f} seconds\n")
    return result

# 演示不同場景下的緩存效果
print("第一次調用(無緩存):")
measure_time(cache.cached_call, expensive_operation, 1, 2, z=3)

print("第二次調用(使用緩存):")
measure_time(cache.cached_call, expensive_operation, 1, 2, z=3)

print("不同參數(shù)順序的調用(展示frozenset的作用):")
# 注意這里kwargs的順序不同,但應該命中相同的緩存
result3 = cache.cached_call(expensive_operation, x=1, y=2, z=3)
result4 = cache.cached_call(expensive_operation, y=2, x=1, z=3)

輸出:

第一次調用(無緩存):
Cache miss for expensive_operation, calculating...
Result: 6
Time taken: 2.01 seconds

第二次調用(使用緩存):
Cache hit for expensive_operation, returning cached result
Result: 6
Time taken: 0.00 seconds

不同參數(shù)順序的調用(展示frozenset的作用):
Cache miss for expensive_operation, calculating...
Cache hit for expensive_operation, returning cached result

注意,在實現(xiàn)緩存時,我們需要一個可哈希(hashable)的鍵來唯一標識函數(shù)調用。但是普通的set和dict是可變的,因此不能作為字典的鍵。Python 的 frozenset 就是為了解決這個問題 - 它是不可變的集合類型。

關于frozenset的幾個重要特點

  1. 不可變性:一旦創(chuàng)建就不能修改,這使它可以作為字典的鍵
# 這是允許的
d = {frozenset([1, 2, 3]): "value"}

# 這會報錯
s = set([1, 2, 3])
d = {s: "value"}  # TypeError: unhashable type: 'set'
  1. 順序無關性:
# 這兩個frozenset是相等的
fs1 = frozenset([1, 2, 3])
fs2 = frozenset([3, 1, 2])
print(fs1 == fs2)  # True
  1. 性能考慮:
# 下面這種寫法更高效
key = (func.__name__, args, frozenset(kwargs.items()))

# 而不是
key = (func.__name__, args, tuple(sorted(kwargs.items())))

關于frozenset的注意事項

  1. frozenset只能包含可哈希的元素。例如,你不能創(chuàng)建包含列表或字典的frozenset。
  2. 在我們的緩存實現(xiàn)中,如果函數(shù)參數(shù)包含不可哈希的類型(如列表),需要額外處理:
def make_hashable(obj):
    """將對象轉換為可哈希的形式"""
    if isinstance(obj, (tuple, list)):
        return tuple(make_hashable(o) for o in obj)
    elif isinstance(obj, dict):
        return frozenset((k, make_hashable(v)) for k, v in obj.items())
    elif isinstance(obj, set):
        return frozenset(make_hashable(o) for o in obj)
    return obj

# 改進的緩存鍵生成
key = (func.__name__, make_hashable(args), make_hashable(kwargs))

一些 *args 和 **kwargs 的注意事項

  1. 參數(shù)名稱不一定非要用args和kwargs,但這是約定俗成的命名。
  2. 在函數(shù)定義中,*args必須在**kwargs之前。
  3. 在Python3 中,可以在*args之后定義強制關鍵字參數(shù)。

總結

*args和**kwargs是Python中非常強大的特性,它們讓我們能夠:

  • 編寫更靈活的函數(shù)和裝飾器
  • 實現(xiàn)參數(shù)轉發(fā)
  • 處理不定量的參數(shù)

掌握這些特性,可以讓我們的代碼更加優(yōu)雅和通用。在日常開發(fā)中,合理使用這些特性可以大大提高代碼的可維護性和可擴展性。

責任編輯:武曉燕 來源: Piper蛋窩
相關推薦

2023-03-09 16:39:23

Python傳遞參數(shù)

2025-02-05 08:43:40

2020-07-19 08:15:41

PythonDebug

2022-05-03 10:43:43

SpringJava

2017-05-19 12:00:25

Python數(shù)據(jù)類型集合

2020-07-11 09:25:15

Python編程語言代碼

2025-11-05 05:00:00

2023-05-05 17:20:04

2018-08-17 04:53:36

2023-11-30 15:53:43

2021-01-06 05:29:04

C語言參數(shù)應用

2021-06-21 09:30:12

@wraps 修飾器Python

2025-09-12 09:31:29

2024-10-06 14:01:47

Python裝飾器對象編程

2012-08-21 06:53:00

測試軟件測試

2025-03-11 00:54:42

2025-09-09 09:32:04

2025-04-01 00:06:50

JavaK8sSpring

2024-03-11 05:00:00

Python集合開發(fā)

2023-06-12 17:54:50

點贊
收藏

51CTO技術棧公眾號

北条麻妃在线视频观看| 久久综合中文色婷婷| 久草综合在线视频| 天天久久夜夜| 欧美三级乱人伦电影| 成人污网站在线观看| 欧美拍拍视频| 国产麻豆精品theporn| 97香蕉超级碰碰久久免费软件 | 韩国理伦片久久电影网| 一区二区三区四区中文字幕| 欧洲国产精品| 成人久久精品人妻一区二区三区| 久久久久99| 欧美高清性猛交| 亚洲毛片亚洲毛片亚洲毛片| 成午夜精品一区二区三区软件| 欧洲另类一二三四区| 无码熟妇人妻av在线电影| 伊人在线视频| 久久婷婷色综合| 国产精品免费看一区二区三区| 中文字幕永久在线观看| 亚洲一区欧美激情| 欧美极品xxxx| 成人观看免费视频| 手机在线电影一区| 亚洲欧洲在线播放| av在线播放网址| 另类视频一区二区三区| 欧美三级日韩在线| 国产日韩成人内射视频| mm视频在线视频| 亚洲一区二区3| 特级黄色录像片| 在线观看麻豆| 中文字幕精品一区二区三区精品| 久久国产精品一区二区三区| 精品人妻一区二区三区浪潮在线 | 最好看的中文字幕| 久久免费资源| 欧美色视频一区| 人人爽人人av| 男人最爱成人网| 一本色道**综合亚洲精品蜜桃冫| 人妻无码久久一区二区三区免费 | 亚洲综合色成人| 国产免费一区二区三区四在线播放| 精品av中文字幕在线毛片| 99re这里只有精品首页| 久久av二区| 亚洲日本在线播放| 91女厕偷拍女厕偷拍高清| 久久99精品久久久久久久青青日本| 亚洲伦理在线观看| 成人黄色国产精品网站大全在线免费观看| 亚洲一区二区三区在线视频 | 在线视频不卡国产| 男女啪啪在线观看| 中文字幕亚洲欧美在线不卡| 伊人久久青草| 国产婷婷视频在线| 一区二区三区中文字幕在线观看| 大桥未久一区二区三区| 羞羞网站在线免费观看| 亚洲综合网站在线观看| 欧美精品久久久久久久久久久| a在线视频v视频| 欧美午夜无遮挡| 成人免费xxxxx在线视频| 成人黄色毛片| 欧美一区二区三区视频在线观看| 成年人网站av| 久久精品亚洲成在人线av网址| 日韩av网址在线观看| 黄色a一级视频| 日韩一区三区| 欧美裸体xxxx极品少妇| 日本三级视频在线| 日韩电影在线观看电影| 亚洲va久久久噜噜噜| 黄频在线免费观看| 久久久国产精品不卡| 中文字幕日韩一区二区三区不卡| 2021国产在线| 狠狠躁夜夜躁人人爽天天天天97| 成人性生生活性生交12| 久久伊人精品| 亚洲天堂色网站| 波多野结衣不卡视频| 亚洲一区日韩| 91色精品视频在线| 日韩a在线观看| 亚洲色图欧洲色图婷婷| 97视频久久久| 四虎国产精品免费久久5151| 亚洲国产成人久久| 国精品人伦一区二区三区蜜桃| 国产字幕视频一区二区| 国产成人+综合亚洲+天堂| 99热这里只有精品在线| 久久看人人爽人人| 日韩人妻一区二区三区蜜桃视频| 亚洲最新无码中文字幕久久| 91麻豆精品国产91久久久久久| 国产xxxx视频| 91久久国产| 日本久久久久久久久久久| 国产黄色美女视频| 中文字幕乱码日本亚洲一区二区| www.av片| 欧洲精品99毛片免费高清观看 | 五月天激情在线| 色菇凉天天综合网| 白嫩情侣偷拍呻吟刺激| 999精品一区| 浅井舞香一区二区| 蜜桃av中文字幕| 最新不卡av在线| 999在线免费视频| 天天躁日日躁成人字幕aⅴ| 九九九久久国产免费| 少妇又紧又色又爽又刺激视频| 91视频在线观看免费| 国产欧美123| 一区二区三区日本视频| 中日韩美女免费视频网站在线观看 | 成人免费电影网址| 欧美亚洲视频在线观看| 日韩一级片免费看| 亚洲一线二线三线视频| 99国产精品免费视频| 国产精品久久久久9999赢消| 国产精品久久久久久久av大片| 无码精品黑人一区二区三区 | 日韩中文字幕第一页| 欧美一区二区三区久久久| xnxx国产精品| 久久精品香蕉视频| 妖精一区二区三区精品视频| 91禁外国网站| 午夜18视频在线观看| 亚洲成a人v欧美综合天堂下载| 国产ts在线观看| 欧美午夜免费影院| 国产精品一区二区三区观看 | 精品福利在线视频| 性欧美18—19sex性高清| 欧美日韩国产亚洲一区| 99理论电影网| 999福利在线视频| 日韩精品在线视频美女| 精品成人av一区二区在线播放| aa级大片欧美| 久久久久久久久久久福利| 日本午夜精品| 国产精品极品美女粉嫩高清在线| 电影av在线| 欧美久久久一区| 欧美激情图片小说| 成人精品视频一区| 欧美日韩中文在线视频| 国产剧情一区| 91九色国产在线| 久久电影网站| 亚洲精品自拍第一页| 一级片免费在线播放| 亚洲国产精品传媒在线观看| 中日韩av在线播放| 欧美日一区二区三区在线观看国产免| 国产乱码精品一区二区三区日韩精品 | 亚洲女爱视频在线| www.四虎在线| 久久精品人人做人人爽电影蜜月| 亚洲午夜精品一区二区| 日韩精品一区国产| 欧美一级淫片videoshd| 成年人在线观看网站| 欧美一区二区三区色| 好吊操这里只有精品| 日本一区二区三区在线观看| 日本高清免费在线视频| 亚洲精选成人| 在线日韩av永久免费观看| 国产欧美一区二区三区米奇| 国产成人精品在线观看| 性xxxxfjsxxxxx欧美| 亚洲女同性videos| av免费观看网址| 欧美性生交xxxxxdddd| 日本成人精品视频| 91在线小视频| 波多野结衣免费观看| 亚洲一区二区三区高清| 黄色污污在线观看| 精品国产乱码久久久久久果冻传媒 | 97精品一区二区三区| jizzjizz在线观看| 亚洲国产成人精品女人久久久| 夜夜骚av一区二区三区| 午夜精品久久久久久久99水蜜桃 | av网站在线免费播放| 精品三级av在线| 中文字幕一区二区三区免费看 | 日本午夜精品久久久| 96pao国产成视频永久免费| 成人直播视频| 久久久久久久爱| 男人天堂久久久| 国产一区二区精品丝袜| 蜜桃久久一区二区三区| 91精品国产综合久久精品性色| 日本中文字幕久久| 亚洲成av人片在线观看| 紧身裙女教师波多野结衣| 久久九九99视频| 成人性生活免费看| 国产老肥熟一区二区三区| 色一情一区二区三区| 男女精品网站| 又粗又黑又大的吊av| 欧美天堂亚洲电影院在线观看| 亚洲图片都市激情| 国产精品自拍区| 欧美精品与人动性物交免费看| 哺乳一区二区三区中文视频| 97视频中文字幕| 欧美大片91| 亚洲一区中文字幕在线观看| 国产亚洲精品精品国产亚洲综合| 国产精品成人av在线| 日韩电影免费观| 青青草原一区二区| 亚洲第一av| 欧美一级成年大片在线观看| 高清在线视频不卡| 91成人免费观看网站| 51av在线| 午夜精品一区二区三区在线视频| 青青草原av在线| 欧美激情videoshd| 丁香花在线影院| 午夜精品福利电影| 91破解版在线观看| 97精品一区二区三区| 牛牛精品一区二区| 欧美一级电影久久| 欧洲亚洲两性| 国产精品99久久久久久久久| 激情亚洲影院在线观看| 国产精品中文久久久久久久| 久久电影天堂| 成人午夜一级二级三级| 爱情电影网av一区二区| 99re视频在线| 麻豆一区一区三区四区| 免费国产一区| 成人黄色小视频| 国产福利片一区二区| 亚洲电影影音先锋| 久久这里只有精品18| 136国产福利精品导航网址| 日韩欧美国产免费| 日韩在线一区二区三区| 国产精品自在自线| 高清av一区二区| 中文字幕5566| 国产精品美女一区二区三区| 成人免费视频网站入口::| 亚洲国产一区二区三区| 中文字幕高清在线免费播放| 欧美日韩高清影院| www.中文字幕| 日韩激情视频在线播放| 91在线高清| 欧美精品激情视频| 欧美极品免费| 亚洲精品欧美一区二区三区| 欧美韩一区二区| 一本一本a久久| 亚洲国产99| 色播五月激情五月| 不卡区在线中文字幕| 东方伊人免费在线观看| 亚洲综合一二区| 波多野结衣黄色| 欧美va天堂va视频va在线| 日本啊v在线| 久久6精品影院| 亚洲成人激情社区| 91在线免费看片| 国产一区二区三区不卡视频网站| 男女爱爱视频网站| 久久成人一区| 中文在线字幕观看| 中文字幕免费一区| 日韩精品视频免费看| 欧美巨大另类极品videosbest | 国产精品国产自产拍在线| 日韩av综合在线| 制服丝袜国产精品| 久久久久久久久亚洲精品| 精品中文字幕在线| 日韩一区二区三区在线免费观看| 97欧洲一区二区精品免费| 日韩精品dvd| 成人小视频在线看| 日韩大片一区二区| 2020国产精品自拍| 久久香蕉精品视频| 91精品国产91热久久久做人人 | 91香蕉视频导航| 成人av电影在线观看| 超碰手机在线观看| 欧美日韩一二区| 黄色在线小视频| 97人洗澡人人免费公开视频碰碰碰| 婷婷丁香久久| 亚洲第一综合| 日韩一区精品字幕| 9.1成人看片| 精品电影在线观看| 黄色aaa毛片| 久久久视频免费观看| 国产一区二区高清在线| 亚洲一区二三| 美女一区二区久久| 长河落日免费高清观看| 色8久久人人97超碰香蕉987| 免费观看成年在线视频网站| 91国产美女在线观看| 9l视频自拍蝌蚪9l视频成人 | 大香伊人中文字幕精品| 91视频最新| 欧美91福利在线观看| 日本女人黄色片| 亚洲精品午夜久久久| 国产人妻精品一区二区三区| 日韩亚洲在线观看| 国产欧美在线观看免费| 一区二区三区四区五区精品 | 男男做爰猛烈叫床爽爽小说| 亚洲成av人综合在线观看| 日本激情一区二区| 91精品国产91久久久久久最新| 久久a爱视频| 18岁网站在线观看| 久久亚洲精精品中文字幕早川悠里| 99热国产在线观看| 亚洲人成网在线播放| 91大神在线观看线路一区| 亚洲一区二区免费视频软件合集| 美女性感视频久久| 麻豆视频在线免费看| 欧美电影精品一区二区| sm久久捆绑调教精品一区| 精品无人区一区二区三区| 久久精品麻豆| 成人精品一二三区| 日韩欧美久久久| 91超碰国产在线| 欧美一二三区| 久久国产精品99久久人人澡| 波多野结衣亚洲一区二区| 日韩一级黄色片| 国内激情视频在线观看| 欧美日韩一区综合| 久久99精品久久久久久国产越南 | 韩日精品视频| v8888av| 精品视频一区二区不卡| 制服丝袜在线播放| 久久精品ww人人做人人爽| 日本中文一区二区三区| 男女羞羞免费视频| 亚洲毛片在线看| 日日夜夜综合| 成人精品视频在线播放| 久久久久久电影| 国产日韩精品suv| 久久久综合免费视频| 国内成人自拍| 久久久无码人妻精品无码| 欧美午夜www高清视频| 黄色网页网址在线免费| 黑人中文字幕一区二区三区| 首页亚洲欧美制服丝腿| 黄色一级视频在线观看| 亚洲欧美日韩中文视频| 国语精品视频| 欧美一级黄色片视频| 一区二区三区在线影院| 久久99久久| 国产成人免费观看| 蜜臀久久久99精品久久久久久| 日本少妇性高潮| 久久综合久久88| 精品一区欧美| av网页在线观看| 欧美一区二区三级|