1.今日内容
-
形参角度:
- 万能参数
- *的魔法用法
- 仅限关键字参数
- 形参的最终顺序
-
名称空间
-
全局名称空间,局部,内置
-
加载顺序,取值顺序
-
作用域
-
-
函数的嵌套
-
内置函数 globals,locals
-
关键字:nonlocal,global
2.昨日回顾
-
函数是以功能为导向,减少重复代码,体改代码的可读性
def func(): 函数体
-
函数的调用:func()
func() func()
-
函数的返回值
- 终止函数
- return 单个值
- return多个值:返回一个元组(1,2,3)
-
函数的参数
- 实参角度:位置参数,关键字参数,混合参数(位置参数一定要在关键字参数前面)
- 形参角度:位置参数,默认参数(常用的参数设置)
3.具体内容
-
万能参数
-
*魔法用法
- 动态传参:*args
def func(*args): #从实参角度:定义一个函数时,*所有的位置参数聚合到一个元组中,赋值给了args print(f'你都看过什么书:{args}') func('为什么学生不喜欢上学','稀缺','穷爸爸,富爸爸','腾讯传') #你都看过什么书:('为什么学生不喜欢上学', '稀缺', '穷爸爸,富爸爸', '腾讯传')
- **kwagrs
#函数定义时:**将所有的关键字参数聚合到哟个字典中,将这个字典赋值给了kwargs def func(**kwargs): print(kwargs) func(name = '太白',age = 18,sex = '男') #{'name': '太白', 'age': 18, 'sex': '男'}
- *和**在函数的调用时,代表打散
def func(*args,**kwargs): print(args) print(kwargs) func(*[1,2,3],*[4,5,6])#(1, 2, 3, 4, 5, 6){} func((1,2,3,4,5,6)) func(**{'name':'alex','age':18,'sex':'男'}) func(name='alex',age=18,sex ='男') #() {'name': 'alex', 'age': 18, 'sex': '男'}
-
形参顺序
#*args 的位置 def func(位置参数,*args,关键字参数): 函数体 def func(a,b,*args,sex = '女'): print(a) #1 print(b) #2 print(args) #(3,4,5,5) print(sex) #男 func(1,2,3,4,5,5,sex = '男') #**kwargs 的位置 def func(位置参数,*args,关键字参数,**kwargs): 函数体 def func(a,b,*args,sex = '女',**kwargs): print(a) #1 print(b) #2 print(args) #(3,4,5,5) print(sex) #男 print(kwargs) #{'name':'alex','age':18} func(1,2,3,4,5,5,sex = '男',name = 'alex',age = 18) #形参角度第四种参数:仅限关键字参数 def func(位置参数,*args,关键字参数,c,**kwargs): 函数体 def func(a,b,*args,sex = '女',c,**kwargs): print(a) #1 print(b) #2 print(args) #(3,4,5,5) print(sex) #男 print(kwargs) #{'name':'alex','age':18} print(c) #关键字 func(1,2,3,4,5,5,sex = '男',c ='关键字',name = 'alex',age = 18) ''' 形参角度最终的顺序: 位置参数,*args,默认参数,仅限关键字参数,**kwargs '''
-
名称空间
- 全局名称空间
- py文件运行时开辟的,存放的是执行py文件(除去函数内部)的所有变量与值(地址)的对应关系,整个py文件结束后,才会消失
- 临时(局部)名称空间
- 函数执行时,在内存中临时开辟的一个空间,存放的函数中的变量与值的对应关系,随函数的结束而消失
- 内置名称空间
- python源码提供的一些内置函数
- 全局名称空间
-
取值顺序、加载顺序
-
加载顺序:内置名称空间-->全局名称空间-->局部名称空间
-
取值顺序:(就近原则)
-
-
作用域
- 全局作用域:全局名称空间,内置名称空间
- 局部作用域:局部名称空间
#局部作用域可以引用全局作用域的变量 date = '周五' def func(): a = 222 print(date) print(a)#报错 func()#周五 print(a)#报错 #局部作用域不能改变全局变量 count = 1 def func(): count += 2#报错 print(count)#报错 func() #关键字:global #1. 可以在局部作用域声明一个全局变量。 #2.对全局变量进行赋值 name = 'zhang' def func(): name = 'liu' def inner(): globar name name = 'ma' inner() print(name) func()#liu print(name)#ma #关键字:nonlocal #1.不能操作全局变量。 #2.可以对父级作用域的变量进行修改,并且在当前作用域创建(复制)一份此变量。 name = '张' def func(): name = '刘' def inner(): nonlocal name#找到上一级的name name ='码云' inner() print(name) func()#码云 print(name)#张
-
内置函数:globals,locals
a = 1 b = 2 def func(): name = 'jk' age = 99 print(globals())#返回字典:字典里面的键值对:全局作用域的所有内容 print(locals) #返回字典:字典里面的键值对:当前作用域的所有内容
4.今日总结
- 参数:万能参数*args,**kwargs
- 参数顺序,*的魔法用法:聚合,打散
- 名称空间,作用域,取值顺序,加载顺序
- 关键字:nonlocal,global
- 内置函数:globals,locals