iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >一文详尽 Python 函数式编程技术
  • 100
分享到

一文详尽 Python 函数式编程技术

Python技术编程 2023-05-14 21:05:09 100人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

本文对 python 中的函数式编程技术进行了简单的入门介绍。头等函数在 Python 中,函数是「头等公民」(first-class)。也就是说,函数与其他数据类型(如 int)处于平等地位。因而,我们可以将函数赋值给变量,也可以将其作为

本文对 python 中的函数式编程技术进行了简单的入门介绍。

图片

头等函数

Python 中,函数是「头等公民」(first-class)。也就是说,函数与其他数据类型(如 int)处于平等地位。

因而,我们可以将函数赋值给变量,也可以将其作为参数传入其他函数,将它们存储在其他数据结构(如 dicts)中,并将它们作为其他函数的返回值。

把函数作为对象

由于其他数据类型(如 string、list 和 int)都是对象,那么函数也是 Python 中的对象。我们来看示例函数 foo,它将自己的名称打印出来:

def foo():
 print("foo")

由于函数是对象,因此我们可以将函数 foo 赋值给任意变量,然后调用该变量。例如,我们可以将函数赋值给变量 bar:

bar = foo
bar()
#will print "foo" to the console

语句 bar = foo 将函数 foo 引用的对象赋值给变量 bar。

把对象作为函数

当对象可调用时(callable),它们与函数一样,如 object()。这是通过 call 方法实现的。

示例如下:

class Greeter:
 def __init__(self, greeting):
self.greeting = greeting
 def __call__(self, name):
return self.greeting + " " + name

每一次配置 Greeter 类的对象时,我们都会创建一个新的对象,即打招呼时可以喊的新名字。如下所示:

morning = Greeter("Good morning") #creates the callable object
morning("john") # calling the object
#prints "good morning john" to the console

我们可以调用 morning 对象的原因在于,我们已经在类定义中使用了 call 方法。为了检查对象是否可调用,我们使用内置函数 callable:

callable(morning) #true
callable(145) #false. int is not callable.

数据结构内的函数

函数和其他对象一样,可以存储在数据结构内部。例如,我们可以创建 int to func 的字典。当 int 是待执行步骤的简写时,这就会派上用场。

# store in dictionary
mapping = {
 0 : foo,
 1 : bar
}
x = input() #get integer value from user
mapping[x]() #call the func returned by dictionary access

类似地,函数也可以存储在多种其他数据结构中。

把函数作为参数和返回值

函数还可以作为其他函数的参数和返回值。接受函数作为输入或返回函数的函数叫做高阶函数,它是函数式编程的重要组成部分。

高阶函数具备强大的能力。就像《Eloquent javascript》中解释的那样:

「高阶函数允许我们对动作执行抽象,而不只是抽象数值。」

我们来看一个例子。假设我们想对一个项目列表(list of items)执行迭代,并将其顺序打印出来。我们可以轻松构建一个 iterate 函数:

def iterate(list_of_items):
for item in list_of_items:
print(item)

看起来很酷吧,但这只不过是一级抽象而已。如果我们想在对列表执行迭代时进行打印以外的其他操作要怎么做呢?

这就是高阶函数存在的意义。我们可以创建函数 iterate_custom,待执行迭代的列表和要对每个项应用的函数都是 iterate_custom 函数的输入:

def iterate_custom(list_of_items, custom_func):
 for item in list_of_items:
custom_func(item)

这看起来微不足道,但其实非常强大。

我们已经把抽象的级别提高了一层,使代码具备更强的可重用性。现在,我们不仅可以在打印列表时调用该函数,还可以对涉及序列迭代的列表执行任意操作。

函数还能被返回,从而使事情变得更加简单。就像我们在 dict 中存储函数一样,我们还可以将函数作为控制语句,来决定适合的函数。例如:

def add(x, y):
return x + y
def sub(x, y):
return x - y
def mult(x, y):
return x * y
def calculator(opcode):
if opcode == 1:
 return add
elif opcode == 2:
 return sub
else:
 return mult 
my_calc = calculator(2) #my calc is a subtractor
my_calc(5, 4) #returns 5 - 4 = 1 
my_calc = calculator(9) #my calc is now a multiplier
my_calc(5, 4) #returns 5 x 4 = 20.

嵌套函数

函数还可以在其他函数内部,这就是「内部函数」。内部函数在创建辅助函数时非常有用,辅助函数即作为子模块来支持主函数的小型可重用函数。

在问题需要特定函数定义(参数类型或顺序)时,我们可以使用辅助函数。这种不遵循传统做法的操作使得解决问题变得更加简单,示例参见:

Http://www-inst.eecs.berkeley.edu/~cs61a/sp12/lectures/lect4-2x3.pdf

假设你想定义一个斐波那契函数 fib(n),该函数只有一个参数 n,我们必须返回第 n 个斐波那契数。

定义此类函数的一种可行方式是:使用辅助函数来追踪斐波那契数列的前两个项(因为斐波那契数是前两个数之和)。

def fib(n):
def fib_helper(fk1, fk, k):
if n == k:
 return fk
else:
 return fib_helper(fk, fk1+fk, k+1)
if n <= 1:
 return n
else:
 return fib_helper(0, 1, 1)

将该计算从函数主体移到函数参数,这具备非常强大的力量。因为它减少了递归方法中可能出现的冗余计算。

单表达式函数(Lambda 表达式)

如果我们想在未给函数命名之前写一个函数要怎么做?如果我们想写一个简短的单行函数(如上述示例中的函数 foo 或 mult)要怎么做?

我们可以在 Python 中使用 lambda 关键字来定义此类函数。示例如下:

mult = lambda x, y: x * y
mult(1, 2) #returns 2

该 mult 函数的行为与使用传统 def 关键字定义函数的行为相同。

注意:lambda 函数必须为单行,且不能包含程序员写的返回语句。

事实上,它们通常具备隐式的返回语句(在上面的示例中,函数想表达 return x * y,不过我们省略了 lambda 函数中的显式返回语句)。

lambda 函数更加强大和精准,因为我们还可以构建匿名函数(即没有名称的函数):

(lambda x, y: x * y)(9, 10) #returns 90

当我们只需要一次性使用某函数时,这种方法非常方便。例如,当我们想填充字典时:

import collections
pre_fill = collections.defaultdict(lambda: (0, 0))
#all dictionary keys and values are set to 0

接下来我们来看 Map、Filter 和 Reduce,以更多地了解 lambda。

Map、Filter 和 Reduce

Map

map 函数基于指定过程(函数)将输入集转换为另一个集合。这类似于上文提到的 iterate_custom 函数。例如:

def multiply_by_four(x):
return x * 4
scores = [3, 6, 8, 3, 5, 7]
modified_scores = list(map(multiply_by_four, scores))
#modified scores is now [12, 24, 32, 12, 20, 28]

在 Python 3 中,map 函数返回的 map 对象可被类型转换为 list,以方便使用。现在,我们无需显式地定义 multiply_by_four 函数,而是定义 lambda 表达式:

modified_scores = list(map(lambda x: 4 * x, scores))

当我们想对集合内的所有值执行某项操作时,map 函数很有用。

Filter

就像名称所显示的那样,filter 函数可以帮助筛除不想要的项。例如,我们想要去除 scores 中的奇数,那么我们可以使用 filter:

even_scores = list(filter(lambda x: True if (x % 2 == 0) else False, scores))
#even_scores = [6, 8]

由于提供给 filter 的函数是逐个决定是否接受每一个项的,因此该函数必须返回 bool 值,且该函数必须是一元函数(即只使用一个输入参数)。

Reduce

reduce 函数用于「总结」或「概述」数据集。例如,如果我们想要计算所有分数的总和,就可以使用 reduce:

sum_scores = reduce((lambda x, y: x + y), scores)
#sum_scores = 32

这要比写循环语句简单多了。注意:提供给 reduce 的函数需要两个参数:一个表示正在接受检查的项,另一个表示所用运算的累积结果。

以上就是一文详尽 Python 函数式编程技术的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 一文详尽 Python 函数式编程技术

本文链接: https://www.lsjlt.com/news/205663.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 一文详尽 Python 函数式编程技术
    本文对 Python 中的函数式编程技术进行了简单的入门介绍。头等函数在 Python 中,函数是「头等公民」(first-class)。也就是说,函数与其他数据类型(如 int)处于平等地位。因而,我们可以将函数赋值给变量,也可以将其作为...
    99+
    2023-05-14
    Python 技术 编程
  • Python元编程技术一览表
    元编程是Python中一种非常强大的技术,它允许程序员在运行时修改类和函数的定义。这可以用于实现许多有趣的特性,如动态生成代码、动态修改代码、动态生成类、动态修改类等。 1. 元类 元类是Python中用于创建类的类。当我们创建一个类时...
    99+
    2024-02-14
    Python 元编程 元类 动态生成 动态修改
  • Python 函数式编程
    lambda表达式 以lambda开头 紧跟一定的参数(如果有的话) 参数后用冒号和表达式主题隔开 只是一个表达式,所以,没有return # 计算一个数字的100倍数 stm = lambda x: 100 * x stm(89...
    99+
    2023-01-30
    函数 Python
  • Python 函数式编程:探索代码的艺术
    纯函数 纯函数不修改外部状态,并且仅依赖于其参数。这意味着它们易于测试和调试,并且可以安全地并行执行。在 Python 中,纯函数可以表示为如下形式: def add(x, y): return x + y 不可变数据 不可变数据...
    99+
    2024-04-02
  • Java 索引函数 API:一份详尽的文档指南
    Java 是一门广泛使用的编程语言,它提供了很多内置函数和 API 来帮助开发者处理数据。其中,索引函数 API 是一个非常重要的工具,它可以让开发者更加轻松地操作和处理数据。 本文将为您介绍 Java 索引函数 API,帮助您了解它的基...
    99+
    2023-09-02
    索引 函数 api
  • ASP函数与过程:从新手到高手,掌握编程技巧,一网打尽!
    ASP函数与过程是ASP编程语言中的重要组成部分,可以帮助程序员编写出更加高效、易于理解的代码。本文将从基础知识讲起,介绍ASP函数与过程的概念、常用函数和过程的用法,以及一些高级技巧,帮助您从新手成长为高手。 1. ASP函数与过程的概...
    99+
    2024-02-14
    ASP 函数 过程 编程 技巧
  • 如何在 Python 中设置 path?开发技术教程一网打尽!
    在 Python 中,path 是一个非常重要的概念。简单来说,path 就是指文件或目录所在的位置。在 Python 中,我们经常需要引用其他文件或模块,这时就需要设置 path。本文将介绍如何在 Python 中设置 path,以及一...
    99+
    2023-11-06
    path 开发技术 教程
  • Python函数式编程之返回函数实例详解
    目录看代码:用filter函数来计算素数用Python高阶函数来实现这个算法:高阶函数实现打印小于100的素数:总结 高阶函数除了可以接受函数作为参数外,还可以把函数作为结...
    99+
    2024-04-02
  • Python函数式编程中itertools模块详解
    目录容器与可迭代对象count() 函数cycle 函数repeat 函数enumerate 函数,添加序号accumulate 函数chain 与 groupby 函数zip_lo...
    99+
    2024-04-02
  • 详解Python函数式编程之装饰器
    目录一、装饰器的本质:函数闭包(functionclosure):二、装饰器使用方法:保留函数参数和返回值的函数闭包:三、多个装饰器的执行顺序:四、创建带参数的装饰器:总结一、装饰器...
    99+
    2024-04-02
  • Linux 上最流行的异步编程技术:ASP 函数详解
    在 Linux 上,异步编程是一项非常重要的技术。异步编程可以使得程序在等待 IO 操作完成的同时,可以继续执行其他的操作,从而提高程序的效率。其中最流行的异步编程技术之一就是 ASP 函数。本文将详细介绍 ASP 函数的使用方法,并穿插...
    99+
    2023-11-01
    函数 linux 异步编程
  • Python 函数式编程,看这一篇就够了!
    本文对 Python 中的函数式编程技术进行了简单的入门介绍。头等函数在 Python 中,函数是「头等公民」(first-class)。也就是说,函数与其他数据类型(如 int)处于平等地位。因而,我们可以将函数赋值给变量,也可以将其作为...
    99+
    2023-05-14
    Python 函数式编程
  • Python函数式和Ruby的相关技术的比较过程
    这期内容当中小编将会给大家带来有关Python函数式和Ruby的相关技术的比较过程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Python函数式在平时的使用中有很多有意思的事情。下面我们就详细的看看Py...
    99+
    2023-06-17
  • JavaScript 构造函数模式:解锁高级编程技术的门户
    ...
    99+
    2024-04-02
  • 一文带你了解Java中的函数式编程
    目录概述背景函数式的价值新旧对比Lambda 表达式方法引用Runnable 接口未绑定的方法引用构造函数引用函数式接口基本类型非基本类型多参数函数式接口高阶函数闭包函数组合柯里化总...
    99+
    2023-05-14
    Java函数式编程 Java函数编程
  • 编程算法必备技能:Python 异步编程与 load 函数详解
    随着互联网技术的发展,人们对于网页访问速度的要求越来越高,而异步编程技术的出现,可以大幅度提高程序的运行效率。Python 异步编程技术就是其中一种,它可以让程序在等待网络请求的同时,去处理其他的事情,从而提高程序的效率。 在 Pytho...
    99+
    2023-10-17
    异步编程 编程算法 load
  • 一文带你理解JavaScript中的函数式编程
    目录分析理解纯函数相同的输入参数,总会有相同的输出在执行过程中不会产生语义上可观察的 副作用纯函数 的作用不确定性的危害确定性的好处如何对待副作用总结我理解的 函数式编程 是一种 编...
    99+
    2023-02-20
    JavaScript函数式编程 JS函数式编程 JavaScript编程
  • C++ 函数式编程的实践技巧
    c++++ 函数式编程技巧包括:使用不可变对象、纯函数、高阶函数、lambda 表达式和流 api。具体实践案例:使用不可变单词列表、纯函数计算单词出现的次数、高阶函数找到出现次数最多的...
    99+
    2024-04-18
    c++ 函数式编程
  • Python函数式编程之闭包
    -------------------------函数式编程之*******闭包------------------------ Note: 一:简介 函数式编程不是程序必须要的,但是对于简化程序有很重要的作用。 Python...
    99+
    2023-01-30
    函数 Python
  • Python函数式编程是什么
    这篇文章将为大家详细讲解有关Python函数式编程是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。函数范式在命令式范式中,通过为计算机提供一系列指令然后执行它们来完成任务。在执行这些指令时,可以改变某...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作