精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

日韩欧美国产综合在线一区二区三区| 亚洲欧洲成人精品av97| 日本道色综合久久影院| 精品人妻无码一区| 日韩成人在线观看视频| 欧美日韩国产在线| 中国成人在线视频| 婷婷五月综合久久中文字幕| 蜜臀a∨国产成人精品| 欧美日韩第一视频| 精品国产成人亚洲午夜福利| 精品网站999| 色噜噜久久综合| 99视频精品全部免费看 | 日韩精品中文字幕在线观看| 成人午夜激情av| av老司机免费在线| 国产精品久久99| 欧美凹凸一区二区三区视频| www.xxx国产| 蜜臀av一区二区在线观看| 亚洲18私人小影院| 国产极品国产极品| 欧美精品色图| 精品视频—区二区三区免费| 超碰中文字幕在线观看| 欧美暴力调教| 日韩人在线观看| 久久精品xxx| 精品黄色免费中文电影在线播放| 久久影院视频免费| 国产日韩欧美综合精品| www.国产黄色| 国产一区二区精品久久99| 国产精品看片资源| 人人爽人人爽人人片av| 亚洲理伦在线| 欧美精品xxx| 欧美人禽zoz0强交| 外国成人免费视频| 最近2019年手机中文字幕| 六月婷婷七月丁香| 亚洲bt欧美bt精品777| 亚洲大胆人体视频| 亚洲最大视频网| 亚洲精品v亚洲精品v日韩精品| 欧美人与z0zoxxxx视频| 污网站免费在线| 视频二区不卡| 91成人免费在线视频| 日本精品一区在线观看| 波多野结衣在线播放| 亚洲成人动漫av| 日韩视频在线视频| 激情国产在线| 大伊人狠狠躁夜夜躁av一区| 人妻av中文系列| 色偷偷色偷偷色偷偷在线视频| 天天综合网天天综合色| 怡红院av亚洲一区二区三区h| 黄色影院在线看| 午夜电影网一区| 国产在线青青草| 怡红院成人在线| 欧美伊人精品成人久久综合97| 爱福利视频一区二区| 欧美一区国产| 欧美高清你懂得| 最新国产精品自拍| 国产精品qvod| 亚洲人成77777在线观看网| www.黄色在线| 国产高清一区| 欧美激情在线一区| 91在线看视频| 日本欧美韩国一区三区| 成人动漫网站在线观看| 亚洲国产精品欧美久久| 99国产麻豆精品| 日韩国产高清一区| 国产盗摄在线观看| 天天影视涩香欲综合网| 成人性视频欧美一区二区三区| 欧美日韩精品免费观看视欧美高清免费大片| 欧美吻胸吃奶大尺度电影| 亚洲18在线看污www麻豆| 97久久综合精品久久久综合| 亚洲精品日韩欧美| 少妇高潮一区二区三区喷水| 一区二区亚洲精品| 国产精品久久久久免费a∨| 国产视频手机在线观看| 91影院在线观看| 亚洲蜜桃av| av在线加勒比| 欧美日韩激情一区二区三区| 香蕉视频污视频| 日韩在线第七页| 国内精品小视频| 亚洲天天综合网| a在线欧美一区| 一本一道久久a久久精品综合| 俺来也官网欧美久久精品| 色综合久久久久久久久久久| 午夜影院免费观看视频| 国产精品欧美日韩一区| 欧美国产视频日韩| 中文字幕一区二区人妻| 成人av高清在线| 成人性做爰片免费视频| 成人va天堂| 精品88久久久久88久久久| 久久久免费看片| 国产一区二区精品| 成人在线观看av| 欧美精品videos另类| 欧美午夜无遮挡| 欧美激情 亚洲| 91精品秘密在线观看| 日韩美女av在线免费观看| 亚洲精品字幕在线观看| 1024亚洲合集| 中文字幕天天干| 免费成人av| 国产69精品久久久久久| 日批视频在线播放| 亚洲国产欧美在线| 伊人av在线播放| 欧美国产一区二区三区激情无套| 秋霞午夜一区二区| 色呦呦中文字幕| 亚洲国产精品久久人人爱蜜臀 | 精品人妻一区二区色欲产成人| 国产成人免费av在线| 日韩最新中文字幕| 在线观看亚洲精品福利片| 中日韩美女免费视频网址在线观看 | 国产精品免费大片| 欧美在线中文字幕| 天天干天天色天天| 五月天欧美精品| 午夜男人的天堂| 亚洲精品孕妇| 国产一区二区三区高清| caoporn视频在线| 亚洲国产精品成人va在线观看| 久视频在线观看| 成人午夜免费电影| 91九色丨porny丨国产jk| 粉嫩久久久久久久极品| 久久久欧美一区二区| 亚洲精品久久久久久久久久 | 成人av一级片| 神马久久影院| 国产成人一区二| 1769视频在线播放免费观看| 欧美日韩一区久久| 欧美激情精品久久久久久免费| 久久se这里有精品| 樱空桃在线播放| 成人香蕉社区| 国产91精品久| 日本中文在线观看| 日韩精品一区二区三区视频在线观看| 久久av高潮av无码av喷吹| 成人av网址在线观看| 99精品视频在线看| 日韩精品欧美激情一区二区| 成人有码在线视频| 91黄页在线观看| 一本一道久久a久久精品逆3p| 中文字幕第99页| 亚洲欧美色一区| 男女性杂交内射妇女bbwxz| 亚洲资源av| 亚洲欧美国产不卡| 成人三级av在线| 国产成人亚洲综合91精品| 国产成人在线视频免费观看| 亚洲аv电影天堂网| 国产第一页在线观看| 亚洲靠逼com| 亚洲黄色在线网站| 久久99在线观看| 极品美女扒开粉嫩小泬| 日韩免费高清| 精品国产一区二区三区久久久久久| 日韩电影免费观看高清完整版| 精品国内亚洲在观看18黄 | 区一区二在线观看| 亚洲精品中文字幕乱码三区| 亚洲av无码国产精品久久| 日本女人一区二区三区| 分分操这里只有精品| 91视频久久| 九九99久久| 天天综合在线观看| 日本久久久久久久久久久| 超碰超碰在线| 亚洲天堂视频在线观看| 国产91绿帽单男绿奴| 欧美午夜片在线看| 日本在线免费观看| 亚洲男人的天堂在线aⅴ视频| 无遮挡aaaaa大片免费看| 国产精品一区不卡| 中文字幕永久视频| 国产日韩高清一区二区三区在线| 吴梦梦av在线| 欧美亚洲高清| 久久精品国产一区二区三区不卡| 麻豆精品久久| 成人久久久久久| 91九色综合| 日本伊人精品一区二区三区介绍| 羞羞的视频在线看| 久久影院模特热| 在线毛片网站| 国产亚洲xxx| 国产在线观看网站| 日韩精品一二三四区| 欧美熟妇乱码在线一区| 日韩一区二区三区免费观看| 国产又粗又黄又爽的视频| 色久优优欧美色久优优| 超碰超碰超碰超碰| 亚洲va国产天堂va久久en| 九九热国产精品视频| 亚洲免费av高清| 国产黄色的视频| 成人欧美一区二区三区视频网页 | 桃花色综合影院| 精品福利一二区| 亚洲AV无码乱码国产精品牛牛 | 欧美日韩国产精品一区| 精品视频久久久久| 亚洲午夜视频在线观看| 久久在线视频精品| 亚洲曰韩产成在线| 国产精品9191| 黄色精品在线看| 国产香蕉视频在线| 日韩欧美国产一区二区| 日韩精品久久久久久免费| 色呦呦网站一区| 成人免费视频国产免费| 欧美色爱综合网| 国产一区二区三区视频免费观看| 在线成人av网站| 国产日韩在线观看一区| 精品久久久久久久人人人人传媒| 亚洲av无码国产综合专区| 精品剧情v国产在线观看在线| 韩国av电影在线观看| 亚洲精品suv精品一区二区| 三级理论午夜在线观看| 亚洲欧洲偷拍精品| 在线看av的网址| 欧美精品在线极品| 成年女人在线看片| 日韩男女性生活视频| 日韩av免费| 91亚洲精品一区| 国产亚洲成av人片在线观黄桃| 久久久精品动漫| 欧美呦呦网站| 大西瓜av在线| 视频一区二区中文字幕| 一级黄色片国产| 播五月开心婷婷综合| 白白色免费视频| 亚洲精品免费一二三区| 国产黄色片免费看| 欧美色窝79yyyycom| 精品二区在线观看| 日韩精品视频免费专区在线播放| 国产三级电影在线| 欧美成人午夜免费视在线看片| av影院在线免费观看| 国产精品女视频| 中文字幕一区图| 日韩一区二区三区高清| 欧美在线国产| 国产精品第12页| 国产精品综合网| 全黄一级裸体片| 亚洲精品成人少妇| 男人天堂视频网| 精品精品国产高清一毛片一天堂| 你懂的在线看| 精品中文字幕乱| av免费在线一区| 国产亚洲福利社区| 91欧美国产| 久久久久狠狠高潮亚洲精品| 激情综合色丁香一区二区| 无码国产69精品久久久久网站| 亚洲国产精品99久久久久久久久| 久久精品国产av一区二区三区| 色婷婷av一区二区三区大白胸 | 六月婷婷在线视频| 老司机精品视频在线| av鲁丝一区鲁丝二区鲁丝三区| 国产精品久久久久久户外露出| 日韩成人高清视频| 日韩一区二区电影网| 成人影视在线播放| 97超级碰在线看视频免费在线看| 91成人app| 日日夜夜精品网站| 国产麻豆综合| 天天躁日日躁狠狠躁av| 国产精品久久久久久久久搜平片 | 日韩黄色影视| 国产欧美日本| 99riav国产精品视频| 中文字幕一区二区三区在线不卡 | 色播亚洲婷婷| 香蕉久久夜色精品国产| 精品1卡二卡三卡四卡老狼| 亚洲女子a中天字幕| 91欧美日韩麻豆精品| 亚洲一区二区久久久| 涩涩av在线| 国内精品久久国产| 国模吧视频一区| 无套白嫩进入乌克兰美女| 国产精品丝袜黑色高跟| 日韩在线播放中文字幕| 日韩精品在线观看视频| 九色porny丨国产首页在线| 国产伦精品一区二区三区视频黑人| 一本一道久久a久久精品蜜桃| 日本高清久久久| 国产精品私房写真福利视频| 黄色一区二区视频| 一区二区三区在线播放欧美| 播放一区二区| 亚洲午夜激情| 精品一区二区三区久久| 欧美自拍偷拍网| 欧美高清精品3d| 18+激情视频在线| 亚洲综合小说区| 亚洲无线视频| yy1111111| 欧美日韩在线免费| 黄色在线播放| 国产精品爽爽ⅴa在线观看| 日韩欧美一区二区三区免费看| 久久这里只精品| 亚洲人吸女人奶水| 国产福利资源在线| 98精品在线视频| 美女久久久久| 亚洲老女人av| 亚洲视频免费在线| 韩国av免费在线观看| 51色欧美片视频在线观看| 欧美**vk| 免费成人黄色大片| 亚洲成人自拍偷拍| 日本天堂影院在线视频| 国产精品都在这里| 久久久久久久久久久久久久久久久久| 国产精品igao网网址不卡| 亚洲国产精品久久艾草纯爱| 青青草手机在线| 国产精品视频网址| 欧美视频二区| 中国美女乱淫免费看视频| 欧美日韩亚洲国产综合| 丝袜在线观看| 欧美日韩电影一区二区| 精品一区二区日韩| 日韩精品一区二区三| 深夜精品寂寞黄网站在线观看| 欧美激情精品| 日本久久久精品视频| 亚洲欧洲精品一区二区三区不卡 | 综合网中文字幕| 秋霞一区二区三区| 国产在线青青草| 一区在线观看免费| 午夜在线视频免费| 国产中文日韩欧美| 日韩一级免费| 极品色av影院| 亚洲奶大毛多的老太婆| 精品国产麻豆| 欧美日韩第二页| 一区二区高清免费观看影视大全| 四虎在线免费看| 99久久久精品免费观看国产| 天堂蜜桃91精品| 久久久久99精品成人片毛片| 伊人男人综合视频网| 国产在线播放精品| 天堂av手机在线| 91成人免费网站|