当前位置: 首页 > 后端技术 > Python

Python中简化函数调用的三种技巧

时间:2023-03-25 21:58:57 Python

假设有一个函数需要接收4个参数并返回这4个参数的和:`defsum_four(a,b,c,d):``returna+b+c+d`如果需要固定最后三个参数,只改变最后一个参数的值,可能需要这样调用:`>>>a,b,c=1,2,3``>>>>sum_four(a=a,b=b,c=c,d=1)``7``>>>sum_four(a=a,b=b,c=c,d=2)``8``>>>sum_four(a=a,b=b,c=c,d=3)``9``>>>sum_four(a=a,b=b,c=c,d=4)``10`这种写法太丑了。如果使用Map功能,能不能简化代码?答案是肯定的,但是Map函数[通常]只能接受单个元素。如果强行使用,会报这样的错误:`>>>list(map(sum_four,[(1,2,3,4)]))``traceback(mostrecentcalllast):``file"",line1,in``TypeError:sum_four()missing3requiredpositionalarguments:'b','c',and'd'`如何解决?方案一:itertools.starmap可以使用itertools的starmap函数来代替Map。它与Map不同,允许接受一个元组作为传递给sum\_four的参数。`>>>importitertools``>>>list(itertools.starmap(sum_four,[(1,2,3,4)]))``[10]`很棒,这样上面的问题就可以用starmap函数解决方案:`>>>importitertools``>>>ds=[1,2,3,4]``>>>items=((a,b,c,d)fordinds)``>>>列表(项目)`[(1,2,3,1),(1,2,3,2),(1,2,3,3),(1,2,3,4)]``>>>list(itertools.starmap(sum_four,items))``[7,8,9,10]`请注意,items是一个生成器,这是为了避免items过大导致内存消耗过多。在开发的时候注意这些细节,通常可以让你和普通开发者拉开差距。方案二:functools.partial方案二是使用partial函数固定前三个参数。根据文档,partial将“冻结”函数参数的一部分,从而生成函数的简化版本。所以上面问题的解决方法是:`>>>importfunctools``>>>partial_sum_four=functools.partial(sum_four,a,b,c)``>>>partial_sum_four(3)``9``>>>#这样可以使用map函数:``>>>list(map(partial_sum_four,ds))``[7,8,9,10]`方案三:itertools.repeat()其实,Map函数是允许传递Iterable参数的,但是有一个很有意思的特点就是他会把每一个iterable对象中的item作为不同的参数传递给函数。这可能太抽象了,让我们看一下实际的例子:`>>>list(map(sum_four,[1,1,1,1],[2,2,2,2],[3,3,3,3],[1,2,3,4]))``[7,8,9,10]`很明显,每次都是使用不同数组中对应的下标项进行计算。这样,我们就可以利用这个特性进行优化。itertools.repeat()函数可以根据参数生成一个迭代器,它一次又一次地返回对象。如果不指定times参数,它将无限期地运行。Map函数会在最短的可迭代对象迭代完后自动停止运行。结合这两个特性,上面问题的解决方案就出来了:`>>>importitertools``>>>list(map(sum_four,itertools.repeat(a),itertools.repeat(b),itertools.repeat(c),ds))``[7,8,9,10]`这一招很巧妙,缺点是能看懂的人不多。不过没关系,懂点计算机世界的东西就好,不一定非要用到。比如本文中的这些解决方案,在日常工作中一般不会用到,所以不需要死记硬背,但是你??需要知道【有这样的问题】和【有这些解决方案】,以防万一遇到类似的问题场景,可以回忆这篇文章,快速找到解决方案。这是我们文章的结尾。如果喜欢今天的Python实战教程,请继续关注Python实战宝典。有问题可以在公众号后台回复:进群,回答对应的红字验证信息,进入互助群提问。原创不易,希望大家能在下方点赞观看支持我继续创作,谢谢!点击下方阅读原文,更好的阅读体验Python实战宝典(pythondict.com)不只是合集欢迎关注公众号:Python实战宝典