当前位置: 首页 > news >正文

Python中*args与**kwargs用法解析

在 Python 中,*args**kwargs 是函数参数的特殊语法,用于处理「可变数量的参数」—— 解决 “函数参数数量不确定” 的问题,让函数更灵活。两者的核心区别在于:*args 处理「位置参数」,**kwargs 处理「关键字参数」,且在爬虫、框架开发等场景中高频使用。

一、*args:收集「位置参数」为元组

1. 核心定义与作用
  • 语法:在函数参数中写 *argsargs 是约定俗成的名称,可替换为 *params*urls 等,关键是前面的 *)。
  • 作用:将函数调用时传入的「所有未明确定义的位置参数」,打包成一个 元组(tuple),供函数内部遍历或处理。
  • 本质:解决 “函数需要接收任意个位置参数” 的需求(如接收多个 URL、多个数值)。
2. 基础用法(结合爬虫场景)

以 “批量爬取多个 URL” 为例,用 *args 接收任意个 URL 地址:

import requestsdef batch_crawl(*args):"""批量爬取多个URL,*args接收所有位置参数(URL)"""print(f"待爬取URL总数:{len(args)}")  # args是元组,可通过len()获取数量for url in args:  # 遍历元组,逐个爬取try:response = requests.get(url=url,headers={"User-Agent": "Mozilla/5.0..."},timeout=5)print(f"爬取 {url} 成功,状态码:{response.status_code}")except Exception as e:print(f"爬取 {url} 失败:{str(e)}")# 调用函数:传入3个URL(位置参数,数量可任意)
batch_crawl("https://httpbin.org/get","https://httpbin.org/ip","https://httpbin.org/user-agent"
)
  • 函数内部 args 的值:("https://httpbin.org/get", "https://httpbin.org/ip", "https://httpbin.org/user-agent")(元组类型)。
  • 若调用时不传位置参数:batch_crawl(),则 args 是空元组 (),不会报错。
3. 进阶:调用时的「解包」操作

* 不仅能在函数定义时 “收集参数”,还能在函数调用时 “解包参数”—— 将列表、元组等「可迭代对象」拆成单个位置参数,传递给函数。

爬虫场景示例(批量传递 URL 列表):

# 准备一个URL列表(爬虫中常见的“待爬队列”)
url_list = ["https://httpbin.org/get?page=1","https://httpbin.org/get?page=2","https://httpbin.org/get?page=3"
]# 用*解包列表:将列表拆成3个位置参数,传给batch_crawl
batch_crawl(*url_list)  # 等价于 batch_crawl(url_list[0], url_list[1], url_list[2])

二、**kwargs:收集「关键字参数」为字典

1. 核心定义与作用
  • 语法:在函数参数中写 **kwargskwargs 是约定俗成的名称,可替换为 **config**options 等,关键是前面的 **)。
  • 作用:将函数调用时传入的「所有未明确定义的关键字参数」,打包成一个 字典(dict),供函数内部通过 “键值对” 获取参数。
  • 本质:解决 “函数需要接收任意个关键字参数” 的需求(如接收爬虫的请求头、超时、代理等配置)。
2. 基础用法(结合爬虫场景)

以 “封装爬虫请求函数” 为例,用 **kwargs 接收任意请求配置(如 headers、proxies、timeout):

import requestsdef spider_request(url, method="GET",** kwargs):"""封装请求函数,**kwargs接收任意关键字参数(请求配置)"""try:# 打印接收的配置(kwargs是字典,键是参数名,值是参数值)print(f"请求配置:{kwargs}")response = requests.request(method=method.upper(),url=url,**kwargs  # 将kwargs解包,传递给requests.request(关键!))response.raise_for_status()  # 检查状态码(非200抛异常)return responseexcept Exception as e:print(f"请求失败:{str(e)}")return None# 调用函数:传入URL + 关键字参数(headers、timeout、proxies)
response = spider_request(url="https://httpbin.org/get",method="GET",headers={"User-Agent": "Mozilla/5.0..."},  # 关键字参数1timeout=10,  # 关键字参数2proxies={"http": "http://127.0.0.1:8888"}  # 关键字参数3
)if response:print("响应内容:", response.json())
  • 函数内部kwargs的值:

    {"headers": {"User-Agent": "Mozilla/5.0..."}, "timeout": 10, "proxies": {"http": "http://127.0.0.1:8888"}}
    

    (字典类型)。

  • requests.request(**kwargs):这里的 ** 是 “解包字典”—— 将 kwargs 的键值对拆成 headers=xxxtimeout=xxx 等关键字参数,传递给底层请求函数。

3. 进阶:调用时的「解包」操作

** 也能在函数调用时 “解包字典”—— 将字典的键值对拆成「关键字参数」,传递给函数(爬虫中常用于复用配置)。

爬虫场景示例(复用请求头配置):

# 定义通用请求头(爬虫中可复用的配置)
common_headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/129.0.0.0 Safari/537.36","Accept": "text/html,application/xhtml+xml,*/*","Referer": "https://example.com/"
}# 用**解包common_headers字典,作为关键字参数传给spider_request
response = spider_request(url="https://httpbin.org/get",**common_headers,  # 等价于 headers=common_headers(但更灵活)timeout=8
)

三、*args 与 **kwargs 的组合使用

在实际开发中(尤其是框架或工具函数),常将 *args**kwargs 结合使用,同时支持 “任意位置参数” 和 “任意关键字参数”。** 注意参数顺序:必须是「固定位置参数 → *args → 固定关键字参数 → kwargs」,否则会报错。

爬虫场景示例(通用批量请求函数)
import requestsdef batch_request(method, *args,** kwargs):"""通用批量请求函数- method:固定位置参数(请求方法,如GET/POST)- *args:任意位置参数(待爬URL列表)- **kwargs:任意关键字参数(请求配置,如headers、timeout)"""results = []for url in args:try:response = requests.request(method=method.upper(),url=url,**kwargs)results.append({"url": url, "status": response.status_code})except Exception as e:results.append({"url": url, "status": "failed", "error": str(e)})return results# 调用:method(固定参数) + 3个URL(*args) + 2个配置(**kwargs)
result = batch_request("GET",  # method(固定位置参数)"https://httpbin.org/get?page=1",  # args[0]"https://httpbin.org/get?page=2",  # args[1]"https://httpbin.org/get?page=3",  # args[2]headers=common_headers,  # kwargs键1timeout=5  # kwargs键2
)print("批量请求结果:", result)

四、核心区别与使用场景对比

特性*args**kwargs
处理参数类型位置参数(如 a, b, c关键字参数(如 key1=val1, key2=val2
收集结果类型元组(tuple)字典(dict)
调用时解包对象列表、元组、集合等可迭代对象字典(必须是键值对结构)
爬虫核心用途批量传递 URL、批量传递页面 ID 等传递请求配置(headers、proxies、timeout)、传递解析规则等
常见函数示例batch_crawl(*urls)make_request(url, **config)

总结

  • *args:用「元组」收集位置参数,适合传递 “无键名的批量数据”(如爬虫中的多个 URL);
  • **kwargs:用「字典」收集关键字参数,适合传递 “有键名的配置项”(如爬虫中的请求头、代理);
  • 两者结合:实现 “超级灵活” 的函数,能接收任意数量、任意类型的参数,是爬虫封装、框架开发的核心语法之一。

记住:* 对应 “位置参数→元组”,** 对应 “关键字参数→字典”,调用时的解包语法与定义时的收集语法一致(* 解包可迭代对象,** 解包字典)。

http://www.dtcms.com/a/449180.html

相关文章:

  • 【大模型】多智能体架构详解:Context 数据流与工作流编排的艺术
  • 描述逻辑(Description Logic)对自然语言处理深层语义分析的影响与启示
  • python爬虫(三) ---- 分页抓取数据
  • 探索大语言模型(LLM):大模型微调方式全解析
  • 【学习笔记03】C++STL标准模板库核心技术详解
  • 做网站有什么关于财务的问题网络设计工作
  • P9751 [CSP-J 2023] 旅游巴士
  • 宠物用品网站开发背景网站推广设计
  • MySql复习及面试题学习
  • .NET周刊【9月第2期 2025-09-14】
  • 秦皇岛企业网站建设wordpress 悬浮音乐
  • 日语学习-日语知识点小记-进阶-JLPT-N1阶段应用练习(6):语法 +考え方19+2022年7月N1
  • 【Linux指南】gdb进阶技巧:断点高级玩法与变量跟踪实战
  • 跨平台游戏引擎 Axmol-2.9.0 发布
  • 金融 - neo4j、Graph Data Science 安装
  • c 可以做网站吗梧州seo排名
  • LuaC API知识点汇总
  • mysql学习--DCL
  • 开源 C++ QT QML 开发(七)自定义控件--仪表盘
  • 论坛开源网站源码网站建设实验总结报告
  • Ansible实战:VMware下K8s自动化部署指南
  • Ansible(三)—— 使用Ansible自动化部署LNMP环境实战指南
  • 【深度学习新浪潮】有没有可能设计出一种统一架构,可以同时处理图像理解的各种下游任务?
  • 介绍一下什么是RabbitMQ的发送者可靠性?
  • 网站后台管理页面模板北京企业建网站定制价格
  • AI编辑器(二) ---调用模型的fim功能
  • UniApp 自定义导航栏适配指南:微信小程序胶囊遮挡、H5 与 App 全端通用方案
  • 数据结构其一 线性表
  • 2025年--Lc164--H14.最长公共前缀(数组和字符串)--Java版
  • 网站html有了怎么建设网站钉钉小程序开发