码迷,mamicode.com
首页 > 其他好文 > 详细

函数初识二

时间:2019-07-31 15:18:53      阅读:90      评论:0      收藏:0      [点我收藏+]

标签:war   密码加密   执行   fun   param   lex   形式   字典   **kwargs   

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>

技术图片

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

函数初识二

标签:war   密码加密   执行   fun   param   lex   形式   字典   **kwargs   

原文地址:https://www.cnblogs.com/lvweihe/p/11275964.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!