Python:函数调用的实参

news2025/1/15 20:34:30

相关阅读

Python专栏icon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/category_12403403.html


        调用就是附带可能为空的一系列参数来执行一个可调用对象 (例如函数),它的语法的BNF范式如下所示,有关BNF范式的规则,可以参考之前的文章。

call                 ::=  primary "(" [argument_list [","] | comprehension] ")"
argument_list        ::=  positional_arguments ["," starred_and_keywords]
                            ["," keywords_arguments]
                          | starred_and_keywords ["," keywords_arguments]
                          | keywords_arguments
positional_arguments ::=  positional_item ("," positional_item)*
positional_item      ::=  assignment_expression | "*" expression
starred_and_keywords ::=  ("*" expression | keyword_item)
                          ("," "*" expression | "," keyword_item)*
keywords_arguments   ::=  (keyword_item | "**" expression)
                          ("," keyword_item | "," "**" expression)*
keyword_item         ::=  identifier "=" expression

        其中,primary是原型,代表编程语言中最紧密绑定的操作,它的具体可以为几种形式,可以是一个简单的函数名标识符。原型必须求值为一个可调用对象(用户定义的函数,内置函数,内置对象的方法,类对象,类实例的方法以及任何具有 __call__() 方法的对象都是可调用对象)。 所有参数表达式将在尝试调用前被求值。

        参数列表是用()包围的可选项,可以是argument_list也可以是一个生成器推导式。常用的是argument_list,它可以有三种情况:

        第一种是位置实参列表,后面是可选的加*实参和关键词实参列表,最后是可选的加**实参和关键词实参列表。

        第二种是加*实参和关键词实参列表,后面是可选的加**实参和关键词实参列表。

        第三种是只有加**实参和关键词实参列表。

        一个可选项为在位置和关键字参数后加上逗号而不影响语义。

        如果存在关键字实参,它们会先通过以下操作被转换为位置实参。首先,为形式参数创建一个未填充空位的表。 如果有N个位置实参,则它们会被放入前N个空位。 然后,对于每个关键字实参,使用标识符来确定其对应的空位(如果标识符与第一个形式参数名相同则使用第一个空位,依此类推)。 如果空位已被填充,则会引发TypeError异常。否则,将实参值放入空位,进行填充(即使表达式为None,它也会填充空位)。当所有实际参数处理完毕时,尚未填充的空位将用来自函数定义的相应默认值来填充。(函数一旦被定义,其默认值就会被计算;因此,当列表或字典这类可变对象被用作默认值时将会被所有未指定相应空位参数值的调用所共享;这种情况通常应当被避免。)如果任何一个未填充空位没有指定默认值,则会引发TypeError异常。在其他情况下,已填充空位的列表会被作为调用的形式参数列表。

        如果任何关键字实参没有与之对应的形式参数名称,将会引发TypeError异常,除非有一个形式参数使用了**expression句法,该形式参数将接受一个包含了多余关键字实参的字典(使用关键字作为键而参数值作为与键对应的值),如果没有多余关键字实参,则它为一个(新的)空字典。

        如果函数调用中出现了*expression句法,expression必须求值为一个的迭代类型。 来自该可迭代对象的元素会被当作解析为位置实参。 对于f(x1, x2, *y, x3, x4)调用,如果y求值为一个序列y1, y2, ..., ym,则它就等价于一个带有M+4个位置参数f(x1, x2, *y, x3, x4)的调用。

        这样做的一个后果是虽然*expression句法可能出现于显式的关键字实参之后,但它会在关键字参数(以及任何**expression参数 -- 见下文)之前被处理为位置实参。 因此:

def f(a, b):
    print(a, b)

f(b=1, *(2,)) # 一般情况下,位置参数不能在关键词参数后,但由*中解析的位置参数除外
输出:2 1     # 2会被解包并作为位置实参填充形参a

f(a=1, *(2,)) # 2被解包并作为位置实参填充形参a,之后关键词实参a=1又填充了a,因此报错
输出:Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f() got multiple values for keyword argument 'a'

f(1, *(2,))
输出:1 2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1016529.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无涯教程-JavaScript - CEILING.MATH函数

描述 CEILING.MATH函数将数字四舍五入到最接近的整数或最接近的有效倍数。 Excel CEILING.MATH函数是Excel中的十五个舍入函数之一。 语法 CEILING.MATH (number, [significance], [mode])争论 Argument描述Required/OptionalNumberNumber must be less than 9.99E307 and …

运维自动化:提高效率的秘诀

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

从一到无穷大 #16 ByteSeries,思考内存时序数据库的必要性

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 引言 在[3]中我基于Gorilla讨论了时序数据库设置cache的可行性&#xff0c;最后得出结论&…

许可分析 license分析 第十章

许可分析是指对软件许可证进行详细的分析和评估&#xff0c;以了解组织内部对软件许可的需求和使用情况。通过许可分析&#xff0c;可以帮助组织更好地管理和优化软件许可证的使用。以下是一些可能的许可分析方法和步骤&#xff1a; 软件许可证供应商管理&#xff1a;评估和管理…

CSS 浮动布局

浮动的设计初衷 float: left/right/both;浮动是网页布局最古老的方式。 浮动一开始并不是为了网页布局而设计&#xff0c;它的初衷是将一个元素拉到一侧&#xff0c;这样文档流就能够包围它。 常见的用途是文本环绕图片&#xff1a; 浮动元素会被移出正常文档流&#xff0c;…

Redis集群总结

Redis&#xff0c;作为一款开源的、内存中的数据结构存储系统&#xff0c;以其出色的性能和丰富的数据结构在业界赢得了广泛的认可。然而&#xff0c;当我们面临大量数据和高并发请求时&#xff0c;单个 Redis 实例可能无法满足我们的需求。这时&#xff0c;我们就需要使用到 R…

Kubernetes实践:从入门到实践

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

认识Git的工作区、暂存区与版本库

使用 git init 命令在 gitcode 文件夹下创建如下图所示的Git仓库。现在思考这样一个问题&#xff1a;gitcode目录下创建的README文件可以直接被git管理和追踪吗&#xff1f; 答案是否定的&#xff0c;因为只有 Git 本地仓库中的文件才可以被版本控制。什么&#xff1f;难道当前…

内网隧道代理技术(二十七)之 DNS隧道介绍

DNS隧道介绍 DNS协议介绍 域名系统(Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符…

第二篇------Virtual I/O Device (VIRTIO) Version 1.1

上篇文章&#xff1a;https://blog.csdn.net/Phoenix_zxk/article/details/132917657 篇幅太大&#xff0c;所以分开写&#xff0c;接下来续上 4.3.3.2.1 设备要求&#xff1a;Guest->Host 通知 设备必须忽略 GPR2 的位 0-31&#xff08;从左边数&#xff09;。这样可以使…

Eclipse开源代码下载

当前插件开发&#xff0c;需要修改eclipse源码&#xff0c;如需要修改remote相关的代码&#xff0c;所以需要下载相关源码。网上大多资料都说的不清不楚的&#xff0c;也可能我太小白&#xff0c;不明白&#xff0c;反正就是折腾了一两天才感觉有点思路&#xff0c;改如何找源码…

Linux安全加固:保护你的服务器

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

基于springboot+vue的问卷调查系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

聊天机器人

收集窗帘相关的数据 可以用gpt生成&#xff0c;也可以用爬虫 图形化界面 gradio 向量数据库 faiss python代码 import gradio as gr import random import timefrom typing import Listfrom langchain.embeddings.openai import OpenAIEmbeddings from langchain.vectorstor…

央媒发稿不能改?媒体发布新闻稿有哪些注意点

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 “央媒发稿不能改”是媒体行业和新闻传播领域的普遍理解。央媒&#xff0c;即中央主要媒体&#xff0c;是权威性的新闻源&#xff0c;当这些媒体发布新闻稿或报道时&#xff0c;其他省、…

服务器监控工具:选择与应用

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

积木报表 JimuReport v1.6.2-GA5版本发布—高危SQL漏洞安全加固版本

项目介绍 一款免费的数据可视化报表&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完成报…

活锁 死锁

一、活锁&#xff08;liveLock&#xff09; 活锁是指线程间资源冲突激烈&#xff0c;引起线程不断的尝试获取资源&#xff0c;不断的失败。活锁有点类似于线程饥饿&#xff0c;虽然资源并没有被别人持有&#xff0c;但由于各种原因而无法得到。最常见的原因是进程组的执行顺序…

gRpc入门和springboot整合

gRpc入门和springboot整合 一、简介 1、gprc概念 gRpc是有google开源的一个高性能的pc框架&#xff0c;Stubby google内部的rpc,2015年正式开源&#xff0c;云原生时代一个RPC标准。 tips:异构系统&#xff0c;就是不同编程语言的系统。 2、grpc核心设计思路 grpc核心设计…

【C++深入浅出】日期类的实现

目录 一. 前言 二. 日期类的框架 三. 日期类的实现 3.1 构造函数 3.2 析构函数 3.3 赋值运算符重载 3.4 关系运算符重载 3.5 日期 /- 天数 3.6 自增与自减运算符重载 3.7 日期 - 日期 四. 完整代码 一. 前言 通过前面两期类和对象的学习&#xff0c;我们已经对C的…