1、函数的参数传递
是引用传递,如果传入的是可变对象(列表,字典,集合等),则对其进行修改(注意,不是赋值,而是修改),则在主函数中该对象被修改;
传入的形参,是一个局部变量,只是一开始引用了实参,如果绑定关系被改变,那么不会修改原对象的值
参数传递有四种方法:
直接传参
示意序列传参
关键字传参
字典关键字传参
2、函数的示意序列传参
可以用list的地址作为参数传入
比如
def mysum(l1,l2):
return l1+l2
List = {1,2}
mysum(*List)
3、关键字传参
关键字传参是指传参时,利用形参的名称给参数赋值
比如
def mysum(l1,l2):
return l1+l2
mysum(l2 = 1,l1 = 3)
#这种传参方式对参数的顺序并没有要求,但是关键字名称和形参的名称必须是一致的
4、字典关键字传参
def mysum(l1,l2):
return l1+l2
d1 = {"l1":33,"l2",44}
mysum(**d1)
说明:
字典的关键字必须和形参一致
必须前面加两个星
5、综合传参
函数的传参方式在能确定形参能够唯一匹配到实参的情况下,可以任意组合
def mysum(l1,l2):
return l1+l2
mysum(1,*{23})
#没多大意义
有一种错误传参:mysum(l1 = 1,2)
6、函数的缺省参数
语法:def 函数名(形参名1 = 默认实参,参数名2 = 默认实参2,参数名3 = 默认实参3 ...)
比如:
def myfunc(a, b=1,c=3):
print(a,b,c)
myfunc(a)
在这种情况下,必须传入参数a,但是可以不传入实参b,c
如果不是关键字传参,那么传入参数顺序应该遵循原有顺序
混合传参时(有关键字传参存在时),缺省值的参数的传入,必须放在非缺省值的前面
7、练习题:模仿range()函数,传入一个、两个、三个参数值时分别返回列表对象
代码:
def myrange(end,start=None,step=1):
if step == 0:
return None
l = list()
if start is not None:
start,end = end,start
else:
start = 0
tmp = start
if step > 0:
while(tmp < end):
l.append(tmp)
tmp += step
return l
else:
while(tmp > end):
l.append(tmp)
tmp += step
return l
for i in myrange(10):
print(i,end=' ')
print()
for i in myrange(4,10):
print(i,end=' ')
print()
for i in myrange(10,4,-1):
print(i,end=' ')
print()
8、函数字符串
每个函数都可以有一个字符串用于说明函数功能,这个字符串放在函数的开头,当输入help(函数名)查询时,会显示这个字符串,该字符串可以包含回车,直接用def myrange(end,start=None,step=1):
if step == 0:
return None
l = list()
if start is not None:
start,end = end,start
else:
start = 0
tmp = start
if step > 0:
while(tmp < end):
l.append(tmp)
tmp += step
return l
else:
while(tmp > end):
l.append(tmp)
tmp += step
return l
for i in myrange(10):
print(i,end=' ')
print()
for i in myrange(4,10):
print(i,end=' ')
print()
for i in myrange(10,4,-1):
print(i,end=' ')
print()
8、函数的文档字符串
放在函数的开始,说明函数使用方法及功能,通常用""" """括起,可以包含回车符
9、函数的属性
__name属def myrange(end,start=None,step=1):
if step == 0:
return None
l = list()
if start is not None:
start,end = end,start
else:
start = 0
tmp = start
if step > 0:
while(tmp < end):
l.append(tmp)
tmp += step
return l
else:
while(tmp > end):
l.append(tmp)
tmp += step
return l
for i in myrange(10):
print(i,end=' ')
print()
for i in myrange(4,10):
pr int(i,end=' ')
print()
for i in myrange(10,4,-1):
print(i,end=' ')
print()
8、函数的文档字符串
用于说明函数使用方法及功能,一般放在函数开头,用""""""括起,可直接包含回车,当输入help函数查询时显示这些信息
9、函数的属性
__name__属性:同于记录函数名
说明:以双下划线__开头,以下划线结尾的标识符通常代表python的特殊变量(属性)
示例:
def abc():
pass
fn = abc
print("fn绑定的函数名是",fn.__name__)
print("abc绑定的函数名是",abc.__name__)
__doc__属性即函数的文档字符串
10、函数变量
函数在创建时会生成一个以函数名为名称的变量,绑定这个函数,可以通过该变量来调用函数
11、一个函数可以作为另外一个函数的参数进行传递、也可以作为另一个函数的返回值来返回
12、全局变量与局部变量
局部变量:在函数内部创建的变量成为局部变量,只能在函数内部使用,在函数调用时自动创建,在函数结束时自动销毁
全局变量:定义在函数外部,模块内部的变量称为全局变量,所有函数都可以访问,但是不能直接赋值,如果直接赋值,会创建新的局部变量
13、python作用域
也叫命名空间,是访问变量时查找变量的范围空间
python的四个作用域LEGB
局部作用域(函数内,Local Function,L)
外部函数嵌套作用域(Enclosing function,E)
全局作用域(即函数所定义模块的作用域,Global,G)
Python内置模块的作用域(Builtin,B)
14、在函数内赋值全局已经存在的变量时,会创建新的变量
15、global语句
告诉解释器,将变量映射到全局作用域global
语法:global var1,var2
或者直接赋值
global var1 = 100
说明:全局变量如果在函数内部被赋值,则必须经过global关键字声明,否则创建新的局部变量
全局变量在函数内部不经过声明就可以直接访问
不能先声明局部变量,再用global声明为全局,否则出错
形参列表里的变量是一定存在的局部变量,所以也不能再次用global声明,否则出错
16、nonlocal语句
告诉解释器,nonlocal生命的变量不是局部变量也不是全局变量,而是外部嵌套函数内的变量
说明:
只能在被嵌套的函数内部使用;当有两层或以上嵌套时,只访问最近的那一层;nonlocal声明的变量不能出现在此函数的参数列表里