第一种:参数按顺序从第一个参数往后排#标准调用
![e67f89f85cbc313acee4c7cfb2cee8f0.png](https://i-blog.csdnimg.cn/blog_migrate/eb7a77ac08945cdf338cf3cec7c4e5f3.jpeg)
运行结果:
![21b9e21c1f45fc3f9f0d3be09d331847.png](https://i-blog.csdnimg.cn/blog_migrate/16389e33e41c753d4030e2393964fece.jpeg)
第二种:#关键字调用
![bc0cf1652bdd9ef586826127d88ab2ef.png](https://i-blog.csdnimg.cn/blog_migrate/c9235ed90bf5e3f21cefdcaa10b6bbbb.jpeg)
注意:关键调用从哪开始的,从哪以后都必须使用关键字调用除了‘*’收集参数。不能写成这样的:keyword_invoke(y=1, 2),这样就会报错。
运行结果:
![4473e8d06d30a16c775f55524d4690e1.png](https://i-blog.csdnimg.cn/blog_migrate/1b533a102f46d78c73cf5c8c2ce8282a.jpeg)
第三种:#非关键字可变长参数(tuple) def normal_tuple_invoke(x, y=2, *values):
![4b6ff4a89933629648adfbe3e26e14a7.png](https://i-blog.csdnimg.cn/blog_migrate/179e2e20c19b21511637554ebf4ce4a9.jpeg)
注意:收集参数 ‘’当你参数不确定有多少是你可是使用它,他会把不确定的部分存在values元组中,当然这个元组名字要看‘’后面跟的是啥了。
运行结果:
![83fd1660f0a67692a53b1e3e14b62c71.png](https://i-blog.csdnimg.cn/blog_migrate/2f5c4ac565bc4c850e56f92a068db086.jpeg)
第四种:#关键字可变长参数(dict)
![1e5ba3b232e9b7900f4f74d9df854c31.png](https://i-blog.csdnimg.cn/blog_migrate/03025f86be805acc329f38173510dbd0.jpeg)
注意:**value_dict 传回来的参数以字典:key-value的形式存放,单招顺序首先传回来的是:key,其次是:value。
运行结果:
![650712c445a4ebbbda9eabe9ec52d7c3.png](https://i-blog.csdnimg.cn/blog_migrate/5540f0d121e770941f756c65b8eb791d.jpeg)
第五中:还有一种是以整个函数为参数传回来,目前我知道是装饰器在使用
装饰器实际上就是为了给某程序增添功能,但该程序已经上线或已经被使用,那么就不能大批量的修改源代码,这样是不科学的也是不现实的,因为就产生了装饰器,使得其满足:
- 不能修改被装饰的函数的源代码
- 不能修改被装饰的函数的调用方式
- 满足1、2的情况下给程序增添功能
那么根据需求,同时满足了这三点原则,这才是我们的目的。因为,下面我们从解决这三点原则入手来理解装饰器。
等等,我要在需求之前先说装饰器的原则组成:
< 函数+实参高阶函数+返回值高阶函数+嵌套函数+语法糖 = 装饰器 >
这个式子是贯穿装饰器的灵魂所在!
![1ebd0192735d9fd6b86ecbafc0317a4d.png](https://i-blog.csdnimg.cn/blog_migrate/a8625c2c88c6fb301d4d20d7b5833647.jpeg)
我们来看一下这段代码,在#1处,我们把test当作实参传递给形参func,即func=test。注意,这里传递的是地址,也就是此时func也指向了之前test所定义的那个函数体,可以说在deco()内部,func就是test。在#2处,把函数名后面加上括号,就是对函数的调用(执行它)。因此,这段代码运行结果是:
![99b452af1593366d1d58b248c19c4076.png](https://i-blog.csdnimg.cn/blog_migrate/8e3e3d7fc86160ecac098eea81aaff76.png)