函数式编程—高阶函数(代码片段)

jayce9102 jayce9102     2023-04-27     380

关键词:

一、函数式编程概念简介

  1. 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元
  2. 就是越低级的语言,越贴近计算机,抽象程度低,执行效率高,比如C语言;越高级的语言,越贴近计算,抽象程度高,执行效率低,比如Lisp语言
  3. 函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的
  4. 函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
  5. 函数式编程最重要的概念就是:组合;一个函数只做一件事, 保证内部不被修改,且干净,无副作用,遵循开闭原则,然后将多个函数组合一起,便是简单的函数式编程范式

二、高阶函数

  1. 变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数
  2. map()函数接收两个参数,一个是函数,一个是Iterablemap将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回
  3. reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算(结果作为第二次调用的第一个参数)
  4. filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素
  5. sorted()函数可以对list进行排序,同时也是一个高阶函数,可以接收一个key函数来实现自定义的排序:key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序

三、返回函数(调用函数会返回一个函数)

  1. 返回函数:调用函数返回的不是结果,而是一个函数
  2. 调用返回函数时才会给出真正的结果(注意:返回函数每次调用都会返回一个新的函数,即使传入相同的参数)
  3. 调用‘返回函数’会返回一个函数,此函数的相关参数和变量都保存在该函数中,这种称为“闭包(相关参数和变量都保存在返回的函数中,这种称为“闭包)
    如果一定要引用循环变量,方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变

示例参考:

#返回的函数并没有立刻执行,而是直到调用了f()才执行
def count():
    fs = []
    for i in range(1, 4):
        def f():
             return i*i
        fs.append(f)
    return fs

f1, f2, f3 = count()

结果:全部都是9!原因就在于返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了3,因此最终结果为9

#f(i)立刻被执行
def count():
    def f(j):
        def g():
            return j*j
        return g
    fs = []
    for i in range(1, 4):
        fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
    return fs
结果:149

#计数器
def createCounter():
def num():
n = 1
while True:
yield n
n = n+1
g = num()  #此处num()是一个generator
def counter():
return next(g)
return counter

优化测试:
def createCounter():
def num():
n = 1
while True:
yield n
n = n+1
def counter():
return next(num())
return counter
此处运行的结果始终为1,不会递增
原因:使用g=num(),g是一个变量,是值传递,函数是内存地址传递!!!

 

四、匿名函数

  1. 关键字lambda表示匿名函数,冒号前面的x表示函数参数
  2. 匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果
  3. 匿名函数有个好处:函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数

kotlin函数式编程①(函数式编程简介|高阶函数|函数类别|transform变换函数|过滤函数|合并函数|map变换函数|flatmap变换函数)(代码片段)

文章目录一、函数式编程简介1、编程范式2、高阶函数3、函数式编程4、前端开发技术二、函数类别三、变换函数四、map变换函数1、map函数原型分析2、map函数设计理念3、代码示例五、flatMap变换函数1、flatMap函数原型分析2、代码... 查看详情

scala函数式编程初步(高阶函数)(代码片段)

参数式函数定义一个参数是函数的函数。(完整定义=>匿名函数)objecthelloWorlddefmain(args:Array[String]):Unit=defaddxy(x:Int,y:Int):Int=x+ydefmulxy(x:Int,y:Int):Int=x*ydeffunc1(a:Int,b:Int,f:(Int,Int)=> 查看详情

函数式编程—高阶函数(代码片段)

一、函数式编程概念简介函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程的程序设... 查看详情

13.函数式编程:匿名函数高阶函数装饰器(代码片段)

#defadd(x,y):#returnx+y#print(add(1,2))#3#匿名函数#lambda表达式#f=lambdax,y:x+y#print(f(1,2))##三元表达式#x=2#y=1#r=xifx>yelsey#print(r)#2 #map#list_x=[1,2,3,4,5,6,7,8]#defsquare(x):#returnx*x#方法1#forxinl 查看详情

scala学习(函数式编程面向对象编程)(代码片段)

文章目录函数式编程基础函数编程函数定义函数参数函数至简原则高阶函数编程面向对象编程基础面向对象编程高阶面向对象编程函数式编程基础函数编程函数定义packagelearn03objectdemo01defmain(args:Array[String]):Unit=//无参、无返回... 查看详情

scala学习(函数式编程面向对象编程)(代码片段)

文章目录函数式编程基础函数编程函数定义函数参数函数至简原则高阶函数编程面向对象编程基础面向对象编程高阶面向对象编程函数式编程基础函数编程函数定义packagelearn03objectdemo01defmain(args:Array[String]):Unit=//无参、无返回... 查看详情

js高阶函数filterreducemap(代码片段)

...程/声明式编程//编程范式:面向对象编程(第一公民:对象)/函数式编程(第一公民:函数)//filter/map/reduce//filter中的回调函数有一个要求:必须返回一个boolean值//true:当返回true时,函数内部会自动将这次回调的n加入到新的数组中//false:当... 查看详情

函数式编程和面向对象编程(代码片段)

介绍函数式编程,以函数思维作为核心,在这种思维的角度去思考问题。这种编程最重要的基础就是λ演算,接受函数当作输入输出。面向对象编程,把问题看作由对象的属性与对象所进行的行为组成。基于对象的概念,以类作... 查看详情

12-函数式编程(代码片段)

Python语言的高级特性函数是编程(FunctionalProgramming)基于lambda演算的一种编程方式程序中只有函数函数可以作为参数,同样可以作为返回值纯函数式变成语言:LISP,HaskellPython函数式编程只是借鉴函数式编程的一些特点,可以理... 查看详情

scala的函数式编程(代码片段)

Scala的函数式编程  Scala的函数式编程的特点  -高阶函数  -闭包  -模式匹配可参考:http://blog.51cto.com/14048416/2337136  -单一赋值  -延迟计算  -类型推导  -尾部调用优化 &e... 查看详情

kotlin初学者函数式编程(代码片段)

...),移动端:https://bbs.csdn.net/topics/603956616目录一、函数式编程概念1.1面向函数编程(FOP)1.2高阶函数1.3为什么使用函数式编程二、函数式编程类别2.1变换transform2.1.1map2.1.2flatMap2.2过滤filter2.3合并combine2.3.1zip2.3.2fold三... 查看详情

kotlin小知识之高阶函数(代码片段)

文章目录高阶函数定义高阶函数函数类型高阶函数示例内联函数内联函数的作用内联函数的用法noinline与crossinline高阶函数定义高阶函数高阶函数和Lambda的关系是密不可分的.像接受Lambda参数的函数就可以称为具有函数式编程风格... 查看详情

函数式编程(代码片段)

编程的方法论:面向过程面向对象函数式 函数式编程的定义:函数式=编程语言定义的函数+数学意义上的函数(先想到一个数学模型,再用python上的功能实现这个逻辑) y=x+1defcat():returnx+1  特性:1.不用变量保存状... 查看详情

javascriptes6函数式编程:柯里化偏应用组合管道(代码片段)

上一篇介绍了闭包和高阶函数,这是函数式编程的基础核心。这一篇来看看高阶函数的实战场景。首先强调两点:注意闭包的生成位置,清楚作用域链,知道闭包生成后缓存了哪些变量高阶函数思想:以变量作用域作为根基,以... 查看详情

python基础--函数式编程(代码片段)

#面向过程#函数式编程:函数式=编程语言定义的函数+数学意义上的函数#面向对象#高阶函数:1.函数接受的参数是一个函数名2.返回值中包含函数#deffoo(n):#n=bar#print(n)##defbar(name):#print(‘mynameis%s‘%name)###foo(bar)#把函数当做参数传给另... 查看详情

2.python函数式编程中的字符串,元组,函数的分类,高阶函数,一篇文章都介绍一遍(代码片段)

函数式编程中的字符串在函数式编程中,经常用到Python字符串,因其是不可变数据结构。字符串本身是一个对象,具备很多对象方法,与常识中函数的使用不太相同,例如下述代码my_str="xiangpica"print(my... 查看详情

由重构react组件引发的函数式编程的思考(代码片段)

...组件时,学习了一些高阶组件的编写思路,其实是由高阶函数沿伸而来。一般情况我们编写一个react组件大致样子如下:classAppextendsComponentconstructor(props)lifecycle()method()render()在编写一个基础组件我们会更多 查看详情

js函数式编程基础:高阶函数柯理化函数合成loadash

一、函数式编程什么是函数式编程(FP)?FP是一种编程范式,也是一种编程风格,和面向对象是并列的关系。FP用于描述数据或函数之间的映射;根据输入通过某种运算获得相应的输出,即映射关系,例如:y=sin(x)。FP需要有输入和... 查看详情