Python中的“内置高阶函数”

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

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))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值