• python函数调用的四种方式 --基础重点


    第一种:参数按顺序从第一个参数往后排#标准调用

    # -*- coding: UTF-8 -*-  
    def normal_invoke(x, y):  
        print "--normal_invoke:--"  
        print "x is %d" %x  
        print "y is %d" %y 
    #标准调用  
    normal_invoke(1, 2)  

    运行结果:

    --normal_invoke:--  
    x is 1  
    y is 2  

     

    第二种:#关键字调用  

    def keyword_invoke(x, y):  
        print "--keyword_invoke--:"  
        print "x is %d" % x  
        print "y is %d" % y 

    #关键字调用  
    keyword_invoke(y=1, x=2) 
    注意:关键调用从哪开始的,从哪以后都必须使用关键字调用除了‘*’收集参数。不能写成这样的:keyword_invoke(y=1, 2),这样就会报错。

    运行结果:

    --keyword_invoke--:  
    x is 2  
    y is 1

     

    第三种:#非关键字可变长参数(tuple) def normal_tuple_invoke(x, y=2, *values):  

    print "--normal_tuple_invoke--"  
        print "x is %d" % x  
        print "y is %d" % y  
        for value in values:  
            print "tuple's value has", value

    #非关键字可变长参数(tuple)  

     normal_tuple_invoke(1, 3, 'xyz', 123.4) 

    注意:收集参数  ‘*’当你参数不确定有多少是你可是使用它,他会把不确定的部分存在values元组中,当然这个元组名字要看‘*’后面跟的是啥了。

    运行结果:

    --normal_tuple_invoke--  
    x is 1  
    y is 3  
    tuple's value has xyz  
    tuple's value has 123.4  

    第四种:#关键字可变长参数(dict) 

    def keyword_dict_invoke(x, y=2, **value_dict):  
        print "--keyword_dict_invoke--"  
        print "x is %d" % x  
        print "y is %d" % y  
        for key in value_dict:  
            print "key is ", key  
            print "value is ", value_dict[key] 

    #关键字可变长参数(dict)  

     keyword_dict_invoke(y=1, x=2, arg2='def', arg1='put at the last') 

    注意:**value_dict 传回来的参数以字典:key-value的形式存放,单招顺序首先传回来的是:key,其次是:value。

    运行结果:

    --keyword_dict_invoke--  
    x is 2  
    y is 1  
    key is  arg1  
    value is  put at the last  
    key is  arg2  
    value is  def  
      
    Process finished with exit code 0  

    第五中:还有一种是以整个函数为参数传回来,目前我知道是装饰器在使用

    装饰器实际上就是为了给某程序增添功能,但该程序已经上线或已经被使用,那么就不能大批量的修改源代码,这样是不科学的也是不现实的,因为就产生了装饰器,使得其满足:

    1. 不能修改被装饰的函数的源代码
    2. 不能修改被装饰的函数的调用方式
    3. 满足1、2的情况下给程序增添功能

    那么根据需求,同时满足了这三点原则,这才是我们的目的。因为,下面我们从解决这三点原则入手来理解装饰器。

    等等,我要在需求之前先说装饰器的原则组成:

    < 函数+实参高阶函数+返回值高阶函数+嵌套函数+语法糖 = 装饰器 >

    这个式子是贯穿装饰器的灵魂所在!

    improt time
    
    def test():
        time.sleep(2)
        print("test is running!")
    
    def deco(func):  
        start = time.time()
        func() #2
        stop = time.time()
        print(stop-start)
    
    deco(test) #1

    我们来看一下这段代码,在#1处,我们把test当作实参传递给形参func,即func=test。注意,这里传递的是地址,也就是此时func也指向了之前test所定义的那个函数体,可以说在deco()内部,func就是test。在#2处,把函数名后面加上括号,就是对函数的调用(执行它)。因此,这段代码运行结果是:

    test is running! 
    the run time is 3.0009405612945557

    关于装饰器我在另一篇文章中有详细解释!

     

     

    ---每天进步一点点!!!

     

  • 相关阅读:
    Mycat分布式数据库&.NET链接mysql
    MySQL安装
    Apache 安装配置及开启PHP模块支持
    XSS MSMQ FASTDFS RABBITMQ
    json表单回填(表单反序列化回填值)
    解决80端口被占用
    Oracle for .net & ServiceStack.OrmLite
    MBTiles 离线地图演示
    Java网络编程TCP程序,服务器和客户机交互流程以及基本操作步骤。
    如何使用和理解java的反射机制
  • 原文地址:https://www.cnblogs.com/insane-Mr-Li/p/9062802.html
Copyright © 2020-2023  润新知