函数的概念我估计每个人都不陌生,我们在学习C语言的时候就知道怎么定义一个函数了,那为什么要定义函数呢? 一般情况是第一你为了让主逻辑更清晰,第二是为了代码重用, 经常写shell脚本的人应该都有自己的函数库,在Python下也类似,很多功能可以复用,了解完这些我们来看看Python下的函数定义和调用。
函数定义和调用
在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__就是函数的文档字符串可以简单理解为注释内容。