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
  • 相关阅读:
    Benelux Algorithm Programming Contest 2016 Preliminary K. Translators’ Dinner(思路)
    Benelux Algorithm Programming Contest 2016 Preliminary Target Practice
    Benelux Algorithm Programming Contest 2016 Preliminary I. Rock Band
    Benelux Algorithm Programming Contest 2016 Preliminary A. Block Game
    ICPC Northeastern European Regional Contest 2019 Apprentice Learning Trajectory
    ICPC Northeastern European Regional Contest 2019 Key Storage
    2018 ACM ICPC Asia Regional
    2018 ACM ICPC Asia Regional
    Mybatis入库出现异常后,如何捕捉异常
    优雅停止 SpringBoot 服务,拒绝 kill -9 暴力停止
  • 原文地址:https://www.cnblogs.com/leiwei123/p/8399542.html
Copyright © 2011-2022 走看看