设为首页 收藏本站
查看: 902|回复: 0

[经验分享] 美妙的Python又来了

[复制链接]

尚未签到

发表于 2015-4-26 07:10:51 | 显示全部楼层 |阅读模式
         今天继续去了解小蟒蛇的可爱特性,在函数定义和调用方面,有三个地方让我觉得蛮有意思的。
       第一个有意思的地方是缺省实参, 也就是在Python中定义函数,你可以为参数设定缺省值(默认值),这个特性在C和C++
中也是有的,但是在Java中却没有,至于C#中有没有,就不清楚了。如下所示:     


def  test(a, b, c=3):
        print a, b, c
  当你调用test函数的时候,你可以这样调用test("abc", "def"), 这样是等价于test("abc", "def", 3)的。在
设定参数的缺省值的时候,必须遵循的一个原则就是带缺省值的参数必须要放在没有缺省值的后面,也就是说像def test(a=3, b, c)这样的函数定义是错误的。而这个原则也适用于C和C++。使用缺省参数的好处是显而易见的,如果一个参数在大多数的情况都使用某一个确定的值,你就没有必要在每次函数调用中都不厌其烦的把这个值写了一遍又一遍了。虽然Python在缺省实参的使用上延续了C和C++的规则,但是它仍然有着自己的创新之处。还是上面的test函数,你是可以这样调用的test(c=2, b=4, a=5),是不是很灵活呢?这正好说明了在函数调用的时候,参数与参数值就是一个key/value pair(键值对),而键值对在Python当中就是Dictionary类型,Dictionary类型本身是无序的,那么哪个参数在前,哪个参数在后就无关紧要了。
   
        第二个是随机参数表,也就是你可以定义一个函数,而它不管你传递多少个参数都照单全收。不用惊讶,看看下面简单的代码吧



def test(*arg):
       print arg
  你可以这样调用:test(1, 2, 3),也可以这样调用:test("abc", 2, 3, [1, 2, 3])。所有传递给test的
实参都会存储在arg这个tuple当中。是不是觉得很特别呢?其实,这也不是什么新鲜的特性了,在C和C++当中可以使用省略号来指定函数参数表,也就是说在C和C++中,你可以定义一个没有参数列表的函数,就像这样void foo(...),而这个函数是可以接收任意多个实参的。也许你从来都没有在C和C++中定义过以省略号作为参数表的函数,但是你一定使用过一个这样使用省略号定义的函数,它就是printf。printf的定义是int printf(const char* ...); 通常你可以这样调用:printf("Hello, world"); 同时也可以这样 printf("Hello, %s", yourName); 第二种调用方式就包含了两个实参,%号代表第二个参数,s则表示参数类型是字符串。
        在随机参数表方面, Python在充分遵循C和C++的原则之余,仍然发挥着其独有的创意。如上所述,由于
可以使用类似test(c=2, b=4, a=5)的调用方式, Python也有一个特殊符号来应对这样的函数调用。如下所示



def test(**arg):
        print arg
  arg实际上就是一个Dictionary,当你这样调用的时候:test(c=2, b=4, a=5),arg的内容就是{'c':2,
'b':4, 'a':5}。
       最后一个就是打包和解包实参。上面所说的两点让函数定义变得更加的简洁和方便,至少你不再需要定义一个带着长长的参数表的函数了。但是这仅是函数定义啊,如果我要向一个函数传递十个参数,不是还要在调用的时候写上一大串吗? 别急,Python是不会顾此失彼的。以第一个定义的test函数为例,它需要至少两个参数,那么我们可以定义一个List或者Tuple,把实参都放到里面去——打包实参。然后在函数调用的时候,通过*号从List或者Tuple中将实参取出来传递给函数——解包实参。如下如示:



def  test(a, b, c=3):
        print a, b, c

args = [2, 4, 5]
test(*args)               # test(*args) 等价于 test(2, 4, 5)
  Python又让我再一次领略到了它的灵活和巧妙,还有汲取百家之长的谦逊。 这些,你感受到了吗?

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-60669-1-1.html 上篇帖子: 用python做了个桌球瞄准器 下篇帖子: Python学习笔记(3):运算符与表达式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表