高阶函数
关于函数,我们先提一下数学的概念:y=f(g(x));先给函数g()给一个参数x,然后将g(x)作为一个参数给函数f(),最终构成的y=f(g(x)),就是一个高阶函数;在数学与计算机科学中,高阶函数应是至少满足下列至少一个条件的函数:
- 接受一个或多个函数
- 输出一个函数
高阶函数-内建函数
python中常用的内建函数一般有三种:
- 排序函数:sorted(iterable[,key][,reverse])
返回一个新的列表,对一个可迭代对象的所有元素排序,排序规则为key定义的函数,reverse表示是否排序翻转
sorted(lst,key=lambda x:6-x) # 返回新列表
list.sort(key=lambda x:6-x) # 就地修改
- 过滤数据:fifter(function,iterable) -->fifter object
过滤可迭代对象的元素,返回一个迭代器 function一个具有一个参数的函数,返回bool
例如,过滤出数列中能被3整除的数字:
list(filter(lambda x: x%3=0, [1,9,55,150,-3,78,28,123]))
map(function, iterables) --> map object
3. 映射:map(func,*iterables) -->map object对多个可迭代对象的元素按照指定的函数进行映射,返回一个迭代器
list(map(lambda x:2*x+1, range(5)))
dict(map(lambda x: (x%5,x) , range(500)))
生成器
生成器generator
生成器指的是生成器对象,可以由生成器表达式得到,也可以使用yield关键字得到一个生成器函数,调用这个函数得到一个生成器对象
生成器函数函数体中包含yield语句的函数,返回生成器对象
生成器对象,是一个可迭代对象,是一个迭代器
生成器对象 ,是延迟计算,惰性求值的
举例:
def inc():
for i in range(5):
yield i
print(type(inc)) #输出为一个地址
print(type(inc()))
x = inc()
print(type(x)) #输出的就是一个迭代器
print(next(x)) #输出的为一个具体的值
for m in x:
print(m, '*')
for m in x:
print(m, '**’)
普通的函数调用fn(),函数会立即执行完毕,但是生成器函数可以使用next函数多次执行
生成器函数等价于生成器表达式,只不过是生成器函数可以更加的复杂
生成器函数:
包含yield语句的生成器函数生成生成器对象的时候,生成器函数的函数体不会立即执行
next(generator)会从函数的当前位置向后执行到之后碰到的第一个yield语句,会弹出值,并暂停函数执行
再次调用next函数,和上一条一样的处理过程
没有多余的yield语句能被执行,继续调用next函数,会抛出StopIteration异常
map函数
map函数需要给两个参数,ps:其中的一个参数要是函数f( ),另外一个是一个可迭代对象iter,函数执行的时候,迭代对象iter中的每一个元素都会做为函数f( )的参数,最终会生成一个新的列表。
计算:f(x)=x**2
代码实现如下:
#!/usr/bin/python3
def y(x):
return x**2
l = list(map(y,[1,2,3,4,5,6,7,8,]))
print(l)
输出结果为:[1,4,9,16,25,36,49,64]
reduce函数
reduce的作用是把一个函数作用在一个序列上,这个函数必须接收两个参数,reduce会把这个函数的结果继续和序列的下一个元素做累积计算,最终返回一个值;
计算1~9的累积和;
代码实现如下:
from functools import reduce
def f(num,a):
return num+a
n = reduce(f,[1,2,3,4,5,6,7,8,9])
print(n)
输出结果为:45