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')
#定义一个 动态位置参数
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='男')

#不能以数字为关键字参数的名字,否则会造成语法错误
#定义 **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,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)
####  * 的特殊用法(函数之外也可以)
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')
#### 位置参数   >   *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()
###      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函数的内容地址

#函数嵌套函数
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函数的内容地址