按照以上五个基本规则,我们定义的函数例子为:
def printme( str ):
"打印传入的字符串到标准显示设备上"
print str
return
实际上,3的注释可以省略,不需要函数的返回值时return可以省略。
也就是
def printme( str ):
print str
python是严格的代码缩进语言。
2.1 必备参数
简单理解为,调用函数时的参数个数在无特殊情况下一定要和函数定义的参数个数对应起来,不然会报错。当然,所以函数参数并没有指定类型,但是调用者应该知道传入相同的类型参数。
2.2 关键字参数
关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
#可写函数说明
def printinfo( name, age ):
"打印任何传入的字符串"
print "Name: ", name;
print "Age ", age;
return;
#调用printinfo函数
printinfo( age=50, name="miki" );
可以看到,指定参数的名称,即使顺序不一致也是可以的,这和java有很大的区别。
2.3 缺省参数
调用函数时,缺省参数的值如果没有传入,则被认为是默认值。下例会打印默认的age,如果age没有被传入。
#可写函数说明
def printinfo( name, age = 35 ):
"打印任何传入的字符串"
print "Name: ", name;
print "Age ", age;
return;
#调用printinfo函数
printinfo( age=50, name="miki" );
printinfo( name="miki" );
默认值在实际开发中还是非常有用的。个人理解,方便了Java的参数重载。
2.4 不定长参数
你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述几参数不同,声明时不会命名。基本语法如下:
def functionname([formal_args,] *var_args_tuple ):
"函数_文档字符串"
function_suite
return [expression]
# 可写函数说明
def printinfo( arg1, *vartuple ):
"打印任何传入的参数"
print "输出: "
print arg1
for var in vartuple:
print var
return;
# 调用printinfo 函数
printinfo( 10 );
printinfo( 70, 60, 50 );
不定长参数也是方便重载,类似java中的三个点。
2.5 匿名函数
python 使用 lambda 来创建匿名函数。
语法为:
lambda [arg1 [,arg2,.....argn]]:expression
# 可写函数说明
sum = lambda arg1, arg2: arg1 + arg2;
# 调用sum函数
sum( 10, 20 )
sum( 20, 20 )
感觉比java中的lambda要好理解很多。
3.1 全局变量和局部变量
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。(比较好理解,java类似)
3.2 可更改(mutable)与不可更改(immutable)对象
在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。
什么意思呢,就是调用函数传入参数的时候,该函数是否会对传入的参数内存中的数据产生影响。
比如,不可变变量
def ChangeInt( a ):
a = 10
b = 2
ChangeInt(b)
print b # 结果是 2
可以发现,b的值并没有变化成10,没有影响
可变
# 可写函数说明
def changeme( mylist ):
"修改传入的列表"
mylist.append([1,2,3,4]);
print "函数内取值: ", mylist
return
# 调用changeme函数
mylist = [10,20,30];
changeme( mylist );
print "函数外取值: ", mylist
函数内取值: [10, 20, 30, [1, 2, 3, 4]]
函数外取值: [10, 20, 30, [1, 2, 3, 4]]
实际上,这里我们需要理解python的变量在内存中存储的原理。对于不可变变量,变量名直接指向实际值,对于可变变量,变量名指向的是指的内存地址,类似于java等许多语言。多注意点就可以了。