今天继续分享关于函数必须知道的内容。
五、返回值
函数只能有一个返回值,若是需要返回多个值,可以使用列表,字典,或者元组实现。注意,像元组这种一次返回多个值在其他语言中是不可想象的。
1.‘多个’返回值
如果我想在利用函数校验时,希望可以将校验的结果,以及提示信息同时返回回来,该如何:
执行结果:
2.两个一致性
编写函数时,若是有返回值,尽量做到每个分支结束都有返回值,若是有返回值,要做到每个分支的返回值类型一致,这样利于维护,减少代码调用函数时处理发生错误的几率。作为灵活的python函数,可以判断返回数据,也可以不返回,同时也可以返回的类型不一样,不过这样给自己过大的自由,那么你下面的代码可能会不轻松。别人代码记一条规则,你可能一个函数多条规则,用你的函数太累。其实这种蠢爆了,就当这种特权你不享有就好了。
3.文档化函数
Python开篇我们就提过优秀的代码注释占比60~70,而我们的函数一般是要多次使用,甚至跨模块使用的,那么没有注释显然是要命的,那么我们在源码里的注释,哪些可以北调用者调用的时候获取呢?显然不能每次使用都看源码对吧,我们来看看:
>>> abs.doc
'Return the absolute value of the argument.'
可以查看对应的信息,那么我们如何让我们的函数成为文档化的函数呢?
执行结果:
以后对类文档化,也是一样的,不过就是在类内部使用文档注释。
六、百变形参
python中的函数形参灵活多变,为了便于讲解,分为位置参数、默认值参数、可变参数、关键字参数和强制关键字参数,这些参数可以组合使用,真是千变万化。下面的函数你都知道调用,那千变万化的技能你就get到了。
1.关键字参数与默认值
之前所有使用的参数都是位置参数,由于他们的位置很重要,比形参的名字还重要。关键字参数可以规避位置问题。记住多个参数的顺序是显然是不容易的,为了减少因为记错顺序而错误传值的问题,我们可以按形参参数名称传值。关键字参数使用key-value的形式进行传递。
上面这种使用变量名传参的方式就是关键字参数。
虽然调用时要多打一些,但是每个参数的含义更加清晰。
默认值参数,为一些不经常改变的参数设默认值,这样使用更方便,同时也提供自定义的可能,重要的是降低了对一般用户使用的难度。
注意:若是参数同时有位置参数和默认值参数,则默认值参数要在最后,位置参数要在前面。
注意:由于默认值参数仅仅在函数第一次使用默认值时开辟空间,在多次使用默认值时,可能造成意外结果,因为当默认值参数为可变类型时,建议可变默认值设为None。
结果为:
修改为:
执行结果:
不可变数据类型的默认参数没有任何需要担忧的。
2.收集参数
为用户提供任意个参数是很有用的,那么该如何收集这任意个参数,就是可变参数了。如:
执行结果:
结果为元组,那么,至于如何取得每个值,就按操作元组的方式就可以了。
那可变参数和普通的位置参数联合使用。
执行结果:
那如何收集多个关键字参数呢,尝试了你会发现args不能收集关键字参数,我们需要使用*来收集可变关键字参数。
执行结果:
收集可变关键字参数得到的是字典。
3.参数的组合
在开发过程中,可以将位置参数、关键字参数和可变参数任意组合使用,组合的顺序是位置参数、可变参数,关键字可变参数,默认值参数放在最后。不是每次都需要写所有的参数,保证这个顺序就可以了。
执行结果:
4.参数收集的逆过程
也就是拆箱(解包裹),在传递实参时,将序列或者字典数据拆封,按位置和关键字传递给形参的过程。
a、位置传递 *
当我们的传入的实参为一个列表或者元组之类的序列,通过*就可以解包,这种方式不仅仅可以用在可变参数,也可以在列元素数量与形参数量一致时也可以使用:
b、关键字传递 **
想要将字典数据作为实参传递给位置参数或者是关键字参数就可以使用**dict解包,不仅仅可以可变关键字参数可以使用,只要普通参数名称与字典的key对应上也可以使用。
执行结果:
来看看给非可变关键字参数传参:
执行结果:
5.强制关键字参数和强制位置参数(了解)
在调用函数时,强制使用关键字传递参数,在参数中间加入 * ,这个位置后面的参数就要求必须使用关键字传参。*不占位,仅做说明而已。
在函数中形参*args后面的参数,也是强制关键字参数。
可能有同学通过help查看某个函数时,发现形参中有/斜杠,传参也不占位,其他它是强制位置参数,也就是说斜杠前边的参数必须通过位置传值。我们查看一下object的init方法,得到如下的说明:
注意这种为系统内部使用的/,我们自定义函数不能使用,仅做了解。
接下来,今日视频奉上:
函数的返回值
函数的参数
领取专属 10元无门槛券
私享最新 技术干货