0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python 简化函数调用的3种技巧

科技绿洲 来源:Python实用宝典 作者:Python实用宝典 2023-11-01 16:20 次阅读

假设有一个函数,这个函数需要接收4个参数,并返回这4个参数的和:

def sum_four(a, b, c, d):
  return a + 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 (most recent call last):
  File "< stdin >", line 1, in < module >
TypeError: sum_four() missing 3 required positional arguments: 'b', 'c', and 'd'

怎么解决?

方案1: itertools.starmap

可以使用 itertools 的函数 starmap 替换Map.

它与Map不同,允许接受一个元组作为传入sum_four的参数。

>> > import itertools
 >> > list(itertools.starmap(sum_four, [(1, 2, 3, 4)]))
[10]

非常棒,这样的话,上述问题就可以使用starmap函数解决:

>> > import itertools

 >> > ds = [1, 2, 3, 4]

 >> > items = ((a, b, c, d) for d in ds)

 >> > list(items)
 [(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 过大导致内存消耗量过大。平时开发的时候注意这些细节,能够使你和普通的开发者拉开差距。

方案2: functools.partial

第二种解决方案是使用 partial 函数固定前三个参数。

根据文档,partial将“冻结”函数的参数的某些部分,从而生成简化版的函数。

因此上述问题的解决方案就是:

>> > import functools
 >> > 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]

方案3: itertools.repeat()

事实上,Map 函数是允许传递可迭代参数的,但是有一个有趣的特点,他会用每个可迭代对象里的项作为传入函数的不同参数。这样说可能太过于抽象了,来看看实际的例子:

> >> 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 函数会在最短的可迭代对象被迭代完后,就会自动停止运行。

结合这两个特点,上述问题的解决方案就出来了:

>> > import itertools
 >> > list(map(sum_four, itertools.repeat(a), itertools.repeat(b), itertools.repeat(c), ds))
 [7, 8, 9, 10]

这招非常巧妙,缺点是能读懂的人不多。不过没关系,计算机世界中某些东西知道就好,你并不一定需要去使用它。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 参数
    +关注

    关注

    11

    文章

    1835

    浏览量

    32227
  • 函数
    +关注

    关注

    3

    文章

    4331

    浏览量

    62629
  • python
    +关注

    关注

    56

    文章

    4797

    浏览量

    84694
  • 数组
    +关注

    关注

    1

    文章

    417

    浏览量

    25947
收藏 人收藏

    评论

    相关推荐

    一文详解python调用函数

    函数被定义后,本身是不会自动执行的,只有在被调用后,函数才会被执行,得到相应的结果。但是在 Python 中我们要注意一个关键点,就是Python
    发表于 10-01 10:45 686次阅读

    快速掌握Python的递归函数与匿名函数调用

    函数Python技术学习中重要的一个环节,深入掌握该阶段的知识内容,对于Python技术能力的提升非常有帮助,这里就针对递归函数与匿名函数
    发表于 07-19 16:22

    python普通函数创建与调用

    python普通函数创建与调用函数是一仅在调用时运行的代码块。您可以将数据(称为参数)传递到
    发表于 03-01 16:32

    Python函数装饰器使用方法

    Python中的装饰器是一可以装饰其它对象的工具,简单地说,他们是修改其他函数的功能的函数。该工具本质上是一个可调用的对象(callabl
    的头像 发表于 01-21 11:36 1590次阅读
    <b class='flag-5'>Python</b>的<b class='flag-5'>函数</b>装饰器使用方法

    详解python普通函数创建与调用

    函数是一仅在调用时运行的代码块。您可以将数据(称为参数)传递到函数中,然后由函数可以把数据作为结果返回。
    的头像 发表于 03-01 16:32 1866次阅读

    简述python类实例及构造函数基础

    假设,I2.w通过属性继承搜索:I2-C1-C2-C3-C3.w,找到C3.w。 那么,I2.w为函数时,表示调用C3.w
    的头像 发表于 02-21 11:23 731次阅读

    Python入门之什么是函数

    Python函数比我们想象的更为灵活。由于Python函数是对象,所以函数对象可以赋值给其他的名字、传递给其他
    的头像 发表于 02-21 14:24 507次阅读

    Python支持递归函数

    Python支持递归函数——即直接或间接地调用自身以进行循环的函数。递归是颇为高级的话题,并且它在Python中相对少见。然而,它是一项应该
    的头像 发表于 02-21 14:28 651次阅读

    什么是函数调用

    函数调用,就是使用我们已经定义好的函数,或者C语言自带的库函数
    的头像 发表于 04-04 17:21 5858次阅读

    python定义函数调用函数的顺序

    定义函数调用函数的顺序 函数被定义后,本身是不会自动执行的,只有在被调用后,函数才会被执行,得
    的头像 发表于 10-04 17:17 1407次阅读

    python函数函数之间的调用

    函数函数之间的调用 3.1 第一情况 程序代码如下: def x ( f ): def y (): print ( 1 ) return y def f (): print ( 2
    的头像 发表于 10-04 17:17 597次阅读

    Python 函数参数分类

    文章应该对你会有不小的帮助。 接下来是正文。 1. 参数分类 函数,在定义的时候,可以有参数的,也可以没有参数。 从函数定义的角度来看,参数可以分为两: 必选参数 :调用
    的头像 发表于 10-21 10:45 804次阅读

    Python调用JS的 4 方式

    Python 实现 本文将聊聊利用 Python 调用 JS 的4方式 2. 准备 以一段简单的 JS 脚本为例,将代码写入到文件中 //norm.js //计算两个数的和 fu
    的头像 发表于 10-30 09:41 719次阅读

    python调用math函数的方法

    中。本文将详细介绍math模块中的各种数学函数调用方法,包括函数的功能、参数的使用和返回值的含义等方面,以帮助读者更好地理解和应用这些函数。 一、导入math模块 要使用math模块
    的头像 发表于 11-22 11:01 3002次阅读

    python调用windows命令

    Python是一强大的编程语言,可以用于开发各种不同类型的应用程序。其中一个常见的用途是使用Python调用Windows命令来执行特定的任务。在本文中,我们将详细讨论如何使用
    的头像 发表于 11-29 14:34 1054次阅读