• python -- 函数进阶


    一、函数参数-动态传参
     
        1、形参:
     
          *   在形参位置, 表示此参数为不定参数,接受的是位置参数
               并且接收到的位置参数的动态传参都是元组
    def func(* jiemu): # 在形参这里把接受过来的实参进行聚合,集合成一个元组
    print(jiemu)
    
    func('奇葩说','知识就是力量','老梁说故事','吐槽大会')
    
    #  结果:('奇葩说', '知识就是力量', '老梁说故事', '吐槽大会')
     **   在形参表示动态传参 -- 关键字参数
                关键字动态参数,接收到的是字典
    def func(**tianqi): # 聚合, ** 聚合成字典
    print(tianqi)
    
    # func(1,2,3,4,5) # 位置参数或报错, func() takes 0 positional arguments but 5 were given
    func(today='晴天', tomorrow='大晴天', yesterday='阴天')
    # 结果:{'today': '晴天', 'tomorrow': '大晴天', 'yesterday': '阴天'}
    顺序
     
    位置   *args   默认值   **kwargs      ,可以随意搭配,必须按照顺序来
    # 无敌参数
    def func(*args,**kwargs):     # argument  参数   key argument   关键字参数
    print(args,kwargs)
    
    func('a','b',1,2,3,f='小熊',g = '小虎')
    
    # 结果:('a', 'b', 1, 2, 3) {'f': '小熊', 'g': '小虎'}
    2、实参 
     
       *   在实参是打散,把列表,元组,字符串打散成位置参数进行传递
    def eat(*food):
    print(food)
    
    eat(*"你今天吃了什么")
    
    # 结果:('你', '今', '天', '吃', '了', '什', '么')

     **  在形参表示动态传参 -- 关键字参数; 打散,打散成关键字 

    def tianqi(**day):  # 聚合,聚合字典
    print(day)
    
    dic = {'today':'晴天','tomorrow':'要下雪',}   # 打散,打散关键字
    tianqi(**dic,abs= '还是要下雪')
    
    # 结果:{'today': '晴天', 'tomorrow': '要下雪', 'abs': '还是要下雪'}
    二、作用域和名称空间
     
         1、名称空间:用来存放名字(变量,函数名,类名,引入的模块名)
     
            1、全局名称空间:我们在py文件中自己写的变量,函数,类,
            2、内置名称空间:我们python解释器提供好的一些内置内容(print,imput,list,tuple,str,int...)
            3、局部名称空间:在函数中声明的变量会放在局部命名空间
                
            名称空间可能会有无数个,和局部名称空间是相对独立的,一般互不干扰
     
             加载顺序:1、内置命名空间  2、全局命名空间 3、局部命名空间(函数被调用的时候)
             取值顺序:1、局部命名  2、全局命名空间  3、内置命名空间
     
            从全局中去找局部  -》找不到
            从局部去找全局 -》 可以找到
            
            2、作用域
     
                作用域就是作用范围,按照生效范围来看分为全局作用域和局部作用域
     
                1、全局作用域:包含内置命名空间和全局命名空间,在整个文件的任何位置都可以使用
                2、局部作用域:局部命名空间,在函数内部使用
     
                  通过 globals()函数来查看全局作用域中的内容,也可以通过locals()来查看局部作用域中的变量和函数信息
    a = 10
    def func():
    a = 20
    c = 30
    def abc():
    print('who are you?')
    print(a,c) # 这里使用的是局部作用域
    print(globals()) # 打印全局作用域中的内容
    print(locals()) # 打印局部作用域中的内容
    
    func()

     三、函数的嵌套 

    def func1():
        print(1)
        def func2():
            print(2)
            def func3():
                print(3)
            func3()
         print(4)
         func2()
         print(5)
    
    func1()

    四、关键字global和nonlocal 

    a = 10
    def func2():
    a = 20
    print('内部的:',a)
    
    func2()
    print('外部的:',a)
    
    # 内部的: 20
    # 外部的: 10

      global表示,不再使用局部作用域中的内容了,而改用全局作用域中的变量 

    # 全局变量一般是不能随意改变得
    a = 10
    def func2():
        # 慎用
        global a # 表示从全局把一个变量引到局部,后面使用的a都是全局变量
        a += 20 # 现在a 是全局变量,在试图改全局变量
        print('内部的:',a)
    
    func2()
    print('外部的:',a)
    
    # 内部的: 30
    # 外部的: 30

       在局部引入一个全局变量,如果这个变量在全局不存在,global会自动创建一个全局变量

    def func():
        global a  # 创建一个全局变量
        a = 10
    print(a)
    func()
    print(a)

    nonlocal 表示在局部作用域中,调用父级命名空间(离它最近的一个)中的变量 

  • 相关阅读:
    JavaScript使用DeviceOne开发实战(四)仿优酷视频应用
    JavaScript使用DeviceOne开发实战(三)仿微信应用
    JavaScript使用DeviceOne开发实战(二) 生成调试安装包
    生成器
    Python第一周的复习
    Ubuntu学习—-——第一课
    英 语 缩 写 (四)
    英语缩写(三)
    英语常用缩写(二)
    英语常用缩写(一)
  • 原文地址:https://www.cnblogs.com/1915823-huxt/p/10093156.html
Copyright © 2020-2023  润新知