关于 Python 函数(方法)的冷知识

本贴最后更新于 324 天前,其中的信息可能已经事过境迁

关于参数标识

不知道大家在工作中有没有遇到一种情况,你的同事A写了一个方法给你调用,然后你调用时不知道该传什么参数,然后这个同事A还很cao dan的居然不加班!你一脸茫然的看着这个方法,当你尝试传进去一个abc,结果代码就报错了,此时此刻你是不是很苦恼、很想把你同事A暴打一顿逼问他这个方法到底该传个啥进去?

那么有没有办法解决这个问题呢?答案就是让你的同事在参数上标识出参数期望接收的值是啥,代码如下:

def fun(a: list):
    pass

通过在a参数后面跟上: list可以标识出a参数期望传入一个list类型,相当于给a参数写了一个注释。

不过,在实际工作中更多的是用来标识自定义类的名称(如下图),这样标识出来,别人在调用你这个方法时就知道该传个什么东西进去了。

image.png

另外,如果你就是不听话,非得瞎传,那会怎样呢?

答案是不会怎样,因为这个标识并没有强限制,你瞎传进去本身并不会报错(只有当程序运行到要使用这个参数时,才可能会报错。),但如果你用的是Pychram写代码,那大概率会给你提示的传参类型不对的警告:

image.png

另外,参数标识还有一个好处,特别是依赖编译器提示的同学。比如下面的函数,我函数的功能是删除传进来的列表地一个值,但是我又忘记了list内置的删除方法是怎么写的了,那就可以通过将参数a标识为list,然后pychram就能知道参数a应该是个list,就可以给你提供代码提示了:

image.png

关于标识返回类型

又回到刚刚那个场景,自从暴打一顿同事A之后,我知道了他写的方法该怎么传参之后,问题又来了,那这个方法返回个啥呢?难道要自己运行一下代码,再打印type去看吗?这显然也不合理!(别问哪里不合理,反正我就是这么任性,把同事A再打一顿....)

然后,同事A默默的在函数名称后面加上了一句话,就解决了这个事情:

image.png

就是后面的-> list这里的意思就是标识出fun函数会返回一个list,然后返回标识和参数标识其实都是差不多的用法,也可以返回自定义类。

关于函数的占位符

pass... 都是函数的占位符,多数情况下是用来类中,当类的某个方法目前还未实现或者需要子类重写时,就可以用pass或者...来先占位,两者效果是一样的。

image.png

关于限制传参方式

某天,我写了一个方法,方法的参数有很多,同事A这个傻子在调用我的方法时,代码一直报错,查了很久,结果发现是他传参数的顺序错了,在我暴打他一顿之后,当机立断强制要求调用我的方法时必须通过关键字参数传参,这样就可以避免参数位置错误的情况。

通过在参数前一个位置加上一个 * 号,就可以强制规定 * 号后的所有参数都只能通过关键字参数传参,否则会报错, 使用时要注意别和*agr**kwarg的使用搞混了

image.png

image.png

然后在某一天,我突然想给同事A搞点事情(好孩子不要学),我把参数中的 * 号删除了,但我在最后一个位置加上了一个/,强制改为只能通过位置参数传参。

image.png

总结一下,* 代表是*后的所有参数都必须通过关键字参数传参,而/则是/前的所有参数都必须通过位置参数传参,因此在使用时要注意位置不要写错了。

image.png

回帖
请输入回帖内容 ...