map/reduce - map的格式是map(f,[a,b,c]),就是把a,b,c依次的代入到f函数中直行,并且返回一个list类型的结果。其目的是将函数的作用抽象化 - 返回的结果是一个list,所以需要先y = list(map(f,[])),然后再print(x)。 - reduce的作用是把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)。 - 使用reduce的时候需要from functools import reduce
filter - 也是接收两个参数,其中一个是函数,另一个输入是序列。但是不同于map的点在于,输入函数的返回值要求是bool型的。比如,删掉序列中的不是5的倍数的元素
# -*- coding:utf-8 def is_5(x): return x % 5 == 0 x = list(filter(is_5,[1,2,3,5,10,7,8,15,4,20])) print(x)廖雪峰的网站上的讲解题目是“埃氏算法”寻找序列中的素数,其中用到了lambda,还需要理解,尤其是如何将变量序列传递进去,因为
# -*- coding: utf-8 -*- #判断是否可除尽 def is_divisible(n): return lambda x : x % n != 0 def jud(x): return list(filter(is_divisible(x[0]),x)) def find_prime(x): L = [] while( len(x) > 1 ): L.append(x[0]) x = jud(x) L.append(x[0]) return L # 测试 a = range(2,1000,1) a = list(a) b = find_prime(a) print(b)sorted 也是一个高阶函数,可以接收一个key函数进行检索,格式如下:sorted(list,key = func_name),表示对list进行函数func_name的变换之后,再进行排序。甚至可以传入多个函数 比如sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True),表示先将首字母小写之后排序,并且是逆序
返回函数 就是定义在函数内部的函数,并且通过return返回该函数以及该函数的一些引申。但是,如果不加括号(),就可以不得到函数的运算值,加了括号()就可以获得函数的值。 要注意的是:在函数中不要代入会改变的值,比如循环的值,因为只会得到最后的代入值结果。
匿名函数 lambda应该就是匿名函数。我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。 所以这样就可以解释前面提到的使用lambda的地方了?(还是不能解释为什么没有传递,X就进入到里面共调用了)
装饰器 之前讲过函数可以赋值给变量,那么可以通过调用变量的__name__属性来查看函数的名字。(注意是两个下划线) 装饰器:在函数定义之前放置@装饰器的名称,这样在调用函数的时候,首先会执行装饰器的内容,然后执行函数本身 不想看装饰器的后面部分了
偏函数 就是在有的时候传入的变量数目太多,而且有有一些固定的时候,可以使用偏函数创建新函数,固定住一些函数。比如int2 = functools.partial(int,base = 2)就是固定住传进去的base,然后重新生成一个函数。使用的时候需要import functools。