高阶函数
-实参是一个函数名
-函数的返回值是一个函数
函数本身也可以赋值给变量 变量可以指向函数
例子:求绝对值

print(abs(-11))                     ##abs函数作用于-11 abs函数是求绝对值的

内置高阶函数
1、map()函数
接收两个参数, 一个是函数, 一个是序列
map将传入的函数依次作用到序列的每个元素 并且把结果作为新的序列返回。
例子1:对于序列[-1,3,-4,-5]的每个元素求绝对值

print(list(map(abs,[-1,3,-4,5])))   ##map()表示传入一个函数,并且作用于列表

例子2:对于序列的每个元素求阶乘

import random
	def factoria(x):                   					 ##构造一个求阶乘的函数
	    res = 1
	    for i in range(1,x+1):
	        res =res* i
	    return res
	li = [random.randint(2,7) for i in range(10)]       ##构造一个列表
	print(list(map(factoria,li)))                       ##将函数内置,作用与列表

2、内置高阶函数reduce
reduce是把结果继续和和序列的下一个元素作累积运算,
reduce接受两个参数
python2.x中,reduce是内置函数
python3.x中,需要导入,即from functools import reduce
例子1,累加

from functools import reduce        ##导入reduce
def multi(x,y):
    return x+y
print(reduce(multi,range(1,4)))

例子2,累乘

from functools import reduce
def multi(x,y):
    return x*y
print(reduce(multi,(1,2,3,4)))

3、内置高阶函数filter
filter和map函数相似,也是接收一个函数和一个序列
filter把传入和函数依次作用,并根据返回值是True还是False决定保留还是丢弃,True保留,False丢弃,相当于过滤
例子,求偶数

def isodd(num):                             ##构造一个求偶数的函数
	    if num%2 ==0:
	        return True
	    else:
	        return  False
	print(list(filter(isodd,range(30))))        ##类似于map,需要加list显示输出值

4、内置高阶函数sorted
默认sort和sorted方法由小到大进行排序,resverse=True表示由大到小排序
例子1,由大到小排序

li = [1,2,3,4]
a= li.sort(reverse=True)      #resverse=True表示由大到小排序
print(li)

例子2:

info = [
		    #   商品  数量  价格
		
		    ('apple1', 29 ,3),
		    ('apple2', 27 ,77),
		    ('apple3', 25 ,5),
		    ('apple4', 30 ,34),
		    ('apple5', 50 ,23)
		]
		
		print(sorted(info))             	 ##默认排序,是根据第一列进行排序
		
		def sorted_by_count(x):         	##定义函数返回第二列
		    return x[1]
		print(sorted(info,key=sorted_by_count))         ##按数量排序由小到大
		
		def sorted_by_price(x):
		    return x[2]
		print(sorted(info,key=sorted_by_price))         ##按价格排序,由小到大
		
		def sorted_by_count_price(x):
		    return x[1],x[2]
		print(sorted(info,key=sorted_by_count_price))   ##先按数量由小到大,数量相等,再根据价格

例题:
(2018-携程-春招题)题目需求:
给定一个整形数组, 将数组中所有的0移动到末尾, 非0项保持不变;
在原始数组上进行移动操作, 勿创建新的数组;
输入:
第一行是数组长度, 后续每一行是数组的一条记录;
4
0
7
0
2
输出:
调整后数组的内容;
7
2
0
0

n = int(input())             		   ##此处的input是输入列表长度
li = [int(input()) for i in range(n)]  ##此处n是表循环几次,即列表的长度,此处input是输入列表元素
def  move(x):
    if x == 0:
        return 2             		   	##把0元素转换成返回值2
    else:
        return 1            		    ##非0元素转换成返回值1
print(sorted(li,key=move))   			##把0转换为2,非0转换成1,因为sorted函数是由小到大排序,由小到大排序时就可以得到结果

5、匿名函数
匿名函数的关键字为lambda
冒号前面的是形参, 冒号后面的是返回值
#求x+y

from functools import reduce
print(reduce(lambda x,y:x+y,[1,2,3,4,5]))

#求平方

print(list(map(lambda x:x**2,range(5))))

#求100以内偶数

print(list(filter(lambda x:x%2==0,range(100))))

例题:有一个整数列表(10个元素),要求调整元素顺序,把所有的奇数放在前面,偶数放在后面

import random
		s1 = [ random.randint(1,10) for i in range(10)]
		# def move(x):
		#     if x%2==0:
		#         return 2
		#     else:
		#         return 1
		# print(sorted(s1,key=move))
		
		print(sorted(s1,key=lambda x:1 if x%2==0 else 0))       ##返回值是1,反之即else返回值是0,然后根据0,1排序

例子:利用map和reduce编写一个str2float函数,把字符串’123.456’转换成浮点数123.456

from functools import reduce
		def str2float(s):
		    ch = {str(x):x for x in range(10)}      ##'0' 0 '1' 1  '2' 2
		    L= s.split('.')     ##将字符串分割开
		    n1 = reduce(lambda x,y:x*10+y,map(lambda x:ch[x],L[0]))     ##整数部分,L[0]表示分割的第一部分,即整数部分
		    #map的作用:‘0’ ==>0, ‘1’ ==>1 '2' ==>2
		    #'123' ==> [1,2,3] 1*10+2=12  12*10+3 =123,小数部分同理
		    n2 = reduce(lambda x,y:x*10+y,map(lambda x:ch[x],L[1]))     ##小数部分,L[1]表示分割的第二部分,即小数部分
		    n2 *=0.1**len(L[1])     ##小数部分乘0.1的len(L[1])次方加整数
		    return n1 + n2
		num = str2float('123.456')
		print(num)

例子,回文数是指从左向右读和从右向左读都是一样的数,例如12321,909。请利用filter()筛选出回文数

from functools import reduce
def huiwenshu(n):
    l = list(str(n))        ##数字变成一个列表
    l.reverse()             ##反转
    #数学计算,回文数
    num =reduce(lambda x,y:int(x) *10 + int(y),l)
    return num ==n
output = filter(huiwenshu,range(1,1000))
print('1~1000: ',list(output))