Python小课之【函数式编程】

哈喽,大家好,上次说了函数是个啥,今天来简单聊聊函数式编程!

函数

回顾一下函数,函数就是把固定的逻辑放在一起,方便我们下次使用,不用写重复的代码,提升代码的复用性以及可读性;一个好的函数,可以只通过函数名就可以看懂这个过程要做什么,所以当我们有很大一段逻辑代码的时候,拆成不同的函数,可以大大的提高代码易读性。

函数式编程

函数式编程,这里多了一个“式”,虽然也可以归结到面向过程的程序设计,但其思想更接近数学计算。函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!

Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。

函数作为参数

Python内建的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]

把一个序列中的空字符串删除的写法:

def not_empty(s):
    return s and s.strip()

list(filter(not_empty, ['A', '', 'B', None, 'C', '  ']))
# 结果: ['A', 'B', 'C']

可见filter的用法突出一个“筛选”
注意到filter()函数返回的是一个Iterator,也就是一个惰性序列,所以要强迫filter()完成计算结果,需要用list()函数获得所有结果并返回list。

函数作为返回值

函数除了作为代码块,作为接收参数,还可以把函数作为结果返回。
例子:

可变参数的求和:

通常

def calc_sum(*args):
    ax = 0
    for n in args:
        ax = ax + n
    return ax

如果,不需要立即求和,而是在后面根据需要在计算,那就可以不返回求和结果,而是这个函数:

def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum

调用lazy_sum()时,返回的并不是求和结果,而是求和函数:

>>> f = lazy_sum(1, 3, 5, 7, 9)
>>> f
<function lazy_sum.<locals>.sum at 0x101c6ed90>

调用函数f时,才真正计算求和的结果:

>>> f()
25

每次的调用都会返回一个新的函数,即使是传入相同的参数。

好啦,今天的函数式编程就聊到这里啦,拜拜!

Guess you like

Origin blog.csdn.net/VincentLee7/article/details/129272221