一.函数参数->动态传参(形参的第三种)
动态参数分为两种:
1)动态接收位置参数
普通的位置传参:
def func(quality_food,junk_food): print('我要吃',quality_food,junk_food) func('大米饭','小米饭') #大米饭传给quality_food 小米饭传给junk_food,按照位置有顺序的传
动态传参:*args 在参数位置编写*表示接收任意内容
def func(*food): print('我要吃',food) func('大米饭','小米饭') 结果:我要吃('大米饭','小米饭') 多个参数传进去,收到的内容是元祖tuple
注意:动态接收参数的时候,动态参数必须在位置参数后面
def func(a,b,*food) print('我要吃',a,b,food) func('大米饭','小米饭','馒头','面条')#前面的参数是用位置参数来接收,后面的参数使用动
态参数来接收
默认值参数:默认值参数写在动态参数的后面(在没有动态关键字传参的情况下)
顺序:位置参数-->动态参数(*)-->默认值参数
2)动态接收关键字参数 **kwargs
*args只能接收动态的位置参数,不能接收关键字参数.
**kwargs能接收动态的关键字参数但不能接收位置参数
def func(**kwargs): print(kwargs) func(a=1,b=2,c=3) func(a=1,b=2) 结果: {'a': 1, 'b': 2, 'c': 3} #接收的是一个dict {'a': 1, 'b': 2}
最终顺序:
位置参数--->*args--->默认值参数--->**kwargs
接收所有的参数的写法:
def func(*args,**kwargs): #*表示聚合,所有的位置参数, 聚合成元组 **聚合成字典
print(args,kwargs)
func('a','b',c = '10',d=10)
动态传参的另一种传参方式:
def func(*args): # print(args) lst = [1,2,3] fun(lst[0],lst[1],lst[2]) #也可以写成: fun(*lst) #可以使用*把一个列表按顺序打散 s = '你好么' fun(*s)#字符串也可以打散(可迭代对象)
同理:**kwargs **在实参位置时,如果是字典tuple也可以打散,直返放在形参聚合
函数的注释:
def chi(food, drink): """ 这里是函数的注释, 先写一下当前这个函数是干什么的, 比如我这个函数就是一个吃 :param food: 参数food是什么意思 :param drink: 参数drink是什么意思 :return: 返回的是什么东东 """ print(food, drink) return "very good"
二.命名空间:
1.内置命名空间-->存放在python解释器为我们提供的名字,list,tuple,str,int这些内置命名空间
2.全局命名空间-->直接在py文件中,函数外声明的变量都属于全局命名空间
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.函数的执行顺序 一层一层的看
五.关键字global和nonlocal
global:把全局的量拿到局部来用
a = 100 def func(): global a # 加了个global表示不再局部创建这个变量了. 而是直接使用全局的a a = 28 print(a) func() print(a)
lst = ["麻花藤", "刘嘉玲", "詹姆斯"] def func(): lst.append("马云云") # 对于可变数据类型可以直接进行访问. 但是不能改地址. 说白了. 不能赋值 print(lst) func() print(lst)
nonlocal:把离他最近的一层拿过来用,不会找全局
a = 10 def func1(): a = 20 def func2(): nonlocal a a = 30 print(a) func2() print(a) func1() 结果: 加了了nonlocal 30 30 不不加nonlocal 30 20