0 引子
这是一篇基础复习文档, 在写 python 脚本的时候, 确实感觉到 python 基础不扎实导致代码在运行时, 老是出现一些基础性的错误。因此决定接下来的一段时间对 python 的基础知识进行学习和巩固。
注意: 由于 python2 将会在不久之后失去支持, 官方也更推荐学 python3, 因此以下所有的知识点都是在 python3 上进行实践与学习。以下的 python 都可以默认为是 python3, 如果提到 python2 我会表明是 python2。
这篇是对python基础函数操作中的函数参数进行学习。
1 参数
python 中函数的定义与调用都非常简单, 但是 python 中函数的参数确非常有趣。先来看一个正常的例子。
如上图所示, 这是一个最基本的函数定义模式, 它定义了一个求和函数 funA, 该函数的功能就是把传入的参数 a 与 b 相加并将它们的和返回。在 python 中还有其他的参数定义玩法能实现这样的功能。
默认参数
python 中有一种默认参数, 在调用含默认参数的函数时, 可以不给默认参数传值, 这时候默认参数就会取默认值。如定义的带默认参数的 funB 函数, 要调用这个函数只需要传入一个参数 a 即可,该函数则能返给你 a 与 b 的默认值即 1 的和。
默认参数的设置简化了函数的调用, 如果一个函数定义了多个参数, 而大部分参数都是值都是在每次调用时都不会有改动, 那么就将这些参数设置为默认参数。当需要修改默认参数的值时, 也只需要使用正常调用函数的方式将两个参数都传递即可。
默认参数虽然使用方便, 但是也有坑需要注意。
funC 函数中, 定义了一个默认参数 L, 它是一个空列表, 当调用这个函数的时候, 会自动往列表中添加一个字符串「T」,并打印 L 。调用一下函数查看结果。
可以看到, 第一次调用时, 结果和最初预测的一样, 但是第二次调用时的结果就和第一次不同了。
这是由于在函数定义时, 默认参数已经确定了是变量 L, 最开始 L 指向的是一个空列表, 在第一次调用 funC 结束后, L 指向的空列表已经发生了变化, 而此时默认参数还是 L 不变, 因此在第二次调用时, 默认参数即为第一次调用的结果。造成这种情况的原因就是由于列表是可变的, 每一次的调用都会改变列表的数据。若要每次调用的时候结果相同, 默认参数应该选择不可变对象例如 str 等作为参数默认值, 这样不论如何调用, 参数的默认值都不会改变。
可变参数
可变参数指的是传入的参数个数是可变的, 调用 funD 可以传入任何个数的参数,传入的参数会被封装成一个 tuple, 最终函数会将所有参数的和作为返回值。
这种定义形式, 其实和定义一个参数为 tuple 类型的函数相似, 通过传入一个 tuple 参数, 计算 tuple 元素的值并返回。
funE 与 funD 最终都是计算出传入参数的和值, 但是它们之间还是有区别的。funD 接收了 4 个参数,而 funE 接收的是一个参数。使用可变参数在调用时也不需要将参数封装成 tuple, 直接传入即可。而且既然 funD 是可变参数, 所以它也支持参数个数为 0 的情况, 但是 funE 则不能不传参数, 要实现参数为 0 的情况的结果, 需要传入一个空 tuple。
如果已经存在了一个 tuple, 并且把 tuple 直接作为参数传给 funD 并结算出 tuple 元素之和。
关键字参数
可变参数将传入的多个参数封装成一个 tuple, 而关键字参数将多个参数封装成一个 dict。
和可变参数类似, 如果想将一个 dict 变量作为参数传入。
命名关键字参数
使用关键字参数时, 可以传递任意键值, 如果想对传入的参数做限制, 指定只能传入部分参数, 就需要用到命名关键字参数。
funG 中指定只能传入 test, 传入其他参数时就会报错。命名关键字参数用「*」与其他参数分隔。
如果参数中包含了一个可变参数, 那么就不需要额外使用「*」。
可能你还想读
领取专属 10元无门槛券
私享最新 技术干货