Python函数式编程

来源:互联网 发布:电子券怎么在淘宝使用 编辑:程序博客网 时间:2024/06/06 15:01

参数类型:func(*args, **kw)万能的
1、必要参数;
2、默认参数:定义时给一个默认值;
3、可变参数:*开头
4、关键字参数:**开头
5、命名关键字参数:*后面的参数作为命名范围
6、参数组合:必选参数、默认参数、可变参数、命名关键字参数、关键字参数;
函数式编程(是可以把函数当做参数传递,并且可以把函数retrun的编程方式)
1、变量名可以指向函数(java只能指向基本数据类型或者引用数据类型);

>>> f = abs>>> f<built-in function abs>

2、函数名也是变量
a)我们可以将函数abs赋予别的对象,这时候就不能通过abs调用abs()函数了,只有重启python环境才会恢复;
3、传入函数
a)函数作为参数传入函数;

>>> def add(x,y,f):...     return f(x)+f(y)...>>> add(-1,-9,abs)>10

Map/Reduce(python内创建map和reduce函数)
1、map()接受两个参数一个函数,一个iterable,并把结果作为新的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]

2、reduce()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

{}[]会对应list里的元素取出字典里的值,list里只能有一个值;
Map/Reduce会把str类型视为list单个字符进行处理;如下

>>> from functools import reduce>>> def fn(x, y):...     return x * 10 + y...>>> def char2num(s):...     return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]...>>> reduce(fn, map(char2num, '13579'))13579

处理过程为:map方法把‘13579’拆分为单个元素去匹配char2num里面的元素取出来,然后返回一个list,然后就是reduce登场了;

Filter(filter())
1、传入一个函数和一个序列,根据函数但会的是true还是false来决定是是否保留还是会丢弃该元素;(TRUE保留反之删除)
2、Lambda表达式来创建匿名函数;

Sorted(排序sorted())
1、两种用法:
a)普通用法:sorted(list)默认从小到大;
b)高阶用法:stored(list,key=xx):key指定的函数作用于list上的每一个函数再进行排序(注意:最终的结果list的值不会改变);
c)字符串的比较默认是按照ASCII值进行排序;
d)进行反向排序只需要在key后面加上reverse=True就可以了,当有多个函数时用“,”分开;

返回函数
1、可以将函数作为参数,也可以将函数作为返回值进行返回(当返回的是一个函数的时候,该函数并未执行不是一个确切的值,只有再次调用返回的函数时才会得到确切的值)

闭包
1、返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
2、如果一定要引用循环变量怎么办?方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变;也可用lambda改写

def count():    fs = []    for i in range(1, 4):        def f():             return i*i        fs.append(f)    return fsf1, f2, f3 = count()变化后如下: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

匿名函数(lambda)
只能有一个表达式,不用写return,返回值就是该表达式的结果。

装饰器(decorator)
1、借助Python的@语法
一个完整的装饰器代码如下:

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

2、若decorator本身需要传参数则只需要再加一个返回decorator的高阶函数即可;

偏函数(由functools提供)
1、进制转换int(_,base)base为默认参数值默认为10;
2、functools.partial就是帮助我们创建一个偏函数的,代码如下:

>>> import functools>>> int2 = functools.partial(int, base=2)>>> int2('1000000')64

functools.partial的作用就是把一个函数的参数给固定住

0 0