Funtioncal Programming Tools

builtins

  • filter(iterable, func):过滤func返回布尔否值元素
  • enumerate(iterable):添加索引迭代
  • zip(*iterables):打包迭代元素
  • map(func, *iterables)func接受各迭代器中元素作为 参数调用(类似zip
  • iter:两种产生迭代器的模式
    • iter(iterable):返回迭代器
    • iter(callable, sentinel):调用callable直到返回 sentinel停止迭代(不包括)
      • 可用于替代while循环

itertools

itertools:包含为高效循环而创建迭代器的函数

无穷迭代器

  • count(start, step=1):步长累加
  • cycle(p):循环p中元素
  • repeat(elem, n=None):重复elem

迭代元素处理

  • accumulate(p, func=None):累加p中元素
  • chain(*iters):链接迭代器
  • chain.from_iterable(iterable):链接可迭代对象中迭代器
  • compress(data, selelctors):根据selectors选取data
  • dropwhile(pred, seq):保留首个满足pred之后所有元素
  • takewhile(pred, seq):保留首个不满足pred之前元素
  • filterfalse(pred, seq):反filter
  • groupby(iterable, key=None):根据key(v)值分组迭代器
  • islice(seq, start=0, stop=None, step=1):切片
  • starmap(func, seq):迭代对seq中执行func(*elem)
  • tee(iterable, n=2):复制迭代器,默认2个
  • zip_longes(*iters, fillvalue):依最长迭代器zip,较短 循环填充或fillvalue填充

排列组合

  • product(*iters, repeat=1):笛卡尔积
  • permutations(p, r=None)r长度的排列,缺省全排列
  • combinations(p, r)r长度组合
  • combinations_with_replacement(p,r):可重复组合

functools

functools:包含高阶函数,即参数、返回值为其他函数的函数

函数转换

  • cmp_to_key(func):将旧式比较函数转换新式key function

    • 常用在以下函数key参数中转换旧式比较函数
      • sorted
      • min
      • max
      • heapq.nlargest
      • heapq.nsmallest
      • itertools.groupby
    • key function:接收参数,返回可以用于排序的值
  • partial(func, *args, **kwargs):返回partial对象,其 调用时类似使用argskwargs调用func

  • partial.method(func, *args, **kwargs):适合类命名空间 中函数、描述器

  • update_wrapper(wrapper, wrapped, assigned=WRAPPER_ASSIGNMENTS, udpated=WRAPPER_UPDATES): 更新wrapper函数信息为wrapped函数信息

函数应用

  • reduce(func, iterable[, initializer]):使用func接受 两个参数,reduce处理iterable

函数装饰器

  • @lru_cache(maxsize=128, typed=False):缓存函数执行结果

    • 字典存储缓存:函数固定参数、关键字参数必须可哈希
    • 不同参数调用模式(如仅参数顺序不同)可能被视为不同 ,从而产生多个缓存项
    • 可以用于方便实现动态规划
  • @singledispatch:转换函数为单分派范型函数,实现python 的重载(接口多态)

    • single dispatch:单分派,基于单个参数类型分派的 范型函数分派形式
  • @wraps(wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES): 等价于partial(update_wrapper, wrapped, assigned, updated)

类装饰器

  • @total_ordering:根据类中已定义比较方法实现剩余方法
    • 类必须实现__eq__、其他富比较方法中任意一种

operator

operator:提供与python内置运算符对应的高效率函数

  • 为向后兼容,保留双下划线版本函数名(同特殊方法名)

比较运算

  • lt(a,b)/__lt__(a,b)
  • le(a,b)
  • eq(a,b)
  • ne(a,b)
  • ge(a,b)
  • gt(a,b)

逻辑运算

  • not(obj)
  • truth(obj):等价于使用bool构造器
  • is_(a,b)
  • is_not(a,b)

数值运算

  • add(a,b)
  • sub(a,b)
  • mul(a,b)
  • div(a,b)
  • pow(a,b)
  • mod(a,b)
  • floordiv(a,b)
  • truediv(a,b)
  • matmul(a,b)
  • abs(obj)
  • neg(obj)
  • pos(obj)

在位赋值

  • 在位运算对可变数据类型才会更新参数,否则只返回结果
  • iadd(a,b):等价于a += b
  • isub(a,b)
  • imul(a,b)
  • idiv(a,b)
  • ipow(a,b)
  • imod(a,b)
  • ifloordiv(a,b)
  • itruediv(a,b)
  • imatmul(a,b)

位运算

  • and_(a,b)
  • or_(a,b)
  • xor(a,b)
  • inv(obj)/invert(obj)
  • lshift(a,b)
  • shift(a,b)

在位运算

  • iand(a,b)
  • ior(a,b)
  • ixor(a,b)

索引

  • index(a)

序列运算

  • concat(a,b)
  • contains(a,b)
  • countOf(a,b)
  • delitem(a,b)
  • getitem(a,b)
  • indexOf(a,b)
  • setitem(a,b,c)
  • length_hint(obj, default=0)

访问函数

  • attrgetter(attr)/attrgetter(*attrs):返回函数,函数 返回值为参数属性attr
  • itemgetter(item)/itemgetter(*items):类似
  • methodcaller(name[, args...]):类似

Python 函数式编程

functools

total_ordering

total_ordering:允许类只定义__eq__和其他中的一个,其他 富比较方法由装饰器自动填充

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
from functools import total_ordering

class Room:
def __init__(self, name, length, width):
self.name = name
self.length = length
self.width = width
self.square_feet = self.length * self.width

@total_ordering
class House:
def __init__(self, name, style):
self.name = name
self.style = style
self.rooms = list()

@property
def living_space_footage(self):
return sum(r.square_feet for r in self.rooms)

def add_room(self, room):
self.rooms.append(room)

def __str__(str):
return "{}: {} squre foot {}".format(
self.name,
self.living_space_footage,
self.style)

def __eq__(self, other):
return self.living_space_footage == other.living_space_footage

def __lt__(self, other):
return self.living_space_footage < other.living_space_footage

C++函数式编程

<functional>

基类

  • binary_function<arg_type1, arg_type2, result_type>: 两个指定类型参数、返回指定类型的函数类的父类
  • unary_function<arg_type, result_type>:指定类型参数、 返回指定类型的函数类的父类

实现算数操作符类

  • plus<arg_type>+
  • minus<arg_type>-
  • multiples<arg_type>*
  • divides<arg_type>/
  • modulus<arg_type>%
  • negate<arg_type>-取反

实现比较操作

  • equal_to<arg_type>==
  • not_equal_to<arg_type>!=
  • less<arg_type><
  • less_equal<arg_type><=
  • greater<arg_type>>
  • greater_equal<arg_type>>=

实现逻辑关系

  • logical_and<arg_type>&&
  • logical_or<arg_type>||
  • logical_not<arg_type>!

产生函数对象

  • bind1st(fn, value):返回新一元函数对象,用与其绑定的 value作为首个参数调用二元函数对象fn
  • bind2nd(fn, value):返回新一元函数对象,用与其绑定的 value作为第二个参数调用二元函数对象fn
  • not1(fn):返回新函数对象,且该函数对象为一元函数对象 时返回true
  • not2(fn):返回新函数对象,且该函数对象为二元函数对象 时返回true
  • ptr_fun(fnptr):返回需要调用特定函数指针的新函数对象, 可能需要一个或两个同类型参数
    • 返回具有相同效果的函数对象,可以使得函数指针、 函数对象概念一体化,避免代码重复

1
2
3
4
5
6
7
8
count_if(v.begin(), v.end(), bind2nd(less<int>(), 0));
// 返回元素类型为整形的矢量对象`v`中负数数量
template<typename FunctionClass>
void func_func(FunctionClass fn);
void func_func(double (*fn)(double)){
// 函数重载+`ptr_fun`减少代码重复
func_func(ptr_func(fn));
}