摘要:下面总结通过总结常见的函数参数定义方式,来理解参数传递的流程。这种方式最常见了,列出有限个数的参数,并且彼此之间用逗号隔开。而且,必须数量一致,一一对应。
就前面所讲,函数的基本内容已经完毕。但是,函数还有很多值得不断玩味的细节。这里进行阐述。
参数的传递python中函数的参数通过赋值的方式来传递引用对象。下面总结通过总结常见的函数参数定义方式,来理解参数传递的流程。
def foo(p1,p2,p3,...)这种方式最常见了,列出有限个数的参数,并且彼此之间用逗号隔开。在调用函数的时候,按照顺序以此对参数进行赋值,特备注意的是,参数的名字不重要,重要的是位置。而且,必须数量一致,一一对应。第一个对象(可能是数值、字符串等等)对应第一个参数,第二个对应第二个参数,如此对应,不得偏左也不得偏右。
>>> def foo(p1,p2,p3): ... print "p1==>",p1 ... print "p2==>",p2 ... print "p3==>",p3 ... >>> foo("python",1,["qiwsir","github","io"]) #一一对应地赋值 p1==> python p2==> 1 p3==> ["qiwsir", "github", "io"] >>> foo("python") Traceback (most recent call last): File "def foo(p1=value1,p2=value2,...)", line 1, in TypeError: foo() takes exactly 3 arguments (1 given) #注意看报错信息 >>> foo("python",1,2,3) Traceback (most recent call last): File " ", line 1, in TypeError: foo() takes exactly 3 arguments (4 given) #要求3个参数,实际上放置了4个,报错
这种方式比前面一种更明确某个参数的赋值,貌似这样就不乱子了,很明确呀。颇有一个萝卜对着一个坑的意味。
还是上面那个函数,用下面的方式赋值,就不用担心顺序问题了。
>>> foo(p3=3,p1=10,p2=222) p1==> 10 p2==> 222 p3==> 3
也可以采用下面的方式定义参数,给某些参数有默认的值
>>> def foo(p1,p2=22,p3=33): #设置了两个参数p2,p3的默认值 ... print "p1==>",p1 ... print "p2==>",p2 ... print "p3==>",p3 ... >>> foo(11) #p1=11,其它的参数为默认赋值 p1==> 11 p2==> 22 p3==> 33 >>> foo(11,222) #按照顺序,p2=222,p3依旧维持原默认值 p1==> 11 p2==> 222 p3==> 33 >>> foo(11,222,333) #按顺序赋值 p1==> 11 p2==> 222 p3==> 333 >>> foo(11,p2=122) p1==> 11 p2==> 122 p3==> 33 >>> foo(p2=122) #p1没有默认值,必须要赋值的,否则报错 Traceback (most recent call last): File "def foo(*args)", line 1, in TypeError: foo() takes at least 1 argument (1 given)
这种方式适合于不确定参数个数的时候,在参数args前面加一个*,注意,仅一个哟。
>>> def foo(*args): #接收不确定个数的数据对象 ... print args ... >>> foo("qiwsir.github.io") #以tuple形式接收到,哪怕是一个 ("qiwsir.github.io",) >>> foo("qiwsir.github.io","python") ("qiwsir.github.io", "python")
上一讲中已经有例子说明,可以和前面的混合使用。此处不赘述。
def foo(**args)这种方式跟上面的区别在于,必须接收类似arg=val形式的。
>>> def foo(**args): #这种方式接收,以dictionary的形式接收数据对象 ... print args ... >>> foo(1,2,3) #这样就报错了 Traceback (most recent call last): File "", line 1, in TypeError: foo() takes exactly 0 arguments (3 given) >>> foo(a=1,b=2,c=3) #这样就可以了,因为有了键值对 {"a": 1, "c": 3, "b": 2}
下面来一个综合的,看看以上四种参数传递方法的执行顺序
>>> def foo(x,y=2,*targs,**dargs): ... print "x==>",x ... print "y==>",y ... print "targs_tuple==>",targs ... print "dargs_dict==>",dargs ... >>> foo("1x") x==> 1x y==> 2 targs_tuple==> () dargs_dict==> {} >>> foo("1x","2y") x==> 1x y==> 2y targs_tuple==> () dargs_dict==> {} >>> foo("1x","2y","3t1","3t2") x==> 1x y==> 2y targs_tuple==> ("3t1", "3t2") dargs_dict==> {} >>> foo("1x","2y","3t1","3t2",d1="4d1",d2="4d2") x==> 1x y==> 2y targs_tuple==> ("3t1", "3t2") dargs_dict==> {"d2": "4d2", "d1": "4d1"}
通过上面的例子,看官是否看出什么名堂了呢?
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/45301.html
摘要:每个形参的名称均可作为过程内的局部变量。实参表示在您调用过程时传递给过程形参的值。看官如果硬着头皮看完这段引文,发现里面有几个关键词参数变量形参实参。好似全局变量能力很强悍,能够统帅函数内外。 对于变量和参数,不管是已经敲代码多年的老鸟,还是刚刚接触编程的小白,都会有时候清楚,有时候又有点模糊。因为,在实际应用中,它们之间分分离离,比如,敲代码都知道,x=3中x是变量,它不是参数,但是...
摘要:关于函数的事情,总是说不完的,下面就罗列一些编写函数的注意事项。函数具有独立性。也就是常说的不要有太强的耦合性。要让函数能够独立于外部的东西。函数实现的功能和目标要单一化。这跟前面的道理是一样的,目的是降低耦合性。 关于函数的事情,总是说不完的,下面就罗列一些编写函数的注意事项。特别声明,这些事项不是我总结的,我是从一本名字为《Learning Python》的书里面抄过来的,顺便写成...
摘要:特别提醒,看官不要自宫,因为本教程不是辟邪剑谱,也不是葵花宝典,撰写本课程的人更是生理健全者。直到目前,科学上尚未有证实或证伪自宫和写程序之间是否存在某种因果关系。和是中用的最多的方法啦。 Do not store up for yourselves treasures on earth, where moth and rust consume and where thieves...
摘要:字符串格式化的字符串字面值简称为字符串,是在字符串的开始引号之前加上一个或。在这样的字符串中,我们可以在花括号中引用变量或表达式。但在中,更推荐使用方法或字符串格式化。 利用print函数把信息打印到显示器,是我们编程中经常使用的功能。为了让打印的信息更容易读懂,就需要更好的格式来打印。Python提供了记住不同的格式化输出的方法。推荐的方法就是:f-字符串和str.format()函...
摘要:在对象接口后包装其实现的细节,从而隔离了代码的修改对用户产生的影响。类提供了一个新的本地作用域,最小化了变量名冲突。类其实并没有结束,不过本讲座到此对类暂告一段。 前面对类的有关内容已经描述不少了,其实话题远远没有结束,不过对于初学者,掌握这些已经算是入门,在以后的实践中,还需要进行体会和感悟。 这几天和几个朋友以各种途径讨论过OOP的相关问题,他们是:令狐虫、Frank、晋剑、小冯...
阅读 1088·2021-11-24 10:21
阅读 2544·2021-11-19 11:35
阅读 1638·2019-08-30 15:55
阅读 1274·2019-08-30 15:54
阅读 1179·2019-08-30 15:53
阅读 3473·2019-08-29 17:21
阅读 3272·2019-08-29 16:12
阅读 3390·2019-08-29 15:23