python可变参数调用函数的问题
已使用python实现的一些想法,近期使用python这种出现的要求,它定义了一个函数,第一种是一般的参数,第二个参数是默认,并有可变参数。在第一项研究中python时间,不知道keyword可变参数和keyword可变參数两种,调用的方式或许多种多样。这里主要提出一个比較隐含的问题。并将各种可能出现的情况进行了探讨。
函数声明格式
python尽管不支持函数重载。可是通过对函数參数的众多特性的支持基本弥补了。
函数声明的通式例如以下:
def func(argv1,argv2...[,argv_d = default1,...]\
[,*var_argv][,**var_key_argv])
这是python函数声明的通式,首先是普通參数若干个,也能够没有。接着是带默认值的參数,然后是非keyword可变參数,最后是keyword可变參数。这为python提供的强大函数调用奠定了基础。
函数调用
正是在函数调用的过程中遇到了问题。为了说明,我定义了一个例如以下的函数进行说明:
def f1(a,b=1,*var): print a,'\t',b,'\t',var
def f2(a,b=1,**var): print a,'\t',v,'\t',var
首先普通參数能够使用按位置的方式调用。同一时候能够使用按形參keyword调用。默认值參数也是使用位置方式匹配或者keyword调用。实比例如以下:
这里没有使用后面的可变參数。一切都没有问题。问题是,本人遇到的一个需求是,默认參数须要就是使用默认值调用,同一时候还有可变參数。并且是非keyword參数,那么调用时就会出现以下的情况:
能够看到,通过非keyword可变參数传入參数之后,python会默认把非keyword可变參数的前面若干个(这里是1个)当做默认參数,这里是由于我没有提供默认參数b的值,正是这个原因,在我的程序中一直没发现。后来自习思考一下,发现Python解释器做出这种决定还是有一定的道理的,由于非keyword可变參数是默认參数之后的若干个參数,而在调用的时候由于没有传入默认參数的值。Python无法推断究竟从哪里開始是可变參数,因此在没有传入默认參数的值时,就依次从非keyword參数(调用者觉得的)中依照顺序抽取去当做默认參数的值。这从側面论证了非keyword可变參数在python内部是和普通參数默认參数一并处理的。
尽管上述调用有些极端,可是确实会出现这种需求,那么能够使用keyword可变參数进行替换,上述问题就能够攻克了。由于解释器是能够差别keyword參数和默认參数的,调用例如以下:
在使用keyword可变參数时。另一个重要问题就是。keyword參数的键值不能有普通參数或者默认參数的參数名反复,这从側面论证了。python对keyword调用和keyword可变參数在内部都是经过同一个字典保存的,因此不能有反复的键,调用例如以下:
上述遇到的问题是在实际操作过程中遇到的,一般从各种教程、书本学习python都仅仅是说明上述的函数声明和调用的方式,可是差点儿没有这种实际操作中可能遇到的点点滴滴。因此学习不论什么东西最好的方式就动手。这个真理永远不会变啦!
python可变参数调用函数的问题的更多相关文章
- JavaScript Arguments 实现可变参数的函数,以及函数的递归调用
//可变参数的函数 注:也可以使用对象作为参数来实现 function Max() { var temp = arguments[0] || 0; for (var i = 1; i < arg ...
- python定义函数时的参数&调用函数时的传参
一.定义函数: 1.位置参数:直接定义参数 2.默认参数(或者关键字参数):参数名 = "默认值" 3.位置参数必须在默认参数之前 二.调用函数: 1.按位置传,直接写参数的值 2 ...
- Java可变参数 & Python可变参数 & Scala可变参数
Java 可变参数的特点: (1).只能出现在参数列表的最后: (2)....位于变量类型和变量名之间,前后有无空格都可以: (3).调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体 ...
- python中如何调用函数交换两个变量的值
python中如何调用函数交换两个变量的值 所有代码来在python3.7.1版本实现 以下实例通过用户输入两个变量,并相互交换: 方法一: def swap(a,b): # 创建临时变量,并交换 ...
- Python可变参数*args和**kwargs
本文我们将通过示例了解 Python函数的可变参数*args和 **kwargs的用法. 知识预备:Python 函数和 Python 函数参数 在Python编程中,我们定义一个函数来生成执行类似操 ...
- [Effective JavaScript 笔记]第21条:使用apply方法通过不同数量的参数调用函数
apply()方法定义 函数的apply()方法和call方法作用相同,区别在于接收的参数的方式不同.apply()方法接收两个参数,一个是对象,一个是参数数组. apply()作用 1.用于延长函数 ...
- [Effective JavaScript 笔记]第22条:使用arguments创建可变参数的函数
第21条讲述使用可变参数的函数average.该函数可处理任意数量的参数并返回这些参数的平均值. 如何创建可变参数的函数 1.实现固定元数的函数 书上的版本 function averageOfArr ...
- C语言利用va_list、va_start、va_end、va_arg宏定义可变参数的函数
在定义可变参数的函数之前,先来理解一下函数参数的传递原理: 1.函数参数是以栈这种数据结构来存取的,在函数参数列表中,从右至左依次入栈. 2.参数的内存存放格式:参数的内存地址存放在内存的堆栈段中,在 ...
- c 可变参数 定义可变参数的函数
定义可变参数的函数,需要在stdarg.h头文件中定义的va_list类型和va_start.va_arg.va_end三个宏. 定义可变参数函数 va_list ap; //实际是定义一个指针va ...
随机推荐
- c++/c/java 资源共享群
Hi,我邀请你加入360云盘文件共享群:c++&c&java, 打开邀请链接:http://qun.yunpan.360.cn/10005202 , 输入邀请码:1357
- 运行Dos命令并得到dos的输出文本(使用管道函数CreatePipe和PeekNamedPipe)
function RunDOS(const CommandLine: string): string;var HRead, HWrite: THandle; StartInfo: TStartup ...
- 网络知识汇总(2) - Linux下如何修改ip地址
在Linux的系统下如何才能修改IP信息 以前总是用ifconfig修改,重启后总是得重做.如果修改配置文件,就不用那么麻烦了- A.修改ip地址 即时生效: # ifconfig e ...
- ifconfig 源码
贴一下ifconfig的源码(它属于net-tool软件包),以备平时查看网络信息的配置. /* * ifconfig This file contains an implementation of ...
- [C++]new和delete
Date:2014-1-5 Summary: C++中的动态内存创建与释放(这里就只记录C++中的new和delete了,其他的C风格操作就略过了) 单独记录new和delete的原因是为了学习时候关 ...
- ural 1837. Isenbaev's Number bfs
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1837 描述: Isenbaev是国外的一个大牛. 现在有许多人要参加ACM ICPC. ...
- Cocos2d-x串算出Size方法
项目需要,根据所输入的字符串,的需要计算串帐户Size. 包代码如下面.只需要传递一个字符串,您可以返回Size: Size ChartDemoScene::calculateFontSize(con ...
- 【瞎搞】 HDU 3101 The Heart of the Country
比赛时愣是没读懂 题意:有N 个城市 每一个城市都有 val 个 士兵 , 有几条路连接 当敌方攻击你的某个城市时 该城市以及与该城市相连接的城市的士兵总数 要大于 K 不大于 K 该城市就被攻陷.士 ...
- zoj2059(经典dp)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1059 分析:dp[i][j]表示前i个石头组成两座塔高度差为j的较低 ...
- Cygwin下vim按方向键出现ABCD;
1:乱码解决Option->Text设置编码 2:vim按方向键出现A.B.C.D 解决:--$ cd /usr/share/vim/vim73 (ps:看你的版本号.假设没有这个文件可能是/u ...