Day10、函数的进阶

时间:2021-02-28 22:39:40

一、动态参数

def func(): # 形参

  pass

func() # 实参

 

args和 kwargs 是可以更换的,但是程序员约定都用它

 

用途:在不明确接受参数,数量时使用*args和**kwargs

def func(*args):
    print(args) func(1,2,3,) #结果 (1,2,3)是一个元祖

 

def func(a,b,c,*args):  # 在形参位置*叫做聚合
    print(a,b,c)
    print(args)   # 元组形式
func(1,2,3,4,5,9,6,7,8) #结果: 1 2 3 (4, 5, 9, 6, 7, 8)
位置参数 > 动态的位置参数
def func(**kwargs): # 动态默认参数  #形参的时候**聚合
    print(kwargs)  # 字典

func(a=1,b=2,c=3) # 关键字的形式传参

#结果: {'a': 1, 'b': 2, 'c': 3} 
def func(*args,**kwargs):    #动态参数 > 动态默认参数
    print(args,kwargs)
func(1,2,3,a=1,b=2,c=3) #结果: (1, 2, 3) {'a': 1, 'b': 2, 'c': 3}
动态参数 > 动态默认参数
def func(a,b,*args,**kwargs):     #位置参数 > 动态参数  > 动态默认参数
    print(a,b)
    print(args,kwargs) func(1,2,3,4,5,d = 2,e = 3,f = 4) #结果: 1 2 (3, 4, 5) {'d': 2, 'e': 3, 'f': 4}

 

位置参数 > 动态参数  > 动态默认参数

def func(a,b,*args,x = 66 ,y = 666 ,z = 6,**kwargs):
    print(a,b) print(x,y,z) print(args,kwargs) func(1,2,3,4,5,6,d = 2,e = 3,f = 4) #结果: 1 2 66 666 6 (3, 4, 5, 6) {'d': 2, 'e': 3, 'f': 4}
Day10、函数的进阶View Code
Day10、函数的进阶args 和kwargs

 Day10、函数的进阶

 

形参: 位置 > 动态位置 > 默认参数 > 动态默认参数

 

实参: 位置 > 关键字参数

 

在实参调用的时候 *将可迭代的对象打散,字典是将键取出

在形参处出现*就是在聚合

在实参调用的时候 **将字典打散成  关键字参数(键=值)

在形参处出现**就是将关键字参数聚合成一个字典

Day10、函数的进阶

 

def func(*args,**kwargs): # * 聚合
    print(*args) # args = ()  *args = 1 2 3  *打散
    print(*kwargs) # args = ()  **kwargs = a,b  *打散 字典的键
func(1,2,3,a=4,b=5)

#结果:1 2 3
 #a b

 

li = [1,2,3,5,4]

def func(*args):  # 聚合 (1,2,3,5,4)
    print(args) print(*args) # 打散 1,2,3,5,4 func(*li) # 1,2,3,5,4

 Day10、函数的进阶

 

dic = {'a':1,'b':2}
def func(*args,**kwargs): print(args,*kwargs) #() a b func(**dic) # 将键打散

 

 

二、函数的注释

def log(user,pwd):

    """

    登录函数

    :param user: 用户名

    :param pwd: 密码

    :return: 校验后的账号和密码

    """

    print(111)

 

# print(log.__doc__)

 

#简单了解

# print(log.__name__) # 反射

Day10、函数的进阶

 

 

三、名称空间

1.内置空间中所有代码  -- 内置空间

2.自己写的py文件      -- 全局空间

3.函数中的代码        -- 局部空间

a = 10

def func():
    a = 1
    print(a) func() print(a) # 1 10

 

Day10、函数的进阶

 

 

# 加载顺序:

1.内置空间       2.全局空间      3.局部空间

# 取值顺序:

1.局部空间      2.全局空间    3.内置空间      4.找不到就报错

# 作用域:

1.全局作用域  内置+全局 = 全局作用域

2.局部作用域  函数内的就是局部作用域

 

四、函数的嵌套

函数嵌套内,从最里层返回一个任意字符串,在外部接受打印

# 第一种函数嵌套 在函数func内

def func():
    print(3) def f(): print(1) print(2) f() func() # 3 # 2 # 1

 

 Day10、函数的进阶

 

 

# 第二种函数嵌套 多个函数嵌套调用

def func2():
    print(1) log() def func1(): print(3) def log(): func1() print(6) def fun(): print(7) #函数没有调用,没有输出结果
def func2():
    print(1) log() def func1(): print(3) def log(): func1() print(6) func2() # 1 # 3 # 6

 

 

 Day10、函数的进阶

 

 

Day10、函数的进阶View Code

 

 

def func():
    a = 1
    def log(): a = 5 def info(): a = 10 print(a) info() print(a) log() print(a) func()

 

 Day10、函数的进阶

 

 

五、gloabal、nonlocal

gloabal

 

a = 10
def func():
    global a  # (声明)我要修改a 找到要a
    a+=1      # 修改
func() print(a) #11

 

 Day10、函数的进阶

 

 

def func():
    global a  #(声明我要修改a,找不到a的时候在全局创建一个 a=0)
    a = 1  # a = 1
func() print(a)

 

 

 

nonlocal

def func():
    a = 1
    def log(): a = 5 # a = 15 def info(): nonlocal a # 声明修改log函数下边的变量a a += 10 # a = a + 10 a = 15 print(a) # 15  info() print(a) # 15  log() print(a) # 1 func() # 15 # 15 # 1

 

 

def f():
    a = 1
    print(a) def a1(): a = 5 print(a) def l(): nonlocal a a = 8 print(a) l() print(a) print(a1()) f()

Day10、函数的进阶