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
。