函数式编程

第2章 函数式编程
、python中函数式编程简介
1、函数!= 函数式    就如  计算!=计算机
2、函数式编程的特点:
(1)、把计算视为函数而非指令
(2)、纯函数式编程:不需要指令,没有副作用,测试简单
(3)、支持高阶函数,代码简洁
3、python支持的函数式编程
(1)不是纯函数式编程:允许有变量
(2)支持高阶函数:函数也可作为参数传入
(3)支持闭包,有了闭包就能返回函数
(4)有限度地支持匿名函数

二、python中高阶函数
1、变量可以指向函数
>>> abs(-10)
10
>>>f = abs  定义一个变量指向函数abs
>>>f(-20)   利用变量调用函数abs
20
  
2、函数名就是指向函数的变量
>>>abs = len
>>>abs(-10)  
此时会报错,因为abs已经指向了len函数,不再是求绝对值的函数名了
>>>abs([1, 2, 3])
3

3、高阶函数:只能接受函数作为参数的函数
函数能接受变量作为参数,变量能指向函数,所以能接受函数作为参数的函数成为高阶函数。
DEMO:
>>>def add(x, y, f):
...    return f(x)+f(y)
...
>>>add(-1, 2, abs)
3

4、
import math  #注意点,导入数学文件

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

print add(25, 9, math.sqrt)  #注意使用数学函数的方式

5、python中的reduce()函数
reduce()函数是python函数的内置函数,需要接受两个参数,f函数和list。但是f函数需要有两个参数,且对list的元素进行反复调用函数f
DEMO:
def f(x, y):
    return x+y
reduce(f, [1, 2, 3, 4, 5])计算过程:
f(1, 2) 返回3
f(3, 3) 返回6
f(6, 4) 返回10
f(10, 5) 返回15   即求的list的和

reduce函数也可以有第3个可选参数,比如reduce(f, [1,2,3,4,5], 100) 那么将100设为加法的开始项进行求和。

6、python中的filter()函数
filter函数接受两个参数,一个f函数,一个list,f函数对list中的每个元素按设置的条件进行判断,返回False or True,filter函数会根据判断结果自动过滤掉不符合条件的元素,返回一个新的list,该list的元素都是符合条件的。
    
7、python中自定义排序函数
python中内置排序函数sorted()可对list进行排序
>>>sorted([4, 3, 5, 1])  #list有序的意思:创建的元素顺序与输出的顺序一样,但list内的元素大小顺序是需要算法另外操作排序的。
[1, 3, 4, 5]
但sorted()也是一个高阶函数, 可以接受一个比较函数来实现自定义排序。
比较函数有两个参数x、y,如果x排在y前面,返回-1,若x排在y后面,返回1,若相同,返回0.
>>> sorted([36, 5, 12, 9, 21], reversed_cmp)
[36, 21, 12, 9, 5]

8、python中返回函数
def calc_sum(lst):
    #定义函数lazy_sum
    def lazy_sum():
        return sum(lst) #嵌套函数里使用到了lst,但是不用将lst作为lazy_sum的参数,直接使用就行
    return lazy_sum 
    
注意区分返回的是函数还是返回值
def myabs():
    return abs   # 返回函数
def myabs2(x):
    return abs(x)   # 返回函数调用的结果,返回值是一个数值
 
>>>d = calc_sum([1,2,3])
此时d为指向函数lazy_sum的变量
>>>d() #调用返回函数
6

9python中闭包

DEMO:
def calc_sum(lst):
    def lazy_sum():
        return sum(lst)
    return lazy_sum
内层函数引用了外层函数的变量(外层函数的参数也是变量),且返回内层函数的函数,称之为闭包函数。

闭包函数的注意事项:
当返回函数后,内层函数引用的变量就不能再改变了,否则将出现错误。
DEMO:
# 希望一次返回3个函数,分别计算1x1,2x2,3x3:
def count():
    fs = []
    for i in range(1, 4):
        def f():
             return i*i
        fs.append(f)
    return fs

f1, f2, f3 = count()  #是三个赋值语句的缩写
print f1(), f2(), f3() #因为list fs里存储的是函数变量,所以输出时要输出函数。

f1,f2,f3函数都指向同一个函数f,所以当调用f1时,f函数的内容已经变了,导致f2,f3所指向的内容也发生了变化,所以三个函数打印出来的结果都为9.
即也符合当外层函数返回内层函数后,内层函数里的引用变量后来又发生了变化,导致闭包函数使用错误。

上诉函数正确代码:
def count():
    fs = []
    for i in range(1, 4):
        def f(j):
            def g():
                return j*j
            return g
        fs.append(f(i))
    return fs

f1, f2, f3 = count()
print f1(), f2(), f3()


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值