函数初识二

1. 函数的动态参数

  • *args **kwargs
def func(a,b,*args):
	print(a,b,args)
func(1,2,3,4,5,6)
结果:
1 2 (3,4,5,6)  可以传递多个参数,以元组形式出现

def func(a,b,*args):
	print(a,b,*args)  # *args将元组打散
func(1,2,3,4,5,6)
结果:
1 2 3 4 5 6
def num(*args,a=1,b=2):
	print(a,b,args)
num(1,2,3,4,5,6)
结果:
 1 2 (1,2,3,4,5,6) #打印顺序原因

下边的也可以,不报错,但没有意义

def func(a=1,b=2,*args):
	print(a,b,args)
func(10,11,12,13,14,15)
结果:
10 11 (12,13,14,15)

参数排列顺序:优先级

位置参数 > 动态位置参数 > 默认参数 (关键字参数) > 动态关键字参数

def func(a,b,**kwargs):
	print(a,b,kwargs)   #kwargs 以字典形式输出
func(1,2,c=3,d=4)
结果:
1 2 {"c":3,"d":4}  
def func(a,b,**kwargs):
	print(a,b,*kwargs)   # *kwargs 获得的是字典的键
print(1,2,c=3,d=4)
结果:
1 2 c d 
def func(a,b,*args,c=3,d=4,**kwargs):
    print(a,b,args,c,d,kwargs)
func(1,2,3,4,c=5,d=6,bj= "首都",alex="IT")
结果:
1 2 (3, 4) 5 6 {'bj': '首都', 'alex': 'IT'}

万能传参

def func(*args,**kwargs):
	print(args,kwargs)
func(1,2,3,a=3,b=4,c=5)
结果:
(1, 2, 3) {'a': 3, 'b': 4, 'c': 5}

2. 注释

​ 不开头,6个双引号,上三下三

def func(user,password):
    """
    密码加密
    :param a:   用户名                    注释内容
    :param b:  密码
    :return:  加密的密码
    """
func()

查看注释

print(func.__doc__) _ _

3. 名称空间

  • 内置空间:放置内置函数的空间,如print(),inpurt().len()
  • 全局空间:当前.py文件组要开辟的空间,放在全局空间
  • 局部空间:.py文件中顶头书写,函数中开辟的空间就是局部空间

加载顺序: 内置空间 >全局空间 >局部空间

取值顺序:局部空间 >全局空间>内存空间

作用于:

全局作用域:内置空间+全局空间

局部作用域:局部空间

def func():
    print("1")
    def f1():
        print(2)
    return f1()
func()

不管在什么位置,只要是函数名+(),就是在调用此函数,函数调用执行后,函数体中开辟的空间就自动销毁

4. 函数嵌套

def func():
    a = 1
    def foo():
        b = 2
        print(b)
        print(a)
        def f1():
            print(b)
        return f1()
    return foo()
print(func())
#结果:
2 1 2 None

def a():
    a = 1
    c()
    print(c)
def b():
    b = 2
    print(b)
def c():
    c = 3
    print(a)	#	而且不能去同级别函数中寻找,只能去上一级或者更上级寻找
def run():
    a()
run()
结果:
<function a at 0x000000DF3DBFA950>  变量名不加括号是内存地址
<function c at 0x000000DF3DBFAA60>

![

](assets/1563371186324.png)

5. global + 变量 声明修改全局变量的值

a = 10
def func():
    global a    #修改全局变量 a
    a += 1      #修改全局变量 a=11
    print(a)   #第二个打印  11
print(a)       #第一个打印  10
func()
print(a)   #函数结束,但全局变量的a 改变了
结果:
10 11 11

在函数中,局部空间里的变量可以使用全局变量的值,但是不能修改,如果要修改全局变量的值,则需要添加 global + 变量名

6. nonlobal + 变量 不能修改全局变量,只能修改局部变量里的值,逐级修改

  • global : 修改全局空间的变量对应的值
    nonlocal :在外层的函数中,修改局部空间的变量值.完全不涉及全局变量,只修改离它最近的一层,最近的一层没有变量继		续向上找,直到找到最外层函数
    
a = 10
def func():
    def a():
        a = 20  #下级的修改了,此处不变
        def f1():
            a = 30   #a 被修改了
            def foo():
                nonlocal a   #要修改局部变量的a的值
                a += 1       # 将a 改为 31
                print(a)   # 31
            foo()
            print(a) # 31     #a 已经改变了
        f1()
        print(a)
    a()
func()
print(a)    #全局空间的a 没有发生任何改变
# 结果: 31 31 20 10
posted @ 2019-07-31 14:15  lvweihe  阅读(96)  评论(0编辑  收藏  举报