python函数式编程

1.高阶函数

将函数作为参数传入

1)map/reduce

map:传入两个参数,一个是函数,一个是迭代器,主要作用是将运算规则抽象化表达,如:

>>> def f(x):
    return x * x

>>> r = map(f,[1,2,3,4,5,6,7])
>>> list(r)
[1, 4, 9, 16, 25, 36, 49]

reduce:传入两个参数,做累计效果

将[1,3,5,6]变成1356

>>> from functools import reduce
>>> def fn(x,y):
    return x*10 + y

>>> reduce(fn,[1,3,5,6])
1356

也可将str转换成int

from functools import reduce

DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}

def str2int(s):
    def fn(x, y):
        return x * 10 + y
    def char2num(s):
        return DIGITS[s]
    return reduce(fn, map(char2num, s))

2)fliter:用于过滤序列

def is_odd(n):
    return n % 2 == 1

list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 结果: [1, 5, 9, 15]

3)sorted:排序操作,实现字符串、列表等的排序

默认是从小到大排序

>>> sorted([36,2,-34,5,9])
[-34, 2, 5, 9, 36]

也可以接受一个key,做自定义排序,此处按照绝对值大小进行排序

>>> sorted([39,-37,-1,-39],key=abs)
[-1, -37, 39, -39]

2.返回函数

返回的函数在其定义内部引入了局部变量,当一个函数返回了一个函数后,其内部的局部变量还被新函数引用

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

def count():
    fs = []
    for i in range(1, 4):
        def f():
             return i*i
        fs.append(f)
    return fs

f1, f2, f3 = count()
>>> f1()
9
>>> f2()
9
>>> f3()
9
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
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

3.匿名函数

def is_odd(n):
    return n % 2 == 1

L = list(filter(is_odd, range(1, 20)))
L = list(filter(lambda x: x % 2 == 1, range(1, 20)))

4.装饰器函数

完整的装饰器函数写法:

import functools

def log(func):
    @functools.wraps(func)
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__)
        return func(*args, **kw)
    return wrapper

import functools

def log(func):
    @functools.wraps(func)
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__)
        return func(*args, **kw)
    return wrapper

5.偏函数

简单总结functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。

原文地址:https://www.cnblogs.com/quanmeng/p/11854783.html