所谓高阶函数,简单点说就是将一个函数作为另一个函数的传入参数,这样我们就称这个组合函数为高阶函数。
举个例子:
map()函数能接收两个参数,一个为函数,一个为Interable。
函数f(x)=x*3,运用此函数将列表[1,2,3,4,5,6]中的元素扩大3倍。
#高阶函数
deff(x):
returnx*3
y =map(f,[1,2,3,4,5,6])
print(list(y))
输出是:
[3, 6, 9, 12, 15, 18]
如果不使用“list()”,会怎样呢?
#高阶函数
deff(x):
returnx*3
y =map(f,[1,2,3,4,5,6])
print(y)
输出:
解释:因为map()传出的结果是Iterator,要将惰性序列用list()进行转化。
运用map()可以构造更复杂的函数。
举个例子:
ruduce()把一个函数“依次”作用在一个列表中的元素上,reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
计算一个数列的和:
#函数ruduce()的用法
fromfunctoolsimportreduce
defadd(x,y):
returnx + y
z = reduce(add,[1,3,5,7,9])
print(z)
练习1:
数据处理,利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。
输入:['adam', 'SUXIAOZHUA', 'iT']
输出:['Adam', 'Suxiaozhua', 'It']
#将用户输入的字符改为首字母大写,其他小写
defnormalize(name):
x = name.capitalize()
returnx
L1 = ['adam','SUXIAOZHUA','iT']
L2 =list(map(normalize,L1))
print(L2)
输出确认:
['Adam', 'Suxiaozhua', 'It']
练习2:
求一个数列的积:
#编写一个prod()函数,可以接受一个list并利用reduce()求积
fromfunctoolsimportreduce
defprod(L):
defmul(x,y):
returnx*y
returnreduce(mul,L)
print('3 * 5 * 7 * 9 =',prod([3,5,7,9]))
输出:
3 * 5 * 7 * 9 = 945
利用filter()函数进行列表数据的筛选:
从自然数中选出素数,使用埃拉托色尼筛选法(the Sieve of Eratosthenes)——简称埃氏筛法,是古希腊数学家埃拉托色尼(Eratosthenes 274B.C.~194B.C.)提出的一种筛选法。 是针对自然数列中的自然数而实施的,用于求一定范围内的质数,它的容斥原理之完备性条件是p=H~。
步骤:
(1)先把1删除(现今数学界1既不是质数也不是合数)
(2)读取队列中当前最小的数2,然后把2的倍数删去
(3)读取队列中当前最小的数3,然后把3的倍数删去
(4)读取队列中当前最小的数5,然后把5的倍数删去
(5)如上所述直到需求的范围内所有的数均删除或读取
#自然数中的素数筛选器
def_odd_iter():
n =1
while True:
n = n +2
yieldn
def_not_divisible(n):
return lambdax: x % n >
defprimes():
yield2
it = _odd_iter()# 初始序列
while True:
n =next(it)# 返回序列的第一个数
yieldn
it =filter(_not_divisible(n),it)# 构造新序列
# 打印1000以内的素数:
forninprimes():
ifn
print(n)
else:
break
练习:
筛选出200以内的回数——回数是从左往右读和从右往左读都一样的数。
#筛选出200以内的回数
defis_palindrome(n):
returnn==int(str(n)[::-1])
print(list(filter(is_palindrome,range(1,200))))
输出结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99, 101, 111, 121, 131, 141, 151, 161, 171, 181, 191]
使用sorted()函数对list进行排序:
假设我们用一组tuple表示学生名字和成绩:L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
分别按照学生名字和成绩进行排序练习
defby_name(t):
returnt[].lower()
defby_score(t):
returnt[-1]
L = [('Bob',75),('Adam',92),('Bart',66),('Lisa',88),('at',20)]
L1 =sorted(L,key=by_name)
L2 =sorted(L,key=by_score)
print(L1)
print(L2)
输出:
[('Adam', 92), ('at', 20), ('Bart', 66), ('Bob', 75), ('Lisa', 88)]
[('at', 20), ('Bart', 66), ('Bob', 75), ('Lisa', 88), ('Adam', 92)]
领取专属 10元无门槛券
私享最新 技术干货