python之函数式编程

介于编辑器的局限,可能有些markdown语法正确起作用,读者可以查看我的博客网站:[www.bestyblog.top](http://www.bestblog.top) 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。 而函数式编程(请注意多了一个“式”字)——Functional Programming,虽然也可以归结到面向过程的程序设计,但其思想更接近数学计算。 函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。 函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
![](http://ov4gdtmdv.bkt.clouddn.com/u=490001157,4258523023&fm=27&gp=0.jpg)

# 高阶函数 高阶函数具有如下特点: 1. 变量可以指向函数 2. 函数名也是变量 3. 传入函数 实例: >>> f = abs >>> f(-10) 10 >>> abs = 10 >>> abs(-10) Traceback (most recent call last): File “”, line 1, in TypeError: ‘int’ object is not callable def add(x, y, f): return f(x) + f(y) ## map/reduce `map()`函数接收两个参数,一个是函数,一个是`Iterable`,`map`将传入的函数依次作用到序列的每个元素,并把结果作为新的`Iterator`返回。 >>> def f(x): … return x * x … >>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> list(r) [1, 4, 9, 16, 25, 36, 49, 64, 81] `reduce`把一个函数作用在一个序列`[x1, x2, x3, …]`上,这个函数必须接收两个参数,`reduce`把结果继续和序列的下一个元素做累积计算,即:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
>>> from functools import reduce >>> def add(x, y): … return x + y … >>> reduce(add, [1, 3, 5, 7, 9]) 25 ## filter `filter()`函数用于过滤序列。 `filter()`把传入的函数依次作用于每个元素,然后根据返回值是`True`还是`False`决定保留还是丢弃该元素。 def is_odd(n): return n % 2 == 1 list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])) # 结果: [1, 5, 9, 15] ## sorted 排序函数 `sorted()`函数也是一个高阶函数,它还可以接收一个`key`函数来实现自定义的排序(此种方法又称回调,是python高级知识,如要了解更多,建议参考《python cookbook》)。 >>> sorted([36, 5, -12, 9, -21], key=abs) [5, 9, -12, -21, 36]
![](http://ov4gdtmdv.bkt.clouddn.com/1504619800869.jpg)
# 返回函数 ## 函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。 def lazy_sum(*args): def sum(): ax = 0 for n in args: ax = ax + n return ax return sum >>> f = lazy_sum(1, 3, 5, 7, 9) >>> f ## 闭包 注意到返回的函数在其定义内部引用了局部变量`args`,当一个函数返回了一个函数后,其内部的局部变量还被新函数引用,所以,闭包用起来简单,实现起来可不容易。 返回的函数并没有立刻执行,而是直到调用了`f()`才执行。 返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
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
结果:
>>> f1, f2, f3 = count()
>>> f1()
1
>>> f2()
4
>>> f3()
9
![](http://ov4gdtmdv.bkt.clouddn.com/1504619717125.jpg)
# 匿名函数 关键字`lambda`表示匿名函数. >>> f = lambda x: x * x >>> f # 装饰器 鉴于装饰器比较复杂,我日后会为装饰器专门写一篇文章,在这里就先不讲了。
![](http://ov4gdtmdv.bkt.clouddn.com/u=3234387572,3337966738&fm=27&gp=0.jpg)

今天没写多少,可能懒癌又犯了?,不过函数式编程除了闭包和装饰器外,内容不是很多,主要还是靠自己理解,至于闭包和装饰器,我会再专门写一篇文章进行介绍的✍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python函数式编程是一种编程范式,它允许将函数当作变量来使用,并支持将函数作为参数传递给其他函数、将函数赋值给其他变量、函数的返回值也可以是一个函数等等。虽然Python不是纯函数式编程语言,但它提供了一些支持函数式编程的功能。函数式编程主要有以下几个方面: 1. 高阶函数:高阶函数是指能够接收其他函数作为参数或返回函数函数。例如,可以定义一个高阶函数apply_twice,它接收一个函数一个参数,并将函数应用两次于该参数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Python函数式编程](https://blog.csdn.net/weixin_46039719/article/details/122542748)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [python函数式编程](https://blog.csdn.net/qq_42008628/article/details/119215727)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Python函数式编程](https://blog.csdn.net/chiaotien/article/details/104393462)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值