函数的动态参数
1,*args 位置参数动态传参
在参数位置编写*表示接收任意内容 接收到的是元组tuple
def chi (*food): print("我要吃",food) chi("大米饭","烤肉","鸡腿","牛排") 结果: 我要吃('大米饭','烤肉','鸡腿','牛排') #多个参数传递进去,接收的是元组
动态参数必须在位置参数后面,否则会报错
def chi (*food,a,b): print("我要吃",food,a,b) chi("大米饭","红烧肉","黄瓜","茄子") #这个时候程序会报错,前面传递进去的所有参数都会被*food接收,a和b永远接收不到参数 所以必须改写成下面的代码: def chi (a,b,*food): print("我要吃",a,b,food) chi("黄瓜","茄子","大米饭","红烧肉") #前面两个用位置参数接收,后面的参数用动态参数接收
2,**kwargs 关键字参数动态传参 接收到的是一个字典dict
如果想接受所有的参数:
def func(*args,**kwargs): print(args,kwargs) func("香烟","瓜子","矿泉水",a="香肠",b="啤酒") #可以接收所有参数,
♦ 参数顺序: 位置参数=>*args(动态参数)=>默认值=>**kwargs(关键字动态参数)
动态参数的另一种传参方式:
def funs(*args): print(args) lst = [1,4,7] fun(lst[0],lst[1],lst[2]) fun(*lst) #可以使用*把一个列表按顺序打散 s = "臣妾做不到啊" fun(*s) #字符串也可以打散, (可迭代对象) #在实参的位置上给一个序列,列表,可迭代对象前面加*,表示把这个按顺序打散 #在形参的位置上*,表示把接收到的参数组合成一个元组 #字典也可以打散,需要用两个** (例如: **kwargs)
函数的注释:
def chi(food,drink): """ 这里是函数的注释,先写一下当前这个函数是干什么的 :param food: 参数food 是什么意思 :param drink: 参数drink是什么意思 :return: 返回是什么东西 """ print(food,drink) return"very good"
二:命名空间
1:内置名称空间
2:全局名称空间
3:局部名称空间
作用域:作用域就是作用范围,按照生效范围来看分为全局作用域,和局部作用域
全局作用域:包含全局命名空间和内置命名空间.在整个文件的任何位置都可以使用
局部作用域:在函数内部可以使用
作用域命名空间:
1:全局作用域: 全局命名空间+内置命名空间
2:局部作用域: 局部命名空间
globals:查看全局作用域内容
locals:查看局部作用域中的变量和函数信息
a = 10 def func(): a = 40 b = 20 def abc(): print("哈哈") print(a,b) #这里使用的是局部作用域 print(globals) #打印全局作用域的内容 print(locals) #打印局部作用域的内容 func()
三;函数的嵌套
1:只要遇见了()就是函数的调用,没有()就不是函数的调用
2;函数的执行顺序
def outer(): print("哈哈") def inner_1(): print("呵呵") def inner_1_1(): print("嘻嘻") inner_1_1() print("吼吼") def inner_2(): print("嘿嘿") inner_2() inner_1() outer() #输出结果:哈哈=>嘿嘿=>呵呵=>嘻嘻=>吼吼
四;关键字global和nonlocal
global表示:不在使用局部作用域中的内容了,而改用全局作用域中的变量
nonlocal表示:在局部作用中,调用父级命名空间中的变量(外层函数中离它最近的变量)