Python之高阶函数


高阶函数

简单来说,把函数作为参数传入的函数称为高阶函数

map()映射函数

内置函数,一般接收两个参数(也可多个,取决于传入函数的接收个数),第一个是作用的函数,第二个为可迭代对象

def f(x):
    return x*x
lst = [1,2,3,4,5]
result = map(f,lst)		# 返回迭代器
print(list(result))

lst2 = [100,200,300]
result =  map(lambda x,y:x+y, lst, lst2)	# 一句话函数可用匿名函数;两个lst长度不同时,不报错,但结果与最短lst的长度相同

result = map(str,lst)	# 传入str函数,将lst中的数字转换为字符串

filter()过滤函数

用于过滤序列,同map类似,接收一个函数和一个序列,只接收两个参数

将传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。

返回的仍是一个迭代器,也就是惰性序列

# 过滤出200以内开平方是整数的数
import math
def f(x):
	return math.sqrt(x) % 1 == 0	# 返回的bool值
print(list(filter(f,range(1,200))))

sorted()排序函数

同样接收函数和序列,先对序列进行处理后再排序,并且不会对原序列进行修改

>>> lst = [2,1,-8,34,5,-32]
>>> print(sorted(lst, key=abs))		# 按绝对值来排序
[1, 2, 5, -8, -32, 34]
对于包含元组和True、False的列表
#列表里面包含元组,不支持元组和数字混合的列表排序
>>> lst = [(True,2), (False,2), (1,0), (True,0)]
>>> print(sorted(lst))		# 对于元组排序,先对所有元组比较第一个元素进行排序,再对有争议的比较第二个元素,依次类推
[(False, 2), (1, 0), (True, 0), (True, 2)]		# 其中True转换为1,False转换为0来进行比较

应用:

# ------第一题------
lst1=[7,-8,5,4,0,-2,-5]
#·正数在前负数在后
#·正数从小到大
#·负数从大到小
print(sorted(list1,key=Lambda x:(x<0,abs(x)))
# --- 也可以这样 ---
def trans(x):
        if x>=0:
                x = (0,abs(x))
        else:
                x = (1,abs(x))
        return x
print(sorted(lst,key=trans))
      
# ------第二题------
# 这是一个字符串排序,排序规则:小写<大写<奇数<偶数
# s ='asdf234GDSdsf23'
s = 'asdf234GDSdsf23'
def trans2(x):		# 这里分成了1*4种类别,有时如果有嵌套关系,可以分为2*2种类别来进行排序
        if x.isupper():
                x = (1,x)
        elif x.islower():
                x = (0,x)
        elif x.isdigit():
                if int(x) % 2 == 0:
                        x = (4,x)
                else:
                        x = (3,x)
        return x
print(sorted(s,key=trans2))		# ['a', 'd', 'd', 'f', 'f', 's', 's', 'D', 'G', 'S', '3', '3', '2', '2', '4']
      
# 或者更简洁的写法,虽然会增加一些判断
print(sorted(s,key=lambda x:(x.isdigit(), x.isdigit() and int(x)%2==0, x.isupper(), x)))
      
# ------第三题------
# 实现cat test.txt |grep hello |sort |uniq -c |sort -r的效果
d1={}
with open("test.txt")as fp:
	for line in fp:
		if "hello"in line:
			d1[line] = d1.get(line,0) + 1
print(d1.items())
print(sorted(d1.items(), key=lambda x:x[1], reverse=True))	# 这样就实现了按出现次数进行排序,次数多的排前面

reduce()迭代运算函数

• reduce把一个函数作用在一个序列[x1, x2, x3, …]上

• 这个函数必须接收两个参数

• reduce把结果继续和序列的下一个元素做累积计算

• reduce(f, [x1, x2, x3, x4]) => f(f(f(x1, x2), x3), x4)

需要从funtools中导入reduce模块

示例:

# 用Python-reduce代码实现:将列表[1,3,5,7,9],变成整数13579
from functools import reduce
def fn(x,y):
    return x * 10 + y
print(reduce(fn,[1,3,5,7,9]))

# 将列表[1,3,5,7,9],变成字符串13579
print(reduce(lambda x,y:str(x)+str(y),[1,3,5,7,9]))
print(''.join(map(str,[1,3,5,7,9])))	# 用map实现的第二种方法

# 实现阶乘
print(reduce(lambda x,y:x*y,[1,2,3,4]))
print(reduce(lambda x,y:x*y,range(1,5)))
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

只何

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值