文章目录
概念
- 高阶函数:传递的参数包含另一个函数的函数名。
既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
- 例如:
def func(x,y,function): # 这里形参里包含一个函数
return function(x)+function(y)
print(func(2,-1,abs))
结果:
编写高阶函数,就是为了让函数的参数能够接收到别的参数。
Python内置的高阶函数
map()
- map()函数接收两个参数:一个是函数,一个是序列。map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。
- 我们通过以下实例,来更好的理解map()函数。
对目标序列每个元素求绝对值
li = [0,1,-2,3,-1,-9]
print(map(abs,li))
print(list(map(abs,li)))
结果:
对每个元素求平方
li = [0,1,-2,3,-1,-9]
def myPow(x):
return x ** 2
print(list(map(myPow,li)))
结果:
有10个2-7之间的随机数,对每个元素求阶乘
li1 = [random.randint(2, 7) for i in range(10)]
def jiecheng(x): # 定义一个阶乘函数
for i in range(1, x):
x *= i
return x
print(li1)
print(list(map(jiecheng, li1)))
结果:
将list中的元素全部转换成int类型
s = '1 2 3 4 5'
print(list(map(int, s.split())))
结果:
规范用户输入名
li = ['adam', 'LISA', 'barT']
def myTitle(str):
return str[0].upper()+str[1:].lower()
print(list(map(myTitle,li)))
结果:
reduce()
-
reduce把一个函数作用在一个序列[x1, x2, x3…]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算。
例如:reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
-
Python3中,reduce需要通过functools导入才能使用。
-
我们通过示例,更好的理解reduce函数。
求和(累加)
from functools import reduce
# reduce(f,[x1,x2,x3]) = f(f(x1,x2),x3))
li = [1, 2, 3, 4, 5]
def mySum(x, y):
return x + y
print(reduce(mySum, li))
print(sum(li))
结果:
累乘
def multi(x,y):
return x * y
print(reduce(multi,range(1,6)))
str转换int
- 1 首先,利用reduce,累积运算,将list转换成int
li = [1, 2, 3, 4, 5]
def fn(x,y):
return 10 * x + y
# 利用reduce,累积运算,将list转换成int
print(reduce(fn,li))
结果:
- 2 考虑到str也是一个序列,通过结合map,实现将str转换成int
def str2int(str):
def char2int(str):
return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[str]
def fn(x, y):
return 10 * x + y
return reduce(fn,map(char2int,str))
print(type(str2int('1995')))
print(str2int('1995'))
结果:
filter()
Python内建的filter()函数用于过滤序列。
和map()类似,filter()也接收一个函数和一个序列。和map()不同的时,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
list中只保留偶数
def isOdd(num):
if num % 2 == 0:
return True
else:
return False
print(filter(isOdd,range(101)))
print(list(filter(isOdd,range(101))))
结果:
删除1~100的素数
def notPrime(num):
for i in range(2,num):
if num % i == 0:
return True
else:
return False
print(list(filter(notPrime,range(2,101))))
结果:
sorted()
sorted(iterable,key,reverse),其中iterable代表可迭代对象,key是一个函数,用来选取参与比较的元素,reverse用来指定是顺序还是倒序,reverse = True是倒序,默认情况下reverse = False。
- 示例:对商品信息按照不同的属性进行排序
appleInfo = [
('apple3',200,32),
('apple1',40,12),
('apple2',40,2),
('apple4',1000,23),
('apple5',40,5)
]
print(appleInfo)
# 默认以首项进行排序
print(sorted(appleInfo))
# 以数量排序
def sort_by_num(x):
return x[1]
print(sorted(appleInfo,key=sort_by_num))
# 以价格排序
def sort_by_price(x):
return x[2]
print(sorted(appleInfo,key=sort_by_price))
#先按照商品数量由小到大排序,如果商品数量一样
#则按照商品价格由小到大排序
def sort_by_num_price(x):
return x[1],x[2]
print(sorted(appleInfo,key=sort_by_num_price))
sort相关笔试题(携程笔试)
题目描述:
(2018-携程-春招题)题目需求:
给定一个整形数组, 将数组中所有的0移动到末尾, 非0项保持不变;
在原始数组上进行移动操作, 勿创建新的数组;
# 输入:
第一行是数组长度, 后续每一行是数组的一条记录;
4
0
7
0
2
# 输出:
调整后数组的内容;
7
2
0
0
def mySort(x):
if x != 0:
return 1
else:
return 0
print('输入数组长度及元素:')
inLen = int(input())
li2 = [int(input()) for i in range(inLen)]
for i in range(inLen):
print(sorted(li2,key=mySort,reverse=True)[i])
结果:
匿名函数:lambda
匿名函数:关键字为lambda ,冒号前面是形参,冒号后面是返回值。
示例
- 利用lambda实现阶乘
from functools import reduce
print(reduce(lambda x, y: x * y, range(1, 5)))
结果:
- 利用lambda实现找到100以内的偶数
print(list(filter(lambda x:True if x%2 == 0 else False,range(101))))
结果:
- 找素数简洁写法:
print([i for i in range(2,20) if not [y for y in range(2,i) if i % y == 0]])
结果:
- 对携程那道笔试题的函数部分使用lambda,即非0项顺序不变,0项统一后移到末尾
nums = [0, 7, 0, 1, 2, 1, 5,1, 7, 8, 0, 67, 1, 3, 4]
print(sorted(nums,key=lambda x:1 if x == 0 else 0))
结果: