内容简介:python基础8-函数
函数的概念我估计每个人都不陌生,我们在学习 C语言 的时候就知道怎么定义一个函数了,那为什么要定义函数呢? 一般情况是第一你为了让主逻辑更清晰,第二是为了代码重用, 经常写 shell 脚本的人应该都有自己的函数库,在 Python 下也类似,很多功能可以复用,了解完这些我们来看看Python下的函数定义和调用。
1、函数定义和调用
在python下定义一个函数要以def开头,然后跟上函数名称和一个括号,最后加上冒号,然后回车空格来写代码块,我们来看一个最简单的函数:
>>> def show(): ... print 'ok' ... >>> show() ok >>>
这里定义了一个叫show的函数名称,函数体就包含了一个执行命令,调用方式是在函数名称后加小括号,在函数名称后的括号可以加入参数传给到函数体内,例如:
>>> def add(x,y): ... print x + y ... >>> add(1,2) 3
这里我们定义了另一个add函数,传入2参数,然后打印两个数的和。
在函数体内除了用print打印我们需要看的内容,还有非常重要的return语句,这个是返回函数处理完的结果,例如我之前写的生成安全组Json格式的函数,完整代码请看这里:
def make_json(vmid,sgid): pdata = {} pdata["instanceId"] = vmid pdata["sgIds"] = sgid pjson = json.dumps(pdata) return pjson
这个函数功能就是将一个字典转成json格式的然后返回。
函数的参数除了上面我们说的基本参数外还有不定长参数,就是你的参数数量不确定,这是我们要在传入的参数前加一个“*”来表示,我们来个例子:
>>> def printnumber( arg1, *vartuple ): ... print "Output is: " ... print arg1 ... for var in vartuple: ... print var ... >>> printnumber( 10 ) Output is: 10 >>> printnumber( 70, 60, 50 ) Output is: 70 60 50
这里传入的*vartuple就是一个不定长的变量,可以没有,也可以是多个,如果多个在函数体内就做一个元组来处理,你要问你怎么知道是作为一个元组来处理呢,我们来测试下看看:
>>> def printnumber( arg1, *vartuple ): ... print "Output is: " ... print arg1 ... for var in vartuple: ... print var ... print type(vartuple) ... >>> printnumber( 70, 60, 50 ) Output is: 70 60 50 <type 'tuple'>
代码没变,我只加了一句,最后输入的就是一个元组类型,也就说明不管你后传入多少参数,统一作为一个元组来处理,相当于传入一个元组。
除了元组可变长参数,还有一种是关键字参数(字典),j这种方式可以将一个Key=value作为参数传入函数中,参数的表示方式是在变量前加两个“**”,关键字参数应该是函数的最后一个参数,例子如下:
>>> def printme(arg1,**kw): ... print arg1 ... for i in kw.keys(): ... print i + '=' + kw[i] ... >>> printme(1,name='xiaoming') 1 name=xiaoming >>> printme(1,name='xiaoming',add='Bj') 1 add=Bj name=xiaoming
最后说一下,我们说的这些参数并不是单一使用的,它们完全可以放到一个函数中,例如:
def printme(arg1,*args,**kargs): print arg1 ....
函数要根据传入的参数进行对应的处理。
前面讲的都是我们需要定义名字的函数,在python里还有一种函数叫匿名函数lambda,它的格式非常简答,但它不太容易理解,它的用法格式如下:
lambda 参数:表达式
例如:
>>> f = lambda x, y : x + y >>> f(1,1) 2
另一个有趣的例子:
>>> a = lambda x, y=2: x * y >>> a(2) 4 >>> a(2,3) 6
当然除了这些python内置了很多有用的函数想map(),reduce(),filter()等,这个后续我们可以单独说这几个函数。
最后我们要说一下函数的变量作用域,变量分局部变量和全局变量,当python解释语句时,先从局部变量开始搜索,如果局部变量没有,就会在全局变量里找,在函数体内定义的是局部变量,函数外的变量是全局变量,那这里就有一个问题,如果全局变量跟函数体内定义的变量名称相同,那在执行时全局变量就会被覆盖,因为在局部变量找到了就不会再全局变量里找了,所以函数要引用一个全局变量就必须用global语句,例如:
>>> a = 2 >>> def p(): ... global a ... print a ... >>> p() 2
global语句的作用是让函数体直接使用全局变量,而无需在函数体内再定义个新局部变量了。
再说最后一个问题,那就是有时候我们经常会在python里看到以两个下划线(__)开头的和结束的名词,大家也不用觉得很奇怪,这些都是python自己保留的用法,所以我们在自定义的变量中是不能用的,例如function.__name__就是函数的名词,function.__doc__就是函数的文档字符串可以简单理解为注释内容。
函数部分就到这里,关于函数的内容真的非常多,我这里说的也基本是很入门的内容,一些高级的内容像闭包,装饰器等实在无法展开写,因为每个都够写几篇的,所以这些后续我们单独去详细讨论,当然如果是初学者,这两个东西搞不懂也不影响你学习,等你用到了在学都来得及,前期主要是把这些基本的打扎实,在此基础上去理解一些概念就会非常简单,最后感谢大家阅读本文章,喜欢的朋友请帮忙转发下吧~
以上所述就是小编给大家介绍的《python基础8-函数》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
TCP/IP网络管理
亨特 / 电子工业 / 2006年3月1日 / 79.00元
本书是一本架设与维护TCP/IP网络的完整指南,无论你是在职的系统管理员,还是需要访问Internet的家用系统用户,都可从本书获得帮助。本书还讨论了高级路由协议(RIPv2、OSPF、BGP),以及实现这些协议的gated软件。对于各种重要的网络服务,如DNS,Apache,sendmail,Samba,PPP和DHCP,本书都提供了配置范例,以及相关的软件包与工具的语法参考。一起来看看 《TCP/IP网络管理》 这本书的介绍吧!