可变长参数
*形参名
def f1(*args):
#将多余的位置实参转化为元组形式接收
**形参名
def f1(**kwargs):
#将多于的关键字实参转化为字典形式接收
以下仅作了解
*实参
*
将容器类元素打散成位置实参依次传值给位置形参
如果是字典类型则只将关键字打散并传值
**实参
**
只能将字典打散成关键字实参然后按对应形参名传值,字典中的key值必须与形参名一致
*args,**kwargs接收所有参数
默认形参必须在位置形参后面
t = ['a','b','c','d']
s = {'a','b','c','d'}
y = 'abcd'
r = ('a','b','c','d')
dic = {'a': 1, 'b': 2,'c':3,'d':4}
def f(*args,**kwargs):
print(args,kwargs)
f(*y,**dic)
函数对象
python中一切皆对象
函数对象
函数对象 == 函数名 #函数名()就是在调用,没有其他意思
def f():
print('from f')
1.引用
f1 = f
print('f:',f)
print('f1':f1)
f1()
2.当做容器类元素
lt = [1,2,f1,4]
print(lt[2])
lt[2]()
3.当做函数参数
def f2(x):
print('当做函数f2的参数')
# f2(f)
print(f2(f))
def f3(x):
print('当做函数f3的参数')
# f3(f())
print(f3(f()))
4.当做函数返回值
def f2():
print('当做函数f2的返回值')
return f
f2()
print(f2())
def f3():
print('当做函数f3的返回值')
return f()
f3()
print(f3())
函数嵌套
引入:循环嵌套,打印九九乘法表
for i in range(1,10):
for j in range(1,i+1):
print(f'{j}×{i}={j*i}',end=' ')
print()
函数嵌套:函数里面有函数
定义函数,只检测语法,不执行代码
def f1():
print('来自函数f1')
def f2:
print('来自函数f2')
res = f1()
print(res)
f2() #报错
#函数内部定义的函数,外部不能使用
名称空间和作用域
变量名/函数名-->名称-->名称空间:专门存储名称
内置名称空间
作用:存放python解释器自带的名字,如int/float/len
等
生命周期:在python解释器启动时生效,在python解释器关闭时失效
全局名称空间
作用:除了内部和局部的名字之外,其余都存放在全局名称空间
生命周期:在文件执行是生效,在文件执行结束后失效
局部名称空间
作用:存放函数调用期间函数体产生的名字
生命周期:文件执行时函数调用期间生效,在函数执行结束后失效
名称空间的执行(生成)顺序
1.内置名称空间:python解释器启动的时候就有内置名称空间
2.全局名称空间:执行文件代码的时候才会有全局名称空间
3.局部名称空间:函数调用的时候才会有局部名称空间
名称空间的搜索顺序
先从当前所在位置寻找,找不到再按照局部-->全局-->内置的顺序寻找,并且不会逆方向寻找,找不到就报错
x = 10
def f():
x = 10
print(x)
print(x)
f()
名称空间的作用域
全局作用域中的x与局部作用于中的x无任何关系
全局作用域
全局有效,全局存活,包含内置名称空间和全局名称空间
局部作用域
局部有效,临时存储,只作用于局部名称空间
局部作用域2中的x和局部作用于3中的x也没有任何关系,即使它们都属于局部作用域1下
def f1():
def f2():
x=2
def f3():
x=1
print(x)
f3()
f2()
f1()
注意点
作用域关系在函数定义阶段就固定死了,与函数调用无关
x = 10
def f1():
x = 20
print(x)
def f2():
x = 30
f1()
print('f2打印的x:',x)
f2()
关键字修改作用域
global关键字
global先声明一个局部变量,在global声明以下的语句中所有的该局部变量全局变量
x = 10
def f():
global x
x = 20
print(x)
f()
print(x)
nonlocal关键字
nonlocal先声明一个局部变量,在nonlocal声明以下的语句中所有的该局部变量成为上层函数的局部变量,而不是成为全局变量
x = 40
def f1():
x=30
def f2():
x=20
def f3():
nonlocal x
x=10
print('f3函数打印的x:',x)
print('f3调用前f2函数打印的x:',x)
f3()
print('f3调用后f2函数打印的x:', x)
print('f2调用前f1函数打印的x:',x)
f2()
print('f2调用后f1函数打印的x:', x)
f1()
print('不是函数打印的x:',x)
注意点
1.在局部想要修改全局的可变类型数据,不需要关键字声明,可以直接修改
2.在局部想要修改全局的不可变类型数据,需要用global关键字声明为全局变量再修改
lt = [1,2,3,4]
def f1():
lt[3] = 371308
f1()
print(lt)
x = 10
def f2():
global x
x = 371308
f2()
print(x)
补充题目
def f1(i, lt=[]):
lt.append(i)
print(lt)
for i in range(10):
f1(i)
def f1(i, lt):
lt.append(i)
print(lt)
for i in range(10):
f1(i, [])