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

博客围绕Python中函数需固定前三个参数、仅改变最后一个参数值的问题展开。介绍了三种解决方案,分别是用itertools.starmap替换Map函数、使用functools.partial固定前三个参数、结合itertools.repeat()和Map函数的特点进行优化,文末还分享了Python代码速查表和Pycharm快捷键图。

假设有一个函数,这个函数需要接收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]

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

比如本文中的这几种解决方案,日常生活工作中一般用不到,所以你不需要死记硬背,但你需要知道【有这样的问题】和【有这些解决方案】,万一遇到了相似的场景,你就可以回忆起这篇文章并快速找到解决的方法。

文末福利

各位猿们,还在为记不住API发愁吗,哈哈哈,最近发现了国外大师整理了一份Python代码速查表和Pycharm快捷键sheet,火爆国外,这里分享给大家。

这个是一份Python代码速查表

下面的宝藏图片是2张(windows && Mac)高清的PyCharm快捷键一览图

怎样获取呢?可以添加我们的AI派团队的程序媛姐姐

一定要备注【高清图】

????????????????????

➕我们的程序媛小姐姐微信要记得备注【高清图】

来都来了,喜欢的话就请分享点赞在看三连再走吧~~~

### Python中for循环调用函数的方式 在Python编程语言里,`for` 循环可以用来遍历任何序列的项目,如列表或元组等。当希望在每一次迭代过程中都执行特定的操作时,则可以在 `for` 循环内部调用函数[^2]。 下面的例子展示了如何通过 `for` 循环多次调用同一个函数: ```python def greet(name): """简单的问候函数""" return f"Hello, {name}!" names = ["Alice", "Bob", "Charlie"] greetings = [] for name in names: result = greet(name) # 调用函数 greetings.append(result) print(greetings) ``` 如果目标是在一定次数范围内反复调用某函数而不依赖于具体的元素集合,那么可以通过结合 `range()` 函数实现这一点: ```python def multiply_by_two(x): """将输入参数乘以二""" return x * 2 times_to_call = 5 results = [] for i in range(times_to_call): value = multiply_by_two(i) # 这里的i是从0到4的一个整数 results.append(value) print(results) ``` 另外,在某些情况下为了提高效率或者简化代码逻辑,也可以考虑使用列表推导式来代替传统的 `for` 循环加条件判断的形式[^3]: ```python def square(n): """计算平方值""" return n ** 2 squares_of_first_five_numbers = [square(num) for num in range(5)] print(squares_of_first_five_numbers) ``` 对于那些只需要临时使用的简单功能,还可以采用匿名函数(lambda表达式),这样既不会造成命名空间污染又能让程序更加紧凑[^4]: ```python addition = lambda a, b: a + b sum_results = [] for first_number in range(3): sum_result = addition(first_number, 10) # 使用lambda表达式替代常规定义的函数 sum_results.append(sum_result) print(sum_results) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值