动态传参,命名空间,函数嵌套

1. 函数的动态参数

  1. *args 位置参数动态传参  #接受到的是元祖,把所有位置实参传入的都打包

def play(*sports):
    print(sports)
play('足球','篮球','羽毛球')

  2. **kwargs 关键字参数动态传参  #接受到的是字典,把所有关键字实参传的数据打包接收

def play(**sports):
    print(sports)
play(football='足球',basketball='篮球',sleep='我好困啊')

  顺序:位置参数, *args, 默认值, **kwargs

    1.位置参数必须在*args前面

def func(*args,a):
    print(args,a)
func(1,2,3,4)      *args接受全部位置参数,那a就没有数据了,程序会报错

    2.同理,默认值参数必须在**kwargs前面,否则,默认值参数永远都取不到值,都是用默认值,没法重新赋值      

  def func(*args, **kwargs):  #什么都能参数都能接,万能
    pass

  形参的位置*,**: 聚合  
  实参的位置*,**: 打散

def diwuti(*args):
    print(args)  #结果为(1,2,3,4,5)
diwuti(*[1,2,3],*(22,33))  #实参前面加*或者**,打散元素.变为1,2,3,22,33  
def qizhi(**kwargs):
    print(kwargs)
qizhi(**{'a':'一'},**{'b':'二'},**{'c':'三'})  #{'a': '一', 'b': '二', 'c': '三'}

2. 命名空间

  存放变量名字与值绑定关系的地方
  1. 内置名称空间  python解释器先启动,首先加载的就是是内置名称空间 如input,print

  2. 全局名称空间  除去函数外声明的变量名称空间
  3. 局部名称空间  在执行文件的过程中如果调用函数,则临时产生局部名称空间

a = 10 # 全局名称空间中的内容
def fn(): # fn也在全局名称空间
    b = 20 # 局部名称空间
    print(a)  #在全局无法查看局部的,在局部可以查看全局
fn()

作用域:作用范围 

  1. 全局作用域: 内置+全局  全局存活,全局有效
  2. 局部作用域: 局部(函数被调用)  临时存活,局部存活
  globals() 查看全局中的内容
  locals() 查看当前作用域中的内容

a = 110 # 全局
def fn(): #函数名称变量也是全局
    b = 20 # 局部
    def gn(): # 局部
        print(globals())  # 可以查看全局作用域中的内容
       print(locals())  # 查看当前作用域中的内容
    gn()
fn()

3. 函数嵌套
  函数可以互相的嵌套

def outer():
    print("哈哈")
    def inner_1():
        print("呵呵")
        def inner_1_1():
            print("嘻嘻")
        inner_1_1()
        print("吼吼")
    def inner_2():
        print("嘿嘿")
    inner_2()
    inner_1()
outer()      #自己先试着写一下结果,再运行核对,注意执行顺序  

 

注意:函数声明的时候没有任何操作,程序只是给函数名留了个变量位置.  只有调用函数的时候,才会拿着值去找函数并执行一系列操作.

4. global和nonlocal关键
  global: 在局部访问全局中的内容

    1,把全局变量引入函数内部,可以改变全局变量

    2,没有这个全局变量会创建一个全局变量

 a = 10
def func():
    global a    #调用全局变量
    a += 10 
    print(a)
func()

  nonlocal: 在局部寻找外层函数中离他最近的那个变量

      除去全局变量外,查找不到该变量系统会报错

a = 1
def fun_1():
    a = 2
    def fun_2():
        global a
        a = 3
        def fun_3():
            a = 4
            print(a)
        print(a)
        fun_3()
        print(a)
    print(a)
    fun_2()
    print(a)
print(a)
fun_1()
print(a)      #同样自己先写下结果,在运行程序,对比结果

函数注释  在函数内部输入3对双引号,会自动加载下面的东西o(∩_∩)o 

def func(a, b):
 """
这个函数是用来计算a和b的和
:param a: 第一个数据
:param b: 第二个数据
:return: 返回的是两个数的和
"""
return a + b
print(func.__doc__) # document文档  查看函数注释,方便别人了解函数功能

 

  

posted @ 2018-08-09 16:43  amberLIU  阅读(238)  评论(0)    收藏  举报