Python之functools模块之reduce、partial

Python之functools模块之reduce、partial

reduce

  • functools.reduce(function, iterable[, initial])
  • 就是减少的意思
  • 初始值没有提供就在可迭代对象中取一个

partial

  • 偏函数
  • 把函数部分参数固定下来,相当于为部分的参数添加了固定的默认值,形成一个新的函数,并返回这个新函数
  • 这个新函数是对原函数的封装

from functools import reduce, partial

# 导入funtools模块下的reduce和partial
reduce(lambda x,y: print(x, y), range(3))

# 返回结果:0 1
# 返回结果:None 2
def fn(x, y):
    print(x, y)
    return x + y

reduce(fn, range(6))

# 上一次返回值会成为下一次的x
# 返回结果:0 1
# 返回结果:1 2
# 返回结果:3 3
# 返回结果:6 4
# 返回结果:10 5
# 返回结果:15
sum(range(5)), reduce(lambda x,y: x+y, range(5))

# 返回结果:(10, 10)

解释说明:

  • 在Python中,sum()和reduce()都是内置函数,用于对可迭代对象进行求和操作。
    • sum(iterable):这个函数会返回所有元素的总和。如果提供了start参数,那么它会把iterable的所有元素加起来,再加上start。如果没有提供start参数,那么它只会把所有元素加起来。例如,sum([1, 2, 3, 4])会返回10。
    • reduce(function, iterable[, initializer]):这个函数会对iterable的每个元素应用function,然后返回一个单一的结果。如果提供了initializer,那么它会作为第一次调用function时的第一个参数。如果没有提供initializer,那么iterable的第一个元素会作为第一次调用function时的第一个参数,iterable的第二个元素会作为第二次调用function时的第一个参数,以此类推。例如,reduce(lambda x, y: x+y, [1, 2, 3, 4])会返回10。
    • 在你给出的代码中,sum(range(5))和reduce(lambda x,y: x+y, range(5))都是在计算0到4(包括0,不包括5)的所有整数的和。

注意事项

  • sum()函数只适用于数字类型的数据,如果传入的是非数字类型的数据,会抛出TypeError异常。
  • reduce()函数需要从functools模块中导入,否则会抛出NameError异常。
  • reduce()函数在Python 3中被移到了functools模块中,如果你使用的是Python 2,可以直接使用。
reduce(lambda x,y: x * y, range(1, 6))

# 返回结果:120

解释说明

  • reduce() 是 Python 中的一个高阶函数,它接收一个二元操作函数(接受两个参数的函数)和一个可迭代对象(如列表、元组等),然后将这个二元操作函数作用于可迭代对象的元素,从左到右依次进行计算,并将结果累积起来。在这个问题中,reduce() 函数使用了一个 lambda 函数作为二元操作函数,该函数接受两个参数 x 和 y,并返回它们的乘积。range(1, 6) 生成一个包含 1 到 5 的整数序列。因此,reduce(lambda x,y: x * y, range(1, 6)) 的作用是将 1 到 5 的整数依次相乘,得到最终的结果。

注意事项

  • reduce() 函数需要从 functools 模块中导入。 reduce() 函数在 Python 3 中被移到了 functools 模块中,因此在使用时需要先导入该模块。 如果可迭代对象为空,reduce() 函数会抛出 TypeError 异常。可以通过提供一个可选的初始值参数来避免这种情况,例如 reduce(lambda x, y: x * y, range(1, 6), 1)。

def add(x, y=5):
    return x + y

# 创建add函数
partial(add, 4)

# 设置偏函数
# 返回结果:functools.partial(<function add at 0x109bc6a20>, 4)
newadd = partial(add, 4)

# 对一个函数的部分参数固定,从而返回一个新包装函数,这个函数应该是关于剩余参数的一个函数
newadd

# 执行函数
# 返回结果:functools.partial(<function add at 0x109bc6a20>, 4)
newadd

# 执行函数
# 返回结果:functools.partial(<function add at 0x109bc6a20>, 4)
newadd(), add(4)

# add函数缺省值是5,偏函数固定了4,所以不给值也是9,给了值4也是9
# 返回结果:(9, 9)
def add(x, y, *args):
    return x + y + sum(args)

# 创建一个add函数
newadd = partial(add, 1, 2, 3, 4, 5)

# 设置一个变量
newadd()

# 1给了x, 2给了y, 3,4,5给了args
# 返回结果:15

相关推荐

  1. Pythonfunctools模块lru_cache

    2024-03-27 11:22:03       43 阅读
  2. Pythonfunctools模块reduce、partial

    2024-03-27 11:22:03       41 阅读
  3. Python基础总结functools.partial

    2024-03-27 11:22:03       24 阅读
  4. Python模块logging

    2024-03-27 11:22:03       97 阅读
  5. Python学习笔记--内置模块functools中的lru_cache()函数

    2024-03-27 11:22:03       64 阅读
  6. python学习argparse模块

    2024-03-27 11:22:03       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-27 11:22:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-27 11:22:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-27 11:22:03       87 阅读
  4. Python语言-面向对象

    2024-03-27 11:22:03       96 阅读

热门阅读

  1. 智能楼宇智慧化系统解决方案

    2024-03-27 11:22:03       34 阅读
  2. 小白用Windows(ssh)连接使用 ubuntu(虚拟机)

    2024-03-27 11:22:03       41 阅读
  3. [NCNN学习笔记]-4

    2024-03-27 11:22:03       41 阅读
  4. FastAPI+React全栈开发06 使用MongoDB设置文档存储

    2024-03-27 11:22:03       37 阅读
  5. 什么是无符号数

    2024-03-27 11:22:03       39 阅读
  6. SpringCloud系列(1)--SpringCloud简介

    2024-03-27 11:22:03       38 阅读
  7. 代码签名证书可以修改签名者信息吗?

    2024-03-27 11:22:03       47 阅读
  8. Vue.js 中::v-deep

    2024-03-27 11:22:03       35 阅读
  9. vue this.$toast 失效问题汇总

    2024-03-27 11:22:03       40 阅读