先来看个例子,
if __name__ == '__main__':
def compare(a,b):
if a>b:
print("a>b")
elif a==b:
print("a==b")
else:
print("a
输出如下:
ab
a>b
a==b
其中 compare为自定义函数,它有两个传参,该方法用于比较输入数据的大小。
Python变量没有声明类型,因此函数的传参和返回值,也没有声明类型。
函数格式为,
def functionName(param1,param2,...):
action1
action2
...
注意,“:”不能丢。
Return语句,用于表示跳出函数,之后语句不再执行,或可用于返回结果。函数若无返回,返回默认值none。例如
c=add(1,2)
print("c=",c)
c=compare(0,0)
print("c=",c)
def func1(a,b):
print("a=",a)
return
print("b=",b)
func1(2,6)
相应输出为
c= 3
a==b
c= None
a= 2
Python函数的传参,到底是传值呢?还是传址呢?
例1,
x=1
print("x=",x)
def func2(m):
m=2
func2(x)
print("x=",x)
相应输出为
x= 1
x= 1
例2,
a=[1,2,3]
print("a=",a)
def func3(m):
m.append("123")
func3(a)
print("a=",a)
相应输出为
a= [1, 2, 3]
a= [1, 2, 3, '123']
可见,例1为传值,例2为传址。那什么时候传值,什么时候传址呢?
Python中的对象没有类型,因此,可以将对象看作一个指针对象,该指针对象指向的内容是什么类型,该对象就是什么类型。
Python中的某些类型,值一旦给定就无法修改。若要修改,只能重新创建新的对象。这些类型包括:数字,字符串和元组。除此之外,其它类型都可以在初始化后,对值进行修改。
其实,所有Python函数都可看作是传址。
例如例1,在调用func2时,x将对象地址,复制给m。因为2是数字,为不可变更对象,只能创建一个内容为2的整型对象,将该整型对象的地址赋值给m。func2结束,m的生命周期也结束,因此,x的值没有发生变化。
而例2则不同,在调用func3时,a同样将地址复制给m。由于为队列,是可变更对象,未创建新对象,因此在原有队列基础上append。func3结束时,虽然m的生命周期也结束了,但原地址对应的内容发生变化,所以a的值发生了变化。
再来看个例子,例3
def func4(m):
m=[4,9,0]
b=[12,4,6]
print("b=",b)
func4(b)
print("b=",b)
输出值为
b= [12, 4, 6]
b= [12, 4, 6]
b也是可变更对象,为什么在掉func4后,无任何变化?原因在于,func4中,又创建了一个可变更对象(列表),将其赋值给m,该地址并未返回,因此随m的消亡而消亡,所以b无任何变化。
那么,我们对例3进行修改,
def func4(m):
m=[4,9,0]
return m
b=[12,4,6]
print("b=",b)
b=func4(b)
print("b=",b)
输出值为
b2= [12, 4, 6]
b2= [4, 9, 0]
区别仅在于"return"
传参有多种类型:必须参数,关键字参数,默认参数,变长参数。
def func5(m):
m+=1
return m
例如func5中的参数,就是必须填写的,为必须参数。若,直接调用func5()将报错。
若对func5中的m,添加默认值,即
def func5(m=0):
print("m=",m)
func5()
func5(10)
则直接调用func5()时,将使用默认值进行输入,不会报错。此情况为默认参数。
若在func5中,添加参数x,y,即
def func5(x,y,m=0):
print("m=",m)
print("x=",x)
print("y=",y)
func5(x=1,m=6,y=2)
func5(y=4,x=3)
相应输出为
m= 6
x= 1
y= 2
m= 0
x= 3
y= 4
可以使用关键字,来标示输入数据所对应的参数,不必拘泥于参数的顺序。
这里需要指出的是,默认参数之后,只能是默认参数,不能再次出现非默认参数。错误的定义方式如下,
def func5(m=0,x,y):
print("m=",m)
print("x=",x)
print("y=",y)
这一点与vb.net一致。
Python同样支持变长参数,例如,
def func6(a, *list):
print("a=",a)
for b in list:
print(b)
func6(1,2,3,4,5)
func6(10,11)
相应输出为
a= 1
2
3
4
5
a= 10
11
在Python中,func内定义变量a,与func外定义的变量a并不冲突,前者作用域为func内,后者则是func外部。
对于变量的查找顺序,Python会遵循,局部(闭包内)->闭包外->全局->内置,的查找顺序。