函数式编程--函数和闭包

  • 函数式编程就是一种抽象程度很高的编程范式。(Python允许使用变量,不是纯函数式编程语言
  • 函数式编程的特点:函数可以赋给变量,所以,可作为参数传递,可作为返回值返回。

一个最简单的高阶函数:

1 def add(x, y, f):
2     return f(x) + f(y)

add(-5, 6, abs) , abs 作为参数传入 add 函数中 ,又作为参数返回
  • 作为参数

一个列表运算的例子:lst = range(5)

加法:只需 for 循环遍历 lst ,依次相加,返回 amout

1 amount = 0
2 for num in lst:
3     amount = add(amount, num
1 def sum_(lst):
2     amount = 0
3     for num in lst:
4         amount = add(amount, num)
5     return amount
6
7 print sum_(lst)
1 def sum_(lst):
2     amount = 0
3     for num in lst:
4         amount = add(amount, num)
5     return amount
6
7 print sum_(lst)

乘法:初始值换成了1以及函数add换成了乘法运算符

  

1  def multiply(lst):
2    product = 1
3    for num in lst:
4      product = product * num
5    return product

把这个流程抽象出来,而将加法、乘法或者其他的函数作为参数传入:

1 def reduce_(function, lst, initial):
2     result = initial
3     for num in lst:
4         result = function(result, num)
5     return result

现在,想要算乘积:

1 print reduce_(lambda x, y: x * y, lst, 1)
  • 返回闭包

闭包是一类特殊的函数。如果一个函数定义在另一个函数的作用域中,并且函数中引用了外部函数的局部变量,那么这个函数就是一个闭包。

将函数返回通常需要与闭包一起使用(即返回一个闭包)才能发挥威力。

需要注意的问题是,返回的函数并没有立刻执行,而是直到调用了 f() 才执行。我们来看一个例子:

1 def count():
2     fs = []
3     for i in range(1, 4):
4         def f():
5              return i*i
6         fs.append(f)
7     return fs
8
9 f1, f2, f3 = count()
1 >>> f1()
2 9
3 >>> f2()
4 9
5 >>> f3()
6 9

返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量

如果一定要引用循环变量怎么办?方法是再创建一个函数

 1 >>> def count():
 2 ...     fs = []
 3 ...     for i in range(1, 4):
 4 ...         def f(j):
 5 ...             def g():
 6 ...                 return j*j
 7 ...             return g
 8 ...         fs.append(f(i))
 9 ...     return fs

 

  

  

时间: 2024-10-27 06:42:19

函数式编程--函数和闭包的相关文章

翻译连载 | 附录 C:函数式编程函数库-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇

原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTML 最坚实的梁柱:分享,是 CSS 里最闪耀的一瞥:总结,是 JavaScript 中最严谨的逻辑.经过捶打磨练,成就了本书的中文版.本书包含了函数式编程之精髓,希望可以帮助大家在学习函数式编程的道路上走的更顺畅.比心. 译者团队(排名不分先后):阿希.blueken.brucecham.cfanlife.d

js函数式编程-函数合并

函数编程的函数组合:两个纯函数组合之后返回了一个新函数 var compose = function(f,g) { return function(x) { return f(g(x)); }; }; 效果: var toUpperCase = function(x) { return x.toUpperCase(); }; var exclaim = function(x) { return x + "!"; }; var shout = compose( exclaim, toUp

Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)...啊啊啊

函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. 而函数式编程(请注意多了一个"式"字)--Functional Programming,虽然也可以归结到面向过程的程序设计,但其思想更接近数学计算. 我们首先要搞明白计算机(Computer)和计算(Compute)的概念. 在计算机的层次上,CPU执行的是加减乘除的指令代码

Python3 函数式编程(高阶函数)

这一次主要是学习了一下Python3函数式编程思想,介绍了3个代表性高阶函数:map(), reduce(), filter().像 sorted() 其实也是高阶函数,可以接受函数作为参数.这篇学习笔记中编写了大量高阶函数,同时介绍了Python中的闭包,装饰器.这些思想和方法很美妙,我受益匪浅.当然这些都需要进一步运用和学习. 运行环境:Python3.6 + Jupyter notebook .caret, .dropup > .btn > .caret { border-top-col

day03-递归函数、函数式编程

1.递归函数 在函数内部,可以调用其他函数.但是一个函数在内部调用自身,这个函数被称为递归函数. 1 def calc(n): 2 print(n) 3 if int(n/2) == 0: #结束符 4 return n 5 return calc(int(n/2)) #调用函数自身 6 7 m = calc(10) 8 print('----->',m) #输出结果 10 5 2 1 -----> 1 #最后返回的值 1+2+3+4+.....+100的例子: 1 def add_to_10

Javascript 中的函数式编程

本文和大家分享的主要是javascript中函数式编程相关内容,一起来看看吧,希望对大家学习javascript有所帮助. 函数式编程(functional programming)或称函数程序设计,又称泛函编程,是一种编程范型,比起命令式编程,函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断渐进,逐层推导复杂的运算,而不是设计一个复杂的执行过程. 函数式编程,近年来一直被炒得火热,国内外的开发者好像都在议论和提倡这种编程范式.在众多的函数式语言中,Jav

Python进阶 函数式编程和面向对象编程等

函数式编程 函数:function 函数式:functional,一种编程范式.函数式编程是一种抽象计算机的编程模式. 函数!= 函数式(如计算!=计算机) 如下是不同语言的抽象 层次不同 高阶函数:能接收函数做参数的函数 变量可以指向函数 函数的参数可以接收变量 一个函数可以接收另一个函数作为参数 例子: 接收abs函数, 定义一个函数,接收x,y,z三个参数.其中x,y是数值,z是函数 . 1 2 3 def add(x,y,z):     return z(x)+z(y) print ad

学习日志---python(函数式编程)

函数式编程 后面的闭包和装饰器很重要,参数可以是函数,把函数传进去参与运算. 过程是一个没有返回值的函数,函数本身也是一个对象,因此可以赋值给引用: 一个模块中函数不可重名,因此不支持重载,因为python是以函数名来识别调用的哪一个: 模块中函数的定义是自上而下的: 可以多个返回值,看作是一个元组:也可以分开多个变量接受返回值: def p():     return 1,2,3 a=p() print a a,b,c=p() print a,b,c 函数的属性 文档属性:__doc__ 可以

python学习09-函数和函数式编程

函数和函数式编程 函数会向调用者返回一个值, 而实际编程中大偏函数更接近过程,不显示地返回任何东西.把过程看待成函数的语言通常对于"什么都不返回"的函数设定了特殊的类型或者值的名字.这些函数在 c 中默认为"void"的返回类型,意思是没有值返回. 在 python 中, 对应的返回对象类型是none. 简而言之,当没有显式地返回元素或者如果返回 None 时, python 会返回一个 None.那么调用者接收的就是 python 返回的那个对象,且对象的类型仍然