简单来说,把函数作为参数传入的函数称为高阶函数
内置函数,一般接收两个参数(也可多个,取决于传入函数的接收个数),第一个是作用的函数,第二个为可迭代对象
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中的数字转换为字符串
用于过滤序列,同map类似,接收一个函数和一个序列,只接收两个参数
将传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
返回的仍是一个迭代器,也就是惰性序列
# 过滤出200以内开平方是整数的数
import math
def f(x):
return math.sqrt(x) % 1 == 0 # 返回的bool值
print(list(filter(f,range(1,200))))
同样接收函数和序列,先对序列进行处理后再排序,并且不会对原序列进行修改
>>> lst = [2,1,-8,34,5,-32]
>>> print(sorted(lst, key=abs)) # 按绝对值来排序
[1, 2, 5, -8, -32, 34]
#列表里面包含元组,不支持元组和数字混合的列表排序
>>> 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把一个函数作用在一个序列[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)))