1. 函数定义
python中也可以定义函数,一方面功能可以重用,另一方面也便于阅读,python中的函数定义方法为:
def function_name (arguments):
function_body
python中的函数可以有返回值,也可以没有返回值,调用的时候给出函数名和实参即可。
如果定义时,参数形式为def function_name(arg1=1, arg2=2)这种,则表示函数有默认参数值,如果调用时不提供参数,则函数执行时采用默认参数值。要注意的是,如果混合默认参数和非默认参数,则非默认参数一定要在默认参数前声明,如def function_name(arg1=1,arg2)是错误的。
2. 参数
参数有位置参数(positional argument)和关键字参数(keyword argument)两种形式:位置参数是根据函数定义时的参数顺序来传递参数;关键字参数是在传递参数时写明每一个参数的关键字,并不一定按照函数定义时的顺序。举个例子:
def func(a1,a2,a3):
return a1 + a2 - a3
r1 = func(1,2,3) # positional arg
r2 = func(a2=2,a3=3,a1=1) # keyword arg
r3 = func(1,a3=3,a2=2) # mixed arg
r4 = func(a1=1,3,2) # wrong, SyntaxError:non-keyword arg after keyword arg
其中r1的调用是根据参数的默认位置来传递实参;r2的调用是根据关键字来传递实参;r3的调用是混合了位置参数和关键字参数,这种调用方式的原则是位置参数不能出现在关键字参数后面,比如r4的调用就会返回符号错误:non-keyword arg after keyword arg。
3. 参数的值传递
在python中,当调用一个函数,并传递一些参数时,每个参数的引用是通过值传递,而不是变量的传递。因为在python中,所有的数据都是以对象形式存在,一个变量实际上是对象的引用。举个例子:
x = 2
y = x
print (id(x)) # 168763556
print (id(y)) # 168763556
y = x + 1
print (id(y)) # 168763544
可以看出,在y加1前,y和x的id都是168763556(与运行环境有关),而执行y=x+1后,y的id改变了。说明不管是变量x还是变量y,它都指向一个对象,这个对象就是2,一旦创建了一个变量v并赋值a,python就会为这个值a创建一个对象o,并将o的引用分配给变量v;执行y=x+1后,y=3,python就为3创建了一个对象,并将3的引用分配给y。(值得注意的是,python中的数字和字符串都是不可改变对象,一旦创建不能修改其值)。
有了这个认识,再看另一个小例子:
def f():
x = 1
print (x) #1
increment(x)
print (x) #1
def increment(n):
n = n + 1
print (n) #2
print的结果如右边注释所示,可以看出,调用increment(x)后,x的值并为改变,因为传进的参数是值1,并不是变量x。4. 变量的作用域
python中也存在局部变量和全局变量的概念,局部变量只在函数体内作用,全局变量则在全局范围内作用。如:
x = 1
def increase1():
x = 2
print (x) # 2
increase1()
print (x) # 1
但是,可以在函数体内用global关键字,来将函数体内的局部变量绑定为全局变量,如:
x = 1
def increase2():
global x
x = x + 1
print (x) # 2
increase2()
print (x) # 2
这样一来,函数内部的x也变成了全局变量,所以修改它也会在全局变量x中反映出来;不过,这种方式并不提倡使用,因为可能会使得代码不易阅读和维护。