python中的高阶函数
1.高阶函数
高阶函数
-实参是一个函数
-函数的返回值也是一个函数
函数本身也是可以赋值给变量的 变量可以指向函数
print(abs(-10))
f = abs #f=1
print(f(-10))
def fun(x,y,f):
return f(x),f(y)
print(fun(-10,34,abs))
2.内置高阶函数map
map():接收两个参数,一个是函数 一个是序列
map将传入的函数依次作用到序列的每个元素,并且把结果作为新的序列返回
eg: 对一个序列[-1,3,-4,-5]的每一个元素求绝对值
print(list(map(abs,[-1,3,-4,-5])))
eg: 对每个元素求阶乘
def f(x):
"""对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(f,li)))
3.内置高阶函数reduce
reduce():把一个函数作用在一个序列上,这个函数必须接收两个参数
reduce把结果继续和序列的下一个元素做累积计算
reduce(f,[x1,x2,x3,x4]) = f(f(x1,x2),x3),x4)python2中:reduce是内置函数
python3中:需要引入模块from functools import reduce:
from functools import reduce
def multi(x,y):
return x * y
print(reduce(multi,range(1,10)))
def add(x,y):
return x+y
print(reduce(add,range(1,101)))
4.高阶函数练习
将一个字符串(‘331’)转换成整型
from functools import reduce
def str2int(s):
def char2int(ch):
c = { str(x): x for x in range(10)}
print(c)
return c[ch]
def fun(n1,n2):
return n1 * 10 + n2
return reduce(fun,map(char2int,s))
num = str2int('1234')
print(type(num),num)
5.内置高阶函数filter
filter过滤函数
和map()类似的,也接收一个函数和一个序列
但是和map()不同的是 filter()把传入的函数依次作用于
序列的每个元素 然后根据返回值是True或者False决定保留还是丢弃该元素
def isodd(num):
if num % 2 == 0:
return True
else:
return False
print(list(filter(isodd,range(100))))
结果:
6.匿名函数
匿名函数的关键字 lambda
冒号前面是 形参 冒号后面是返回值
from functools import reduce
# def add(x,y):
# return x+y
# print(reduce(add,range(100)))
print(reduce(lambda x,y:x+y,range(100)))
#
# def mypow(num):
# return num ** 2
print(list(map(lambda x:x**2,range(5))))
def isood(num):
return num%2 ==0
print(list(filter(lambda x:x%2==0,range(100))
7.练习
1.回数是指从左向右读和从右向左读都是一样的数,例如12321,909
。请利用filter()筛选出回数
from functools import reduce
def is_palindrome(n):
l = list(str(n)) #['1','0' ]
l.reverse() # ['0','1'] #
# print(l.reverse())
# 1*10+0 = 10
num = reduce(lambda x,y:int(x) * 10 + int(y),l)
return num == n
a= is_palindrome('10')
print(a)
output = filter(is_palindrome,range(1,1000))
print('1~1000:',list(output))
def normalize(name):
return list(map(lambda x:x.capitalize(),name))
2.利用map()函数,把用户输入的不规范的英文名字,
变为首字母大写,其他小写的规范名字
L = ['adam','LISA','TOM']
print(normalize(L))
3.利用map和reduce编写一个str2float函数,
把字符串’123.456’转换成浮点数123.456
def str2float(s):
ch = { str(x):x for x in range(10)}
# 先将字符串分割
l = s.split('.')
# 将整数部分
n1 = reduce(lambda x,y:x*10+y,map(lambda x:ch[x],l[0]))
# 将小数部分
n2 = reduce(lambda x,y:x*10+y,map(lambda x:ch[x],l[1]))
n2 *= 0.1**len(l[1]) # a *=1 a = a*1 n2 = n2 * 0.1**4
return n1 + n2
num = str2float('1234.4567')
print(num)
还没有评论,来说两句吧...