python 中的函数參数是赋值式的传递的,函数的使用中要注意两个方面:1.函数參数的定义过程,2.函数參数在调用过程中是怎样解析的。

首先说一下在python 中的函数调用过程是分四种方式的。这里且先说五种。第五种已经在曾经的文章中说过了

1.參数枚举的函数定义:

>>> def Fun(a,b,c):
return (a,b,c) >>> Fun(1,2,3)
(1, 2, 3)
>>> Fun(1,2) # 枚举參数个数不正确应 Traceback (most recent call last):
File "<pyshell#61>", line 1, in <module>
Fun(1,2)
TypeError: Fun() takes exactly 3 arguments (2 given)
>>>
>>> def Fun(a,b,c):
print (a,b,c) >>> Fun(a=22,b=33,c=44)
(22, 33, 44)
>>> Fun(22,33,44)<span style="white-space:pre"> </span># 不指定赋值对象。就是依照顺序匹配
(22, 33, 44)
>>> Fun(22,33,c=44) <span style="white-space:pre"> </span># 能够指定參数的赋值对象。也能够不指定。
(22, 33, 44)
>>> Fun(b=22,a=33,c=44) # 參数顺序能够不正确应
(33, 22, 44)
>>>

这是最常见的定义方式,一个函数能够枚举定义随意多的參数,每一个參数之间使用逗号隔开。用这样的方式定义的函数在调用的时候实參的个数和形參的个数必须相等。而且顺序是一一相应的,假设出现參数数量不正确或者參数类型不正确应就会报错。

2.带默认參数的函数定义(在曾经专门写过这里面须要注意的):

>>> def Fun(a,b,c=33):
print (a,b,c) >>> Fun(11,22) # 能够不写默认參数
(11, 22, 33)
>>> Fun(1) # 就是至少实參的个数和非默认參数的个数同样 Traceback (most recent call last):
File "<pyshell#66>", line 1, in <module>
Fun(1)
TypeError: Fun() takes at least 2 arguments (1 given)
>>> Fun(1,2,3) <span style="white-space:pre"> </span># 能够覆盖默认參数
(1, 2, 3)

这样的方式就能够在调用的时候不填写默认參数了。可是要注意含有默认值的函数在定义的时候就已经把他的默认參数初始化了,这个在曾经的文章也谈过

3.不确定參数个数的函数定义:

>>> def Fun(*a):
if 0 == len(a):
print 'None'
else:
print a >>> Fun(1,2,3)
(1, 2, 3) # tuple 类型
>>> Fun(a=1,b=2,c=33) # 不能在依照字典的方式赋值 Traceback (most recent call last):
File "<pyshell#93>", line 1, in <module>
Fun(a=1,b=2,c=33)
TypeError: Fun() got an unexpected keyword argument 'a'
>>> Fun() # 能够是0參数
None

这样的带*号的说明參数的个数是不确定的。在调用的时候想传多少个 參数都行[0,n]。呵呵,爽吧。可是他传入的參数都会放在一个
tuple中,假设有返回值的接受的时候也是用tuple行了,对于函数内部不确定的数量赋值时直接就循环迭代赋值就Ok了。

4.不确定个数的字典參数定义:
在定义的形參处加两个*,就是在函数内部处理函数的时候都是用字典的形式保存,当然调用的时候要用key=value的形式

>>> def Fun(**a):
if 0 == len(a):
print 'None'
else:
print a >>> Fun(1,2,3,4) # 字典赋值。这样就不行了 Traceback (most recent call last):
File "<pyshell#83>", line 1, in <module>
Fun(1,2,3,4)
TypeError: Fun() takes exactly 0 arguments (4 given)
>>> Fun(a=1,b=2,c=3) <span style="white-space:pre"> </span># 必须key=value的赋值
{'a': 1, 'c': 3, 'b': 2} <span style="white-space:pre"> </span># dict 类型
>>> Fun(aa=3,b=333,d=44)
{'aa': 3, 'b': 333, 'd': 44}

最后一个关于函数參数赋值优先级的样例:

>>> def Fun(a,b,c=22,*d,**e):
print a,b,c,d,e >>> Fun(1) Traceback (most recent call last):
File "<pyshell#98>", line 1, in <module>
Fun(1)
TypeError: Fun() takes at least 2 arguments (1 given)
>>> Fun(1,2)
1 2 22 () {}
>>> Fun(1,2,3)
1 2 3 () {}
>>> Fun(1,2,3,4,5) # 默认顺序匹配把多余的參数匹配给tuple
1 2 3 (4, 5) {}
>>> Fun(1,2,3,4,5,aa=33,bb=33) # 把字典赋值匹配给dict
1 2 3 (4, 5) {'aa': 33, 'bb': 33}
>>> Fun(a=3,c=4,b=2b)
SyntaxError: invalid syntax
>>> Fun(a=3,c=4,b=22) <span style="white-space:pre"> </span> # 在字典赋值和枚举匹配赋值的时候优先考虑匹配赋值
3 22 4 () {}
>>> Fun(b=22,a=22,e=(1,2,3))
22 22 22 () {'e': (1, 2, 3)}
>>> Fun(b=22,c=77,2,3,4,5,6,) # 没有给a 赋值,多一个逗号
SyntaxError: non-keyword arg after keyword arg
>>> Fun(b=22,c=77,2,3,4,5,6,k=44)
SyntaxError: non-keyword arg after keyword arg
>>> Fun(b=22,c=77,a=44,2,3,4,5,6,)
>>> Fun(1,2,3,(22,3334,34))   # 直接使用tuple的实參传递<br style="font-family: 'Microsoft YaHei';font-size:14px;" /><span style="font-family: 'Microsoft YaHei';font-size:14px;">1 2 3 ((22, 3334, 34),) {}</span><br style="font-family: 'Microsoft YaHei';font-size:14px;" />

能够看出这里函数參数的赋值方式是有所区别的,依照 1 。2,3,4的优先级依次减少。也就是先为枚举形參赋值,再为默认參数赋值,然后多出来的就都组装在在tuple中传过去,给带*的參数,最后把key=value的形式组装成字典的形式传进去,给**的參数

5.修饰器的函数调用方式(不是函数的定义方式,仅仅是一种函数调用约定):

@Fun

详细的这样的函数调用方式看曾经的那篇文章吧:

人个论坛:http://itpark.sinaapp.com/

各种python 函数參数定义和解析的更多相关文章

  1. python可变參数调用函数问题

    一直使用python实现一些想法,近期在使用python的过程中出现这样一个需求,定义了一个函数.第一个是普通參数.第二个是默认參数,后面还有可变參数,在最初学习python的时候,都知道非keywo ...

  2. 【VBA研究】VBA自己定义函数參数类型不符的错误

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/iamlaosong/article/details/36871769 作者:iamlaosong 1 ...

  3. Python函数的基本定义和调用以及内置函数

    首先我们要了解Python函数的基本定义: 函数是什么? 函数是可以实现一些特定功能的小方法或是小程序.在Python中有很多内建函数,当然随着学习的深入,你也可以学会创建对自己有用的函数.简单的理解 ...

  4. C++容器类对象函数參数问题

    总之中的一个句话:容器类对象作为函数參数,与整数类型作为函数參数的传递特性同样. 验证程序 #include "stdafx.h" #include <iostream> ...

  5. JavaScript的最大函数參数长度和最大栈深度检測

    一般代码也许不会涉及最大參数长度和最大栈深度,但某些特殊场合,检測这两个參数还是有必要的.比如:用递归计算斐波那契数列的第n个值,不了解最大栈深度,难免显得肤浅.又比如:将一串charCode转成St ...

  6. Effective JavaScript Item 55 接受配置对象作为函数參数

    接受配置对象作为函数參数 尽管保持函数接受的參数的顺序非常重要,可是当函数可以接受的參数达到一定数量时.也会让用户非常头疼: var alert = new Alert(100, 75, 300, 2 ...

  7. cmake函数參数解析

    近期在迁移公司的make系统到cmake上.发现cmake的function參数非常奇怪.比如,假设我们向一个function传递list作为參数,在function中,形參会变成例如以下状况: se ...

  8. C语言中的system函数參数具体解释

    http://blog.csdn.net/pipisorry/article/details/33024727 函数名: system 功   能: 发出一个DOS命令   用   法: int sy ...

  9. C语言函数參数传递原理

    C语言中參数的传递方式一般存在两种方式:一种是通过栈的形式传递.还有一种是通过寄存器的方式传递的. 这次.我们仅仅是具体描写叙述一下第一种參数传递方式,第二种方式在这里不做具体介绍. 首先,我们看一下 ...

随机推荐

  1. fauxbar.bak

    {"options": { "almostdone":"0", "backup_searchEngines":" ...

  2. C++ 11中几个我比较喜欢的语法(二)

    之前在文章C++ 11中几个我比较喜欢的语法中介绍了几个我比较喜欢的C++语法,其中有些语法由于VC 11还不支持,无法跨平台,所以没有介绍.前几天VS 2013 Preview发布后,对C++ 11 ...

  3. jquery dataTable 获取某行数据

    DataTable API table.row(rowSelector [,modifier]) 注table是dataTable的对象 该方法有两个默认参数 第一个是选择器 第二个是可选的 请注意, ...

  4. DedeCMS使用channelartlist循环,不能获取外部链接的解决办法

    Dede在制作下拉菜单时,可以使用channelartlist循环调用顶级栏目和子栏目,但该标签不能获取外部链接, 下拉菜单时一段代码搞定多个顶级栏目和子级栏目的同时输出. <div>   ...

  5. EasyMvc入门教程-高级控件说明(18)弹出框控件

    前面两节介绍了信息框与对话框,实际开发中如果我们遇到更复杂的要求,比如要求在弹出框里显示另外的网址,如下所示: 实现代码如下: @Html.Q().Popup().Text("我可以嵌套网页 ...

  6. PE经典DIY案例1:全解开方案让量产PE也能

    更新说明:因未来的uefi似乎并不能识别并引导ud区,但能识别和引导量产和u+B+隐藏或高端隐藏区,故解决量产PE对u+B+隐藏区的支持,并增加对UEFI启动支持,已经成为PE制作的最主流技术. PE ...

  7. c 数组做为形參时 该參数退化为指针

    当数组做为函数的形參的时候,该參数退化为指针,而且是无法直接求得数组的大小. 传数组给一个函数.数组类型自己主动转换为指针类型,因而传的实际是地址. void func(int array[10]) ...

  8. CentOS下iptables 配置详解

    如果你的IPTABLES基础知识还不了解,建议先去看看. 开始配置 我们来配置一个filter表的防火墙. (1)查看本机关于IPTABLES的设置情况 [root@tp ~]# iptables - ...

  9. 【转载】关于 .Net 逆向的那些工具:反编译篇

    在项目开发过程中,估计也有人和我遇到过同样的经历:生产环境出现了重大Bug亟需解决,而偏偏就在这时仓库中的代码却不是最新的.在这种情况下,我们不能直接在当前的代码中修改这个Bug然后发布,这会导致更严 ...

  10. objc_msgSend 报错

    NSMutableArray * mutableArray = [NSMutableArray arrayWithArray:array]; objc_msgSend(mutableArray,@se ...