定义函数
在python中定义函数的样子:
def function_name(..):
...
...
...
return ..
def abs(x):
if x>=0:
return x
else:
return -x
print(abs(-3))
函数以return
结束,如果不需要返回什么值,直接写return
就可以,也可以是return None
.
函数的返回值可以是多个值,例如return x,y
但是返回多个值的场合也是可以用一个值来代替的,因为当python返回多个值时,它其实返回的额是一个元组,只不过多个值时,它自动按照位置将元组的元素依次赋给要return的变量。而当用一个值代替时它返回的就是那个元组。
函数的参数
默认参数
当对应位置没有传入参数时,该位置的参数使用定义时定义好的默认参数
比如,计算最多三个数的和
def sum1(a=0,b=0,c=0):
return a+b+c
print(sum1(1,2,3))#6
print(sum1(1,2))#3
这样,如果定义时就给了形参一个值,那么它就是默认参数
那么,传递参数的顺序一定要相同吗?或者说,python一定是按参数的位置顺序给函数传值吗?
def sum2(a=0,b=0,c=0):
return a+b-2*c
print(sum2(c=2,b=1,a=1))#-2
如果按顺序那么:2+1-2=1;如果不是:1+1-4=-2。这就说明当明确给值时它按给的值算。
可变参数
当不知道参数的个数具体有多少时,使用*
加在形式参数前面
def sum3(*n):
totall=0
for i in n:
totall+=i
return totall
print(sum3(1,3,5,-1,-3,-5)#0
传入的1,3,5,-1,-3,-5几个值,返回的结果是0,*n是可迭代对象
作用域
想用foo改变a的值,注释掉的方法是不行的,因为在foo的a的作用域仅仅是foo这个函数
如果想访问全局变量a那么在前面加global
就好了。如果全局作用域中没有a
,那么下面一行的代码就会定义变量a
并将其置于全局作用域。同理,如果我们希望函数内部的函数能够修改嵌套作用域中的变量,可以使用nonlocal
关键字来指示变量来自于嵌套作用域。
def foo():
global a
a = 2
print(a) # 200
if __name__ == '__main__':
a = 1
foo()
print(a) # 2
'''
def foo():
a=2
print(a) # 200
if __name__ == '__main__':
a = 1
foo()
print(a) # 1
'''
因python中可以嵌套函数,那么一个函数访问变量的顺序:“局部作用域”->“嵌套作用域”->“全局作用域”->“内置作用域”。可以对比下面几种结果。
def find():
c=1
#fa()
b=a+c
def fa():
a=1
return
fa()
return b
a=0
print(find())#1
def find():
c=1
#fa()
def fa():
a=1
return
fa()
b=a+c
return b
a=0
print(find())#1
'''
def find():
c=1
#fa()
def fa():
a=1
return a
fa()
b=a+c
return b
#a=0
print(find())#name 'a' is not defined
'''