函数,是一小部分功能的集合。对于纯面向对象语言的JAVA而已,并没有独立于类之外的函数。这里不参与对比。和C++一样,Python支持单独定义函数,且函数的作用域为也可以理解为是Global的。只要把这个module import进来了,里面的函数就能直接使用
C++中函数的定义格式非常简单:返回值 函数名(参数...){函数体},就构成了一个函数。
而在Python中,因为是动态语言,所以不需要返回值类型定义;同样参数也只有名称,没有类型;此外,python给函数增加了一个关键def来标识,这点和C++中也不太一样。
样例:
>>> def sum(a,b):
return a+b
>>> print sum(1,4)
5
Python中的函数参数支持默认值,这点和C++中一样,但是JAVA中的函数是不支持默认值的。但是,python中函数参数值有个最大的不同在于,它的默认参数仅仅在第一次使用的时候进行判断,之后再调用该函数时,就直接采用第一次使用的那个对象,而不是再进行一次赋值操作。由于python的这个特性,使的在使用可变对象(例如list、dictionary以及class)作为默认参数时,需要尤其注意;因为很有可能这个对象在使用的过程中取值发生了变化,导致同样是采用默认参数调用该函数,前后两次调用的结果却不一样。
例如:定义函数f,第二个参数的默认参数是一个空的list,在执行完该函数后,这个list中的取值,不再是空的,而是有了一个a对象;当我们第二次调用f,仍然仅传入一个参数,第二个参数采用默认值时,此时的默认值不再是空了,而是包含了一个a对象的list,导致第二次调用f,返回的结果是[a,a]。如果不想要这样的结果,就需要把默认参数L的取值,修改为None,让其不能被改变。
>>> def f(a,L=[]):
L.append(a)
return L
>>> print f(1)
[1]
>>> print f(2)
[1, 2]
这点其实和C++中采用全局变量作为参数的默认值一样,函数的调用是会根据全局变量的取值变化而变化的;我们可以理解为Python自己用一个变量在第一次调用该函数时存储了其默认变量的取值,如果有操作修改了该变量,那么下一次调用该函数时,python仍然使用该变量去操作,自然结果就不同了。
除了默认值外,python函数还支持通过参数名称来指定参数,例如下面这个函数,一共有a,b,c三个参数,其中b和都设置了默认值,在调用函数的时候,可以不按照函数定义时参数的顺序,而是通过参数的名称,指定参数的取值。在C++中,我们调用函数时是不能写错参数的顺序的。
>>> def max(a,b=3,c="hell0"):
print a
print b
print c
>>> max(c="ttt",a="44")
44
3
ttt
Python的函数传参还有一个非常奇葩我觉得不可理解的功能,居然支持传入dictionary;看下面这个函数定义的例子,*c表示支持传入不定个数个参数,**d表示的是传入不定个数个key-value对。函数传入不定参,在C++也支持,通过...来标识,取参数的值时,是通过第一个参数的地址偏移来获取对象的取值的。Python的实现和JAVA比较类似,都是通过数组来实现不定长参数的,虽然JAVA中也是通过...来标识,但是本质上和C++有很大的区别。
>>> def f(a,*c,**d):
print a
for i in c:
print i
keys = sorted(d.keys())
for k in keys:
print k, ":", d[k]
>>> f(1,"fsfer",hit="rwerwe",get="werwe")
1
fsfer
get : werwe
hit : rwerwe
从整体上来说,python的函数比C++和JAVA函数的功能都更强大一些,虽然这些更为强大的功能未必有很大的用途。
本文出自 “星光” 博客,请务必保留此出处http://galaxyflower.blog.51cto.com/9006676/1530075
原文地址:http://galaxyflower.blog.51cto.com/9006676/1530075