函数高级
1.全局变量与局部变量
局部变量就是在函数内部定义的变量,其作用范围是这个函数内部,即只能在这个函数中使用,
所以不同的函数内可以有相同的局部变量名。局部变量的作用是为了临时保存数据需要在函数中定
义变量来储存。当函数调用时,局部变量被创建,当函数调用完成后这个变量就不能够使用了。
全局变量就是在函数外定义的,它在整个py文件里都可以被访问。
如果局部变量和全局变量同名,会在函数内部又定义一个新的局部变量,而不是修改全局变量。
a=100
def text():
a=10
print('函数内部a=',a)
text()
print('函数外部a=',a)
那么有没有什么方法在函数内部修改全局变量呢?
当然有!我们可以使用global。
a=100
def text():
global a
a=10
print('函数内部a=',a)
text()
print('函数外部a=',a)
使用内置函数globals()和locals()可以查看全局变量和局部变量。
a=100
def text():
a=10
print('函数内部a=',a)
print('locals={},globals={}'.format(locals(),globals()))
text()
print('函数外部a=',a)
在python里,只有函数能够分割作用域。
2.多个返回值
一般情况下,一个函数最多只会执行一个return语句
特殊情况下(finally语句下),一个函数会执行多个return语句。
若想返回多个返回值,可以使用列表,字典等。
def text(a,b):
y=a*b
x=a+b
return [x,y]
result=text(4,5)
print('乘积是{},相加是{}'.format(result[0],result[1]))
3.函数的缺省参数
有些函数的参数是,如果你传递了参数,就使用传递的参数,反之则使用默认的参数。
例如:print函数里的end,sep等就是缺省参数,应该在末尾。
4.可变参数的使用
def add_many(iter):
x=0
for n in iter:
x+=n
return x
nums=[1,3,5,7,9,11,13]
print(add_many(nums))
*args表示可变位置参数
def add(a, b, *args):
print('a={},b={}'.format(a, b))
print('args={}'.format(args))
add(1, 2, 3, 4, 5, 6)
剩下的多的参数会以元组的形式保存在args(可变参数)中,也可以没有多余的参数。
**kwargs表示可变关键字参数,会以字典的形式保存起来。
def add(a, b, *args,**kwargs):
print('a={},b={}'.format(a, b))
print('args={}'.format(args))
print('kwargs={}'.format(kwargs))
add(1, 2, 3, 4, 5, 6,s=2,f=3,g=6)
5.可变类型和不可变类型的传参
def text(a):
a=100
def demo(nums):
nums[0]=10
x=1
text(x)
print(x)
y=[3,5,6,8,2]
demo(y)
print(y)
上述例子x没变,而y值变了,其原因是y列表是可变类型,它的内存地址可以改变。而整数x是int类型内存地址不可变。