zoukankan      html  css  js  c++  java
  • python函数进阶

    一:python的传参方式(续)

    1,三种动态参数(形参)

        动态参数,也叫不定长传参,就是你需要传给函数的参数很多,不定个数,那这种情况下,你就用*args,**kwargs接收,args是元祖形式,接收除去键值对以外的所有参数,kwargs接收的只是键值对的参数,并保存在字典中。

    *args 动态参数,不定长参数

    def func(*args):
        print(args,type(args))
    func(1,2,'alex',3,4,5,6,8,4,7,2)
    
    def func(a,b,c,*args):
        print(a)
        print(b)
        print(c)
        print(args,type(args))
    func(1,2,'alex')

    args(元组形式),他包含了所有的位置参数,  参数的顺序:位置参数,*args,默认参数,**kwargs

    def func(a,b,c,*args,sex = ''):
        print(a)
        print(b)
        print(c)
        print(sex)
        print(args,type(args))
    func(1,2,'alex','wusir','ritian ',sex='')

    **kwargs 包含了关键动态参数,接收的只是键值对的参数,并保存在字典中.

    def func(**kwargs):
        print(kwargs)
    func(a = 1,b = 4,c = 3,d = 2)
    
    def func(a,b,c,*args,sex = '',**kwargs):
        print(a)
        print(b)
        print(c)
        print(sex)
        print(args,type(args))
        print(kwargs)
    func(1,2,'alex','wusir','ritian ',sex = '',name = 'taibai',age = 21)
    View Code

    2,  万能参数

    def func2(*args,**kwargs):
        print(args)
        print(kwargs)
    func2(1,2,3,5,name='alex',age=56)
    # (1, 2, 3, 5)
    # {'name': 'alex', 'age': 56}

    3,参数陷阱:默认参数是一个可变数据类型

    def defult_param(a,l = []):
        l.append(a)
        print(l)
    
    defult_param('alex')
    defult_param('egon')
    View Code

    4,  *魔法运算:打散

    def func2(*args,**kwargs):
        print(args)
        #(1,2,3)
    l1 = [1,2,3,]
    l2 = [1,2,3,2,3,100,2]
    func2(*l2,*l1)
    #(1, 2, 3, 2, 3, 100, 2, 1, 2, 3)
    
    def func3(*args,**kwargs):
        print(args)
        print(kwargs)
    func3(**{'name1':'alex','age1':12},**{'name2':'jin','age2':22},name3 = 'wusir')
    # ()
    # {'name1': 'alex', 'age1': 12, 'name2': 'jin', 'age2': 22, 'name3': 'wusir'}
    View Code

    二:名称空间

    1,各种名称空间的概念

            当Python代码运行的时候,从Python解释器开始执行之后,就在内存中开辟里一个空间,每当遇到一个变量的时候,就把变量名和值之间对应的关系记录下来,但是当遇到函数定义的时候,解释器只是象征性的将函数名读如内存,表示知道这个函数存在了,至于函数内部的变量和逻辑,解释器根本不关心。等执行到函数调用的时候,Python解释器会再开辟一块内存来储存这个函数里面的内容,这个时候,才关注函数里面有哪些变量,而函数中的变量回储存在新开辟出来的内存中,函数中的变量只能在函数内部使用,并且会随着函数执行完毕,这块内存中的所有内容也会被清空。

        这个‘存放名字与值的关系’的空间就是-------命名空间

        代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做------全局命名空间

        在函数中开辟的临时空间就叫做------局部命名空间

       用于存放了python解释器为我们提供的名字:input,print,str,list,tuple就是-----内置命名空间

    2,三种命名空间之间的加载与取值顺序

        加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)

        取值顺序:在局部调用:局部命名空间->全局命名空间->内置命名空间,在全局调用:全局命名空间->内置命名空间。综上所述,在找寻变量时,从小范围,一层一层到大范围去找寻。

    三:作用域

        作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。

        全局作用域:包含内置名称空间,全局名称空间,在整个文件的任意位置都能被引用、全局有效

        局部作用域:局部名称空间,只能在局部范围内生效

    globals和locals方法

    name = 'wusir'
    def func():
        name = 'alex'
        # print(name)
        # print(globals())
        # print(locals())
    func()
    
    print(globals())
    print(locals())
    View Code

    四:函数的嵌套

    局部找全局的函数名可以找到。

    def fun2():
        print(222)
        fun1()
    fun2()
    print(111)
    def fun2():
        print(222)
        def fun3():
            print(666)
        print(444)
        fun3()
        print(888)
    print(333)
    fun2()
    print(555)
    View Code

    五:global和nonlocal关键字

    1,global:

    (1), 声明一个全局变量。

    (2), 在局部作用域想要对全局作用域的全局变量进行修改时,需要用到 global(限于字符串,数字)。

    count = 1
    def search():
        global count
        count = 2
    search()
    print(count)

    2,nonlocal

    (1),不能修改全局变量。

    (2),在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。

    def func():
        name = 'wusir'
        def inner():
            nonlocal name
            name = 'taibai'
            print(name)
        print(name)
        inner()
        print(name)
    func()
    # wusir
    # taibai
    # taibai
    
    def add_b():
        b = 42
        def do_global():
            b = 10
            print(b)
            def dd_nonlocal():
                nonlocal b
                b = b + 20
                print(b)
            dd_nonlocal()
            print(b)
        do_global()
        print(b)
    add_b()
    # 10 30 30 42
    View Code
  • 相关阅读:
    js弹出DIV层
    .net 生成静态页面
    新开博客
    随机生成验证码
    ASP.NET错误处理方法总结
    webgis
    看樱花
    今天转载的笑话,挺好笑呵
    用Tomcat插件在Eclipse上搭建可跟踪调试的J2EE WEB开发环境
    关于JSTL的简单说明
  • 原文地址:https://www.cnblogs.com/leiwei123/p/8399542.html
Copyright © 2011-2022 走看看