Python第十天
1形参角度
万能参数
*的魔性用法
仅限关键字参数
形参的最终顺序
2名称空间
全局名称空间 局部
加载顺序 取值顺序
作用域
3函数的嵌套
4内置函数 globals locals
5关键字 nonlocal global
1 形参角度
万能参数
1动态就收的位置参数:*args 约定俗称
函数定义时 *代表聚合 他将所有的位置参数聚合成一个元组,
赋值给了args
急需要一种形参 可以接受所有的实参
def eat(*args):
print('woqingnichi:%s,%s,%s,%s,%s,%s' % (args))
eat('zhengyaogao','zheng','c','d','g','r')
#函数计算输入数字的和的功能
def sum1(*args):
sum=0
for i in args:
sum=sum+i
return sum
print(sum1(1,2,3,4,5,6))
2动态接受的关键字参数 **kwargs
函数的定义时 **将所有的关键字参数聚合到一个字典中,将这个字典赋值给了kwargs
def func(**kwargs):
print(kwargs)
func(name='sb',age=14,sex='ladyboy')#{'name': 'sb', 'age': 14, 'sex': 'ladyboy'}
形参角度的参数顺序
# def func(*args,a,b,sex='nan'):
# print(a,b)
# func(1,2,3,4)
# def func(a,b,*args,sex='nan'):
# print(a,b)
# print(args)
# print(sex)
# func(1,2,3,4)
# 1 2
# (3, 4)
# nan
# def func(a,b,sex='nan',*args):
# print(a,b)
#
# print(sex)
# print(args)
# func(1,2,3,4)
# #1 2
# 3
# (4,)
这三个中*args参数在位置参数后 关键字参数前 否则结果错误或报错
**kwargs必须放在最后
def func(a,b,*args,sex='nan',**kwargs):
print(a,b)
print(args)
print(sex)
print(kwargs)
func(1,2,3,4,name='sb',age=20)
##1 2
(3, 4)
nan
{'name': 'sb', 'age': 20}
形参角度的第四个参数:仅限关键字参数
def func(a,b,*args,sex='nan',c,**kwargs):
print(a,b)
print(args)
print(sex)
print(c)
print(kwargs)
func(1,2,3,4,name='sb',age=20,c='666')
形参角度最终的顺序:位置参数 *args 默认参数 仅限关键字参数 **kwargs
*的魔性用法
*在函数调用时 *代表打散
def func(*args):
print(args)
func([1,2,3],[22,33])
func(*[1,2,3],*[22,33])(1, 2, 3, 22, 33)*代表把列表打散传入动态接受的位置参数中是 形成元组
*放在可迭代对象前面
比较下面这两个函数 结果不同 注意调用时是一个* 还是两个**
def func(*args,**kwargs):
print(args)
print(kwargs)
# func([1,2,3],[22,33])
# func(*[1,2,3],*[22,33])
func({'name':'taibai'},{'age':18})
#执行结果 实参全部传给了*args 并聚合成元组 **kwargs没有实参传入,形成空字典
({'name': 'taibai'}, {'age': 18})
{}
def func(*args,**kwargs):
print(args)
print(kwargs)
# func([1,2,3],[22,33])
# func(*[1,2,3],*[22,33])
func(**{'name':'taibai'},**{'age':18})==func(name='taibai',age='18')
#执行结果 实参全部传给了**kwargs 并聚合成字典 *args 没有实参传入,形成空元组
()
{'name': 'taibai', 'age': 18}
*总结:
在函数定义时 *代表聚合 *args把传入的实参聚合成一个元组 **kwargs把传入的实参聚合成一个字典
在函数调用式 * **代表打散 *args 代表把传入的可迭代对象打散 最后形成一个元组
**kwargs代表把传入的实参打散 最后形成一个字典
2 名称空间 :命名空间

内置名称空间:Python源码给你提供的一些内置的函数,如print input
python 分为三个空间
内置名称空间(bulitins.py)
全局名称空间(当前的py文件)
局部名称空间(函数 函数执行时才开辟)
名称空间的加载顺序:内置名称空间 全局名称空间 局部名称空间(函数执行时才开辟)
取值顺序(就近原则LEGB):单向不可逆
(从局部开始寻找变量)局部名称空间 局部没有再从全局名称空间 全局没有再从内置名称空间
作用域:作用的范围 分为全局作用域 局部作用域
全局作用域:内置名称空间 全局名称空间
局部作用域:局部名称空间
局部作用域可以引用全局作用域的变量 但不能改变全局变量 当Python解释器读取到局部作用域时,发现了你对一个变量进行修改,解释器会认为你在局部已经定义过这个变量了,他就从局部找这个局部变量,就报错了
date='zhouwu'
def func():
print(date)
func() 局部作用域引用全局作用域变量
count=1
def func():
count+=2
print(count)
func() 局部作用域不能改变全局作用域变量 会报错
在函数的嵌套中 内层函数可以引用外层函数的变量 但不能改变外层函数的变量
def func():
count=1
def inner():
print(count)
inner()
func()引用可以
def func():
count=1
def inner():
count+=1
print(count)
inner()
func()改变报错
LEGB: 从内到外顺序 local:l eclose:e global:g bulitin:b
3 函数的嵌套(高阶函数)
# def func1():
# print('in func1')
# print(3)
# def func2():
# print('in func2')
# print(4)
# func1()
# print(1)
# func2()
# print(2)
# def func1():
# print('in func1')
# print(3)
# def func2():
# print('in func2')
# print(4)
# print(1)
# func2()
# print(2)
def func2():
print(2)
def func3():
print(6)
print(4)
func3()
print(8)
print(3)
func2()
print(5)
4内置函数 globals locals
a=1
b=2
def func():
name='sb'
age=73
print(globals())#返回的是字典 字典里面的键值对 :全局作用域的所有内容
print(locals())#返回的是字典 字典里面的键值对:当前作用域的所有内容

浙公网安备 33010602011771号