设计对网站的重要性,网站设计专业知识技能,北京网站设计工作室,做养生网站怎么样【Python】*args和**kwargs 一、*args: 接收不定数量的位置参数示例1#xff1a;简单的加法计算器示例2#xff1a;转发参数给另一个函数 二、**kwargs: 接收不定数量的关键字参数示例3#xff1a;创建用户配置文件示例4#xff1a;合并多个字典 三、组合使用*args和**kwar… 【Python】*args和**kwargs 一、*args: 接收不定数量的位置参数示例1简单的加法计算器示例2转发参数给另一个函数 二、**kwargs: 接收不定数量的关键字参数示例3创建用户配置文件示例4合并多个字典 三、组合使用*args和**kwargs示例5构建RESTful API请求 四、结论五、相关链接 一、*args: 接收不定数量的位置参数
在Python中函数定义时可以通过*args接收任意数量的位置参数。 这里的星号(*)告诉解释器将所有额外的位置参数打包成一个元组传递给函数。 这使得函数可以处理比预期更多的输入而不必提前确定参数的数量。
示例1简单的加法计算器
def add_numbers(*args):计算传入的所有数字之和return sum(args)print(add_numbers(1, 2, 3)) # 输出: 6
print(add_numbers(10, 20, 30, 40)) # 输出: 100在这个例子中add_numbers函数能够接受任意数量的整数作为参数并返回它们的总和。 这里的关键点在于*args允许我们不必为每个可能的参数都定义一个变量名从而使函数更加通用。
示例2转发参数给另一个函数
有时候你可能会有一个函数A需要调用另一个函数B并且希望把所有接收到的参数直接传递给B。 这时就可以使用*args
def wrapper_function(*args):print(Calling the wrapped function with:, args)result wrapped_function(*args) # 解包参数传递给wrapped_functionprint(Result from wrapped function:, result)return resultdef wrapped_function(*args):print(Inside wrapped_function with arguments:, args)return sum(args)wrapper_function(1, 2, 3)这段代码展示了如何通过*args将一组未知长度的位置参数从一个函数传递到另一个函数中。 注意在调用wrapped_function时我们使用了*args来解包参数列表确保每个元素都被当作单独的参数传递过去。
二、**kwargs: 接收不定数量的关键字参数
与*args不同**kwargs用于接收关键字参数并将它们存储在一个字典里。 这意味着你可以通过键值对的形式向函数传递参数而不仅仅是按照位置顺序。
示例3创建用户配置文件
假设我们要创建一个函数来生成用户的个人信息卡片该卡片可以根据提供的信息动态调整内容
def create_user_profile(**kwargs):根据提供的信息创建用户资料profile {}for key, value in kwargs.items():profile[key] valuereturn profileuser_info create_user_profile(nameAlice, age30, cityBeijing)
print(user_info) # 输出: {name: Alice, age: 30, city: Beijing}这里create_user_profile函数接收了多个关键字参数并将它们保存到了名为profile的字典中。 这种方式非常适合处理那些具有可选字段的数据结构如用户配置文件或API请求参数等。
示例4合并多个字典
如果我们想要合并两个或更多个字典也可以借助**kwargs来简化操作
def merge_dicts(dict1, **kwargs):将多个字典合并为一个新的字典merged dict1.copy()merged.update(kwargs)return mergeddict_a {a: 1, b: 2}
dict_b {c: 3, d: 4}merged_dict merge_dicts(dict_a, **dict_b)
print(merged_dict) # 输出: {a: 1, b: 2, c: 3, d: 4}此例中merge_dicts函数首先复制了第一个字典的内容然后使用update()方法添加了来自其他字典的所有键值对。 **kwargs在这里起到了关键作用因为它允许我们将第二个字典的内容作为关键字参数传递给函数。
三、组合使用*args和**kwargs
当同时需要支持位置参数和关键字参数时可以在同一个函数签名中同时包含*args和**kwargs。 不过要注意的是*args总是应该出现在**kwargs之前因为位置参数总是优先于关键字参数进行解析。
示例5构建RESTful API请求
考虑一个模拟发送HTTP GET请求的函数它既可以接收查询字符串形式的参数位置参数也可以接收表单数据或JSON负载关键字参数
import requestsdef make_api_request(url, *query_params, **payload):构建并发送API请求response requests.get(url, paramsquery_params, jsonpayload)return response.json()response_data make_api_request(https://api.example.com/data,(page, 1),(limit, 10),page_size50,sort_bydate
)
print(response_data)在这个例子中make_api_request函数既能处理URL后面的查询参数如分页信息也能处理POST/PUT请求体中的数据如果有的话。 这种灵活性对于构建复杂的Web服务接口非常有用。
四、结论
通过对*args和**kwargs的理解我们可以写出更加健壮、易于维护的Python代码。 这两个特性不仅提高了函数的复用性和适应性还减少了硬编码参数列表带来的限制。 然而正如前面提到的那样过度依赖这些特性可能导致代码难以理解和调试。 因此在设计API或公共接口时应当权衡是否真的需要如此高的灵活性以及这样做是否会牺牲代码的清晰度。
最后值得注意的是虽然**kwargs是标准做法但在某些情况下你可能会看到有人使用**args。 实际上**args并不是官方推荐的写法它会引发混淆因为它违背了约定俗成的命名规范。 始终建议使用**kwargs来表示关键字参数的收集。
五、相关链接
参考文章 argparse — 用于命令行选项、参数和子命令的解析器 相关文章 【Python】回调 【Python】argparse模块 【Python】request函数 【Python】yield函数 【Python】Uvicorn服务器 【Python】SSEServer-Sent Events 【Python】pydantic库 【Python】pip用法 【Python】Starlette框架 【Python】pip用法