zoukankan      html  css  js  c++  java
  • python 函数(2),动态参数,名称空间,作用域,函数嵌套

    *—*—python函数(2),动态参数,名称空间—*—*
    一、动态参数

    def func(a,b,c,d,e,f,g):
        pass
    func(1,2,3,4,5,6,7)
    

    如果有上百个参数怎么办呢?

    有没有可能有一个万能的参数,可以接受一切的参数呢?

    *args 动态参数,万能参数,了解一下哈

    args接收的就是实参所对应的所有的位置参数,并将其放在元祖当中

    它不会接收关键字参数

    def func(*args):
        pass
    func(1,2,3,4,5,6,7)
    

    接下来我们打印 返回值 看看是啥样

    def func(*args):
        print(args)
    func(1,2,3,4,5,6,7)
    

    执行输出:

    (1, 2, 3, 4, 5, 6, 7)

    如我们先前所言,结果是一个元组

    二、形参对应顺序

    动态参数*args 在定义中是聚合 调用时将所有传入的参数传入一个元祖,调用的时候输出这个元祖

    def func(*args,a,b,c,d,e='sex'):
        print(args,a,b,c,d,e)
    func(1,2,3,4,5)
    

    报错,因为*args接收了所有实参,所以缺少了a,b,c,d参数

    TypeError: func() missing 4 required keyword-only arguments: 'a', 'b', 'c', and 'd'

    我们修改一下看看

    def func(a,b,c,d,*args,e='sex'):
        print(a,b,c,d,args,e)
    func(1,2,3,4,5,6,7,8,e='男')
    

    执行输出:

    1 2 3 4 (5, 6, 7, 8) 男

    形参对应顺序:

    位置参数,*args,默认参数

    *args参数,可以不传,默认为空()

    def func(a,b,c,d,*args,e='sex'):
        print(a,b,c,d,args,e)
    func(1,2,3,4,e='男')
    

    执行输出:

    1 2 3 4 () 男

    *args名字是可以改的,但是约定成俗使用*args

    **kwargs也是动态参数,和*args不同的是,它只接收关键字参数

    **kwargs动态传参,它将所有的关键字参数(未定义的)放到一个字典中。

    def func(a,b,c,**kwargs):
        print(kwargs)
    func(1,2,a1=3,b1=4,c1=5,c=7) 

    执行输出:

    {'a1': 3, 'b1': 4, 'c1': 5}

    执行没有报错,是因为函数接收参数后,它会从左边到右找,最后找到了c

    c=7参数,在a,b,c里面已经定义好了,所以在输出的字典中,并未出现。

    因为kwargs返回的是未定义的关键字参数。

    **kwargs正确的位置

    # def func(a,b,c,*args,e='男',**kwargs):
    #     print(a,b,c,*args,e,kwargs)
    # func(1,2,a1=3,b1=4,c1=5,e='女',c = 7)
    

    执行输出:

    1 2 7 女 {'a1': 3, 'b1': 4, 'c1': 5}

    三、*魔法运用

    def func(*args):
        print(args)
    l1 = [1,2,3]
    l2 = [11,22,33,44]
    

    若要将2个列表的所有元素赋值给args,如何实现呢?

    这个时候需要用到*   在调用时*为打散

    def func(*args):
        print(args)
    l1 = [1,2,3]
    l2 = [11,22,33,44]
    func(*l1)
    func(*l2)
    

    执行输出:

    (1, 2, 3)
    (11, 22, 33, 44)

    **kwargs   打散

    def func(**kwargs):
        print(kwargs)
    dic1 = {'name':'小明','age':18}
    dic2 = {'name1':'小李','age1':20}
    func(**dic1,**dic2)
    

    执行输出:

    {'name': '小明', 'age': 18, 'name1': '小李', 'age1': 20}

    **kwargs只限于字典类型

     在函数的调用执行时,
       *可迭代对象,代表打散(list,tuple,str,dict(键))将元素一一添加到args。
       **字典,代表打散,将所有键值对放到一个kwargs字典里。

    四、命名空间和作用域

    a = 1
    b = 2
    c = [1,2,3]
    c1 = {'name':'ethan'}
     
    def func1():
        name = '大司马'
        print(name)
    func1()  #执行输出:大司马
    

      

     

     

    作者:蛛丝马迹
        
    no copyright, 欢迎转载
  • 相关阅读:
    解决Android调用https服务API时出错的问题
    Sqlite 数据库出现database disk image is malformed报错的解决方法
    Bootstrap Chart组件使用分享
    Devexpress TreeList控件绑定显示父子节点对像
    回顾过去的2015展望已经到来的2016年,给自己的一些计划
    1006
    1003
    1001
    Swing用户界面组件-1
    图形程序设计
  • 原文地址:https://www.cnblogs.com/python-wang/p/9511578.html
Copyright © 2011-2022 走看看