Python 函数并与 PHP 对比
1、定义一个函数
【Python】以 def 开头,函数名后以冒号结尾,无 return 的函数返回 None。
def printme( str ): "打印任何传入的字符串" print str; return;
【PHP】以 function 开头,函数体以花括号括起来,无 return 的函数返回 NULL。
2、参数传递
【Python】参数分为:不可变类型(strings, tuples, 和 numbers 是不可更改的对象)和可变类型(strings, tuples, 和 numbers 是不可更改的对象)
不可变类型:类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。
可变类型:类似 c++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响
例如:
l = [1,2,3,4,5] print('修改之前:',l) def changeList(list): '修改可变对象,list' list.append('a') list.append('b') changeList(l) print('修改之后:',l)
【PHP】参数传递除了对象,其他类型的都是复制传递。还可引用传递(变量地址指针)方式才能到达 python 传递可变对象的效果。
3、参数
【Python】支持根据参数名识别,无需按照顺序传入参数,在传参的时候需要带上变量名。
def printinfo( name, age ): "打印任何传入的字符串" print "Name: ", name; print "Age ", age; return; #调用printinfo函数 printinfo( age=50, name="miki" );
【PHP】只能按照顺序传入参数。
3、不定长参数(冗余参数)
【Python】使用加了星号(*)的变量名会存放所有未命名的变量参数。不定长参数实例如下:
def showName(name, *args): '显示名字和其他信息' text = name for var in args: text += ','+var print(text) showName('peter', 'is', 'man') //peter,is,man
【PHP】不定长参数使用 (...)
<?php function test(...$args){ var_export($args); } test(1,2,3,[41,42]);
输出:
php func.php array ( 0 => 1, 1 => 2, 2 => 3, 3 => array ( 0 => 41, 1 => 42, ), )
也可以不设置 ...$args,直接在函数体内通过以下方法读取多个参数。
<?php function test(){ var_export(func_get_args()); } test(1,2,3,[41,42]);
func_num_args() 可获得传入参数的数量
func_get_arg(n) 可获得第N个传入的参数值
func_get_args() 以数组形式,获得所有传入的参数
4、匿名函数
【Python】python 使用 lambda 来创建匿名函数。
lambda只是一个表达式,函数体比def简单很多。
lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
语法
lambda函数的语法只包含一个语句,如下:
lambda [arg1 [,arg2,.....argn]]:expression
【PHP】可把匿名函数赋值在一个变量;还能使用 call_user_func() 直接调用;或者当做参数传入到方法;
<?php $fun = function(){ echo 'xxx;',"\n"; }; $fun(); call_user_func(function(){ echo 'bbb;', "\n"; });
5、取元祖的值当做参数传入函数,使用 *元祖
不是把元祖当做一个参数传入,而是把元祖里面的值当做参数传入到函数。参数数量必须一致。
t = ('a', 'b') def fun(x, y): print "%s , %s" % (x, y) fun(*t)
6、取字典的值当做参数传入函数,使用 **字典
参数名对应的字段名必须一致。
zd = {'x':'a', 'y':'b'} def fun(x, y): print "%s , %s" % (x,y) fun(**zd)
总结:字典、元祖方式传入函数也是支持函数冗余参数的原理。
def fun(x, *tup, **dic): print 'x:', x print 'tup', tup print 'dic', dic fun(1, 2, 3, 4, 5, 6, 7, a=10, b=20, c=30) ---------------------------------------- D:\web\python\test>python def5.py x: 1 tup (2, 3, 4, 5, 6, 7) dic {'a': 10, 'c': 30, 'b': 20}
第一参数会给 x
后面无指定参数名的参数都给了元祖 tup
后面有参数名的参数都给了 字典 dic