函数的参数算法
总结一下这几种参数先: 原本位置是默认滴,后来不知咋地可变了,位置上还用关键字这么上档次的名字命名关键字了。先讲讲废话:咱们作接口自动化或者其它测试,总之须要使用一些参数的时候,咱们做为函数的调用者,无需了解太多,你只须要肤浅的知道如何如何滴传递准确无误的参数以及知道函数将返回什么值便可,这样就能够完美的完成工做了,至于那些内部复杂的逻辑被封装起来了,做为调用者暂时就不考虑啦。函数
(1) 位置参数:顾名思义就是排排坐,按位置赋值就这么简单。测试
先计算X三次方的值:下面对于power()函数而言,参数x就是位置参数,但有且仅能传入一个参数,传入过多就是做死的行为了。
若是要计算X的n次方,就要传入两个参数了,只要对应位置便可
默认参数:做用就是简化函数的调用,也有须要当心的地方spa
(1) 必选参数必须在前,默认参数在后;
(2) 有较多参数摆在面前时,变化较大参数在前,变化较小的在后并做为默认参数;
好比传入记录信息的函数,须要传入author、tel两个参数对象
这时调用report()函数后输入两个参数值便可
固然两个参数的对于那些登陆的帐号、密码这操做彻底没问题,但若是是一些表单须要填入住址、电话、婚史、收入等信息,那后期调用函数的复杂度大大增长,因此咱们就能够靠默认函数把信息不大变更的参数设置为默认值再进行调用抛砖引玉一番:把地址和收入设置为默认参数blog
如果与咱们设置的默认参数不符合,只能本身动动手指添加对应的额外信息啦。
默认参数这家伙仍是有点点瑕疵的,默认参数必须必定以及确定得指向不可变对象。 如今用典型的list来举个例子(由于这家伙内容可变)
下面这是老掉牙的正常调用了,结果没毛病接口
再用默认参数调用三次,看结果就惊呆了,每次出来的结果都记住了上次的内容,这就很尴尬了。
缘由在于L列表是一个变量并指向[],每调用一次函数就会改变[]里的内容(上面提过了这里的内容是可变的),下次再调用的时候,默认参数里的内容就刷的一下改变了,因此才会处出现上面尴尬的场景。有矛就有盾:使用None/str等这些不可变对象来解决问题,使用这些不可变对象能够大大滴下降修改数据致使的错误,更重要的是在多任务环境的状况下,对象不变,同时读取对象就不须要加锁,也不会出现问题。ip
写完这顽固不化的默认参数,就轮到灵活多变的可变参数上场了。内存
(2)可变参数:字面上的意思,想要多少个就多少个(0到任意个)只须要在参数前面加个*就能够轻松搞定啦,来点干货:定义一个函数,输入任意个参数,返回参数数值之和除以字符数的结果。get
(3)如今能够坐下来谈谈关键字参数啦讲这个以前先了解一下Python内置字典dict,使用键-值(key-value)进行存储,主要是用来查到内容,讲到查找就会不自觉的想起咱们以前相亲相爱的list了。
假设说阿里的员工有几万人,你要从中查找一我的所对应的工资,那咱们就要先从names中,查找出这我的的名字的位置,而后工资salary中取出相应的工资,这种方式会由于list元素的增长致使查找时间延长;若是用咱们机智的dict,直接用就能够用名字查找工资,尽管这个表有三千尺,查找速度也是丝绝不会耽搁。
真枪实弹才是真理:
这玩意就像字典同样能够根据条件查找,也能够收集新的东西进去。
而且dict只有一对一的节奏,不带多对一的形式(key-value)
字典嘛确定不可能全部东西都能查出来滴,一旦查不出来就得报错了,因此咱们就要经过一些手段来判断这个key存不存在了。
(1) 使用dict提供的get()方法判断key是否存在以及判断后返回的内容;
(2) 删除dict中的一个key就使用pop(key)方法。
好了这个半路杀出的程咬金就讲到这里,小小的总结一波;
(1) 首先要知道为甚么list查找的速度会比dict慢的多,就是你拿着字典为了找个字一种是一页一页翻着找,另外一种是经过偏旁部首去找,显而易见确定后者更快,因此说list查找和插入的速度,不会由于key贼多就变慢;(2) 有利就有弊,虽然list在查找和插入的速度方面不讨喜,可是人家占用的空间少那内存基本上就不会浪费了,而dict就是利用空间来换取时间的作法,极其可耻的浪费了极多内存;
(3) 还要注意的是dict中的key必须是不可变对象、不可变对象、不可变对象;
(4) 这个经过key准确计算位置的算法就叫:(Hash)哈希算法。
下面步入正轨
所谓的关键字参数呢就是容许你能够传入0-N个含参数名的参数(其中还可写入必选参数),而且这些关键字参数会很自觉的组装成刚刚咱们所讲的dict
这跟可变参数就是一个 和两个*的区别。
(5)最后一波进攻:命名关键字参数
(若是传入的参数过多,而在调用的时候不须要所有使用就中间插入一个*,后面的参数就是你要调用的,至于前面的就让他们放飞自我了)
> 要注意的是
(1)使用命名关键字参数必需要传入参数名,不然就得炸了。
(2)若是函数定义中已经有一个可变参数了,后面的命名关键字参数就不须要分隔符*了。
下面来个对比操做就一目了然了
直接对*后的参数赋值就会报错。
来个大杂烩例子: