动态传参:
动态位置参数(万能传参):*args 获得结果是一个元祖 顾名思义就是可以接受所有位置参数 如果有位置参数必须放在放在动态位置参数前面
动态关键字传参:**kwargs 获得一个字典 可以接收所有关键字参数 因此所有关键字参数必须放在动态关键字参数前面
#排序:位置参数>动态位置参数>关键字参数>动态关键字参数
lst=[1,2,3,4]
def func(*args) #聚合
print(*args) #1,2,3,4 把聚合的结果打散
func(*lst) #(1,2,3,4) 按顺序解包 func(1,2,3,4)
dic={"name":"alex","age":18}
def func(**kwargs)
print() #这块可以用*args,但是不可以用**kwargs
func(**dic)
名称空间:
全局名称空间:我们直接在py文件中,函数外声明的变量属于全局命名空间
局部命名空间:在函数中声明的变量会放在局部命名空间,也就是函数里面的是局部空间
内置命名空间:内置的就是python本身自带的东西,存放在python解释器中为我们提供的名字,list,tuple,str,int这些都是内置函数命名空间
# a = 10 # # # def func(): # 函数里的是局部空间 # b = 5 # print(b) # # func()
加载顺序:内置>全局>局部
取值顺序:局部>全局>内置
作用域:就是作用范围,按照生效范围来看分为全局作用域和局部作用域
全局作用域:在整个文件的任何位置都可以使用 全局命名空间+内置命名空间
局部作用域:在函数内部可以使用 局部命名空间
globals():查看全局作用域中的内容
locals(): 查看局部作用域中的变量和函数信息
函数的嵌套:
global:不在局部创建这个变量,而是直接使用全局的变量
例如;
a=100 def func(): global a #加了个global表示不在局部创建这个变量了,而是直接使用全局的a a=28 print(a) func() print(a)
nonlocal: 改变最近的父级变量,如果上级没有能够改变的就继续向上走,直到最外层函数就停止
a=10 def func1(): a=20 def func2(): nonlocal a a=30 print(a) #30 func2() print(a) #30 func1()
函数名的本质(函数是第一类对象的概念)
1)函数名可以赋值
def f(): print(123) f() a=b=c=abc=f #函数名的赋值 ##a=b=c=abc=f() 拿到的是func的返回值 abc=f a=f b=f c=f f() abc() a() b() c()
2) 函数可以作为容器的一项可以作为容器,容器类型:列表,元祖,字典,集合
def f1(): print("哇哈哈") def f2(): print('qqxing') l=[f1,f2] print(l) f1_func=l[1] f1_funcfunc() l[1]() for f in l: f()
3) 函数名可以作为参数
def login(): print("欢迎") def index(auth): auth() print("欢迎来首页") index(login)
4)函数名可以作为一个函数的返回值
def func() pass func 是函数名 func()是函数调用 func()的得到的结果就是返回值