zoukankan      html  css  js  c++  java
  • Python 不定长参数、全局变量、局部变量 day4

    一、不定长参数

    在函数定义中,经常会碰到*args 和**kwargs作为参数。

    事实上在函数中,*和**才是必要的,args和kwargs可以用其他名称代替

    *args 是指不定数量的非键值对参数。 

    **kwargs是指不定数量的键值对参数。

    *args 作为作为元组匹配没有指定参数名的参数。

    **kwargs作为字典,匹配指定了参数名的参数。

    *args 必须位于**kwargs 之前。

    1、可变参数、参数组,*args    
       # 1、不是必填参数;
    # 2、不限制参数的个数:
    # 3、传入多个参数的时候,他把参数放到一个元组里面
    def send_report(*args): #可变参数、参数组
        print('发邮件')
        print(args)
        # for a in args:
        #     print(a)
    
    send_report()#不传 打印结果为发邮件 ()
    send_report(1)#传一个  打印结果为 发邮件 (1,)
    send_report(1,2,3,4,5)#传多个  打印结果为  发邮件 (1,2,3,4,5)
    2、关键字参数,**kwargs
    # 1、不是必填参数;
    # 2、不限制参数的个数:
    # 3、传入多个参数的时候,他把参数放到一个字典里面
    # 4、必须得使用关键字调用,k=v,k1=v1
    def send_report2(**kwargs): #关键字参数
        print('发邮件')
        print(kwargs)
    
    send_report2()#不传 打印结果为 发邮件 {}
    #send_report2(1)#会报错
    send_report2(name='xiaohei',age=18)#字典   打印结果为  发邮件 {'name':'xiaohei','age':18}
    3、调用函数的时候:
    关键字参数后面不能再写位置参数了。
    *args 调用不能传k=v格式的
    **kwargs 调用必须写k=v格式的
    def myfunc(name,addr,phone,qq,email):
        print(name,addr,phone,qq,email)
    
    myfunc(phone=110,addr='beijing',qq='5345355',email='134@163.com',name='xxx')#使用关键字调用
    myfunc('hanmin',phone=110,addr='beijing',qq='5345355',email='134@163.com')#第一个用的位置参数,剩下的是关键字参数
    #myfunc('哈哈哈',addr='beijing','qqq',email='134@163.com',name='xxx')#此种方法错误,关键字参数后面不能再用位置参数
    
    def myfunc1(name,addr='beijing',*args):
        # print(name,addr,args)
        print('name:',name)
        print('addr:',addr)
        print('args:',args)
    
    myfunc1('xiaohei','xiaobai')#xiaobai给了addr args为()
    # myfunc1('xiaohei',addr='shanghai',args=(1,2,3))#错误,使用关键字调用,args无法传值
    myfunc1('xiaohei','shanghai','hhh','bbb')#args:('hhh', 'bbb')
    
    def myfunc2(name,addr='beijing',**kwargs):
        print('name',name)
        print('addr',addr)
        print('kwargs',kwargs)
    
    myfunc2(name='xiaobai',addr='shanghai',age=18,sex='nv')#kwargs: {'age': 18, 'sex': 'nv'}
    
    
    def myfunc3(name,addr='beijing',*args,**kwargs):
        print('name:',name)
        print('addr:',addr)
        print('args:',args)
        print('kwargs:',kwargs)
    
    myfunc3(name='xiaohei',addr='shanghai',age=18,sex='nv')#k=v形式的会传给kwargs   args: ()   kwargs: {'age': 18, 'sex': 'nv'}
    myfunc3('xiaohei','chengdu','chongqing',country='china')#chongqing传给args;country='china'传给kwargs   args: ('chongqing',) kwargs: {'country': 'china'}

    二、全局变量、局部变量 

    1、全局变量:
    大家都可以用的变量就是全局变量
    不可变的数据类型是全局变量的话,必须得加global:
    int(整型) str(字符串) tuple(元组)
    可变的数据类型是全局变量的话,不需要加global:
    dict(字典) list(列表) set(集合)
      全局变量一般定义在最上面,尽量少用全局变量,会占内存,不安全

    2、局部变量: 函数里面定义的变量都是局部变量,出了函数后无法使用
    language = 'Python'#全局变量
    
    
    def hello():
        language='Java'#局部变量,作用域在函数里面
        print(language)
    
    hello() #结果取局部变量Java
    
    def xiaobai():
        print(language)
    xiaobai() # 结果仍取全局变量Python
    
    def change():
        global language #修改全局变量
        language = 'C#'
        print(language)
    
    change() #结果取修改后的全局变量 C#

    (1)参数传递一个正确的例子:

    money=500
    def test(consume):
        return money - consume
    
    
    def test1(money):
        return test(money) + money
    
    money = test1(money)
    print(money)#结果为500

    (2)参数传递一个错误的例子:

    def test():
        global a
        a = 5
    
    def test1():
        c = a + 5
        return c
    # 若想执行正确则在此处加test()
    res = test1()
    print(res)

    函数需要先调用才能执行

  • 相关阅读:
    logistic regression svm hinge loss
    matlab
    deep learning学习记录三
    deep learning学习记录二
    JavaScript自定义方法实现trim()、Ltrim()、Rtrim()
    php 用户验证的简单示例
    php用户验证代码的简单例子
    php验证复选框的小例子
    二招解决php乱码问题
    PHP页面中文乱码分析
  • 原文地址:https://www.cnblogs.com/candysalty/p/11050863.html
Copyright © 2011-2022 走看看