Python进阶(二)----函数参数,作用域

mac2022-06-30  71

Python进阶(二)----函数参数,作用域

一丶形参角度:*args,动态位置传参,**kwargs,动态关键字传参

*args:

​ 动态位置参数. 在函数定义时, * 将实参角度的位置参数聚合在一起

​ 解决实参传递多个位置参数,用*args全部接收,得到元组类型的数据

#定义一个 动态位置参数 def eat(*args): print(args) # 得到元组数据 print(f'{args}') eat('a','b','c') # 动态位置参数的应用,从实参传来多个位置参数,求和. def func(*args): count=0 for i in args: count+=i return count print(func(1,2,3,4,5,6,7)) ######## 番外篇 ############# # *args 不能接收,实参关键字参数 def func(*args): print(args) func(name='aelx')

**kwargs:

​ 函数的定义时: ** 将实参角度的关键字参数 聚合成一个字典

​ 解决实参传递多个关键字参数

#定义 **kwargs def func(**kwargs): # 聚合成一个字典 print(kwargs) func(name='alex',age=86,sex='男') #不能以数字为关键字参数的名字,否则会造成语法错误

​ ###无敌组合接参数,*args **kwargs.

### 无敌接参 ,万能参数 def func(*args,**kwargs): print(args,kwargs) func(1,2,3,4,name='alex',price='1000')

二丶函数中 * 的用法

#### * 的特殊用法(函数之外也可以) def func(*args,**kwargs): # * 聚合成元组类型数据 print(args) print(kwargs) li=[1,2,3] l=['五四','等哈','大声'] func(*li,*l) #当函数执行的时候,*iterable代表打散, #### ** 的特殊用法 def func(**kwargs): #聚合成字典类型数据 ,聚合成字典的键是字符串格式 print(kwargs) func(**{'name':'alex'},**{'sex':'男'}) #当函数执行的时候, **dict代表打散,不能是数字作为字典的键名 ####番外篇#### def func(**kwargs): print(kwargs) func(**{'1':2}) # {'1': 2} # func(k1=1) # k1是字符串 {'k1': 1} # func(k2='v2') #{'k2': 'v2'} ###经典例题 ,组合参数#### def foo(a,b,*args,c,sex=None,**kwargs): print(a,b) print(c) print(sex) print(args) print(kwargs) foo(*[1, 2, 3, 4],**{'name':'太白','c':12,'sex':'女'}) # a b ---> 1 ,2 位置参数 , 一 一对应 # c 12 ---> 字典打散后 c=12 #sex 女 ----> 字典打散后 sex='女' #args (3,4) --->列表打散后 3,4是位置参数, 被*args聚合(3,4) #kwargs{'name':'太白'} ----> 字典打散后 name='太白' ########函数之外: *变量 序列解包 .处理剩余元素, 都会转成列表格式 a,b,*c=[1,2,4,5,6,7] # a=1 b=2 c=[4,5,6,7] print(a,b,c) a,*c,b=[1,2,4,5,6,7] # a=1 ,b=7 ,c=[2, 4, 5, 6] print(a,b,c) a,*c=range(5) # a=0 c=[1, 2, 3, 4] print(a,c) a,*c=(1,2,3,4,5) # a=1 c=[2, 3, 4, 5] print(a,c) a,b,*c='abcd' # a=a b=b c=['c', 'd'] print(a,b,c) a,*c,b='abcd' # a=a b=d c=['b', 'c'] print(a,b,c)

三丶形参角度的最终顺序

#### 位置参数 > *args > 默认参数 > 仅限关键字参数 > **kwargs (最重要!!!) ##形参角度,仅限关键参数 ,位置:在 **kwarg之前 , *args 之后 def func(a,b,c,*args,sex='man',f,**kwargs): print(f) func(1,2,3,4,5,6,f='111',name='alex')

四丶空间

全局名称空间:

​ 存放的是执行.py文件(取出函数内部)的所有的变量与值(地址)的对应关系,整个py文件结束之后,才会消失

临时(局部)名称空间:

​ 函数执行时,在内存中临时开辟的一个空间,存放的函数中的便令与之的对应关系,随着函数的结束而消失

注意:只有函数被调用时,局部空间才会被创建,函数执行完.局部空间就销毁

内置名称空间:

​ print(),input() 等 内置函数

五丶取值顺序加载顺序

加载:

​ 指的是加载到内存

加载顺序:

​ ? 内置名称空间 > 全局名称空间 > (当函数执行时,才会加载)局部名称空间

取值顺序:

​ (就近原则) 局部 ---> 全局 ----> 内置 (方向不可逆)

六丶作用域

​ 全局作用域:全局名称空间,内置名称空间

​ 局部作用域:局部名称空间

七丶内置函数:globals,locals

### globals全局作用域, locals当前作用域(在全局作用域,打印全局作用域中的变量和值,在函数中就只打印函数中变量和值,都是以字典的形式打印.) #案例一, name = 'alex' l1 = [1, 2, 3] def func(): age = '18' print(globals()) # 全局作用域所有的内容 print(locals()) # 当前位置 #案例二, name = 'alex' l1 = [1, 2, 3] def func(): age = '18' oldboy = '不打广告' print(locals()) # 以字典的形式打印函数内的 变量与值的对象关系字典的形式{'age':18,oldboy:'不打广告'} print(locals()) # 当前位置的变量与值的对应关系 , print(globals()) # 以字典的形式打印 全局作用域所有的内容 ,只有func方法的内存地址 func()

八丶高阶函数(嵌套函数)

1.只有当函数名+()才会执行函数 , 2.当函数没有执行完就不会执行到下一行

#函数嵌套函数 def func(): print('这是func') def func2(): print('这是func2') func2() print('执行完func2') func() print('执行完func') ##### ? 注释是考查的知识点 #### 函数的执行 #### def func(): data = 2*2 return data new_name = func # 赋值,指向同一块内存地址 val = new_name() # 相当于执行func()函数 print(val) #### 函数执行 + 深浅拷贝#### def func(): data = 2*2 return data data_list = [func,func,func] # 四个相同的func函数内存地址 for item in data_list: #循环遍历 v = item() #执行func()函数 print(v) #打印函数执行返回的结果 #### 函数的执行#### def func(arg): # 接收show函数的内存地址 arg() #执行show()函数 def show(): print('show函数') func(show) # 传入show函数的内容地址

转载于:https://www.cnblogs.com/dengl/p/11045692.html

最新回复(0)