Python 函数并与 PHP 对比

阅读数: 812 2018年10月09日

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

参考资料
http://www.runoob.com/python/python-functions.html
http://www.icoolxue.com/play/1934
phpriji.cn | 网站地图 | 沪ICP备17015433号-1