• 函数进阶


    函数的动态参数(万能参数)*args  **kwargs

      为了扩展,对于传入的实参数量不固定,而创建的   

     *args 用法

      在函数定义的时候,*args 聚合,即将所有实参的位置参数聚合到一个元组上,并将这个元组赋值给args.

    def fuc1(a,*args):
        print(a)
        print(args)
    fuc1(1,2,3,4,5,6,7)        #1      (2, 3, 4, 5, 6, 7)   
            

      在函数定义的时候,**kwargs 聚合成字典,即将实参所有的关键字参数聚合成一个字典的键值对

    def func1(a,**kwargs):
        print(a)
        print(kwargs)
    func1(a = "taibai",num = "alex",age = 18,sex = "")
    #taibai
    #{'num': 'alex', 'age': 18, 'sex': '男'}

      * 的魔性用法

     在函数定义时,在位置后表示聚合

     在函数执行时,在位置后表示打散(方便理解)

    l1 = [1,2,3]
    l2 = [111,22,33,'alex']
    def func1(*args):
        print(args)
    func1(*l1,*l2)  #(1, 2, 3, 111, 22, 33, 'alex') 可以理解为先打散后再在函数内进行聚合成一个元组
    #同理,**字典也可以这样打散后再聚合

    形参位置优先级

      位置参数在最左边,其后为*args,其次为默认参数,最后为**kwargs,一般来说只存在一两个进行运算,几乎不存在四个全都在的情况

    名称空间

    我们首先回忆一下Python代码运行的时候遇到函数是怎么做的,从Python解释器开始执行之后,就在内存中开辟里一个空间,每当遇到一个变量的时候,
    就把变量名和值之间对应的关系记录下来,但是当遇到函数定义的时候,解释器只是象征性的将函数名读如内存,表示知道这个函数存在了,
    至于函数内部的变量和逻辑,解释器根本不关心。 等执行到函数调用的时候,Python解释器会再开辟一块内存来储存这个函数里面的内容,这个时候,才关注函数里面有哪些变量,
    而函数中的变量回储存在新开辟出来的内存中,函数中的变量只能在函数内部使用,并且会随着函数执行完毕,这块内存中的所有内容也会被清空。 我们给这个‘存放名字与值的关系’的空间起了一个名字
    -------命名空间。 代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做全局命名空间; 在函数的运行中开辟的临时的空间叫做局部命名空间。

    全局名称空间:是一个存储变量名和变量值对应地址的信息的一个容器

    局部名称空间:在函数运行中临时开辟的空间。(临时存在)

    内置名称空间:python中内部已经定义好的函数

    作用域

    全局作用域:包括全局名称空间和内置名称空间

    局部作用域:局部名称空间(临时存在的,调用完成后就消失)

    取值顺序:就近原则,先从局部名称空间找,再到全局名称空间找,最后在到内置函数空间找

    加载顺序:内置名称空间---》全局名称空间(当程序执行时)---》局部名称空间(当函数调用时)

    函数的嵌套:一步一步看,不要粗心

       即在函数内部嵌套函数

    # x=1
    # def f1():
    #     def f2():
    #         print(locals())
    #         print(x)
    #     print(locals())
    #     return f2
    # x=100
    # def f3(func):
    #     x=2
    #     print(locals())
    #     func()
    # x=10000
    # f3(f1())
    # print(x)        #最后输出结果为10000

    关键字:global    nonlocal

    global

      1.声明一个全局变量

      2.在局部作用域想要对全局作用域的全局变量进行修改时,需要用到global

      注意:对于可变的数据类型(list,dict,set)可以直接引用而不需要通过global

    l2 = [1,3,4]
    dic ={"a":"b","c":"d"}
    def func1():
        l2.append(6)
        dic["q"] = 3
        print(dic)    #{'a': 'b', 'c': 'd', 'q': 3}
        print(l2)    #[1, 3, 4, 6]
    func1()
    print(dic)    #{'a': 'b', 'c': 'd', 'q': 3}
    print(l2)    #[1, 3, 4, 6]

    nonlocal

      1.不能修改全局变量

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

    # def func1():
    #     b = 42
    #     def func2():
    #         nonlocal b
    #         b += 10
    #         print(b)            #b = 52
    #         def func3():
    #             nonlocal b
    #             b += 20
    #             print(b)        #b= 72
    #         func3()
    #     func2()
    # func1()        

     函数的作用域链:

      小范围作用域可以使用大范围的变量,但是反之不行,因为他是单项的

    补充

    在Python3将reduce函数放在functools 中了,

    from functools import reduce
    list1 = [1, 2, 3, 4]
    def my_sum(x, y):
        return x + y
    ret = reduce(my_sum, list1)#将列表中的一二个元素放入函数中,计算完,再放一个元素
    print(ret)#输出为10
  • 相关阅读:
    php 随机红包算法
    mysql window系统备份远程数据库到本地
    程序员 面试题【前端,java,php】
    PDMan 数据库建模工具
    数据结构之更多字符串的内容
    数据结构之参考-对象与参考
    数据结构之序列
    excel的宏与VBA入门——代码调试
    DataWorks使用小结(二)——功能面板使用指南
    DataWorks使用小结(一)——概述
  • 原文地址:https://www.cnblogs.com/yuncong/p/9488853.html
Copyright © 2020-2023  润新知