概述
函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一
个函数!
高阶函数
1.变量可以指向函数
# 变量可以指向函数
#求-10的绝对值
print(abs(-10))
print(abs)
10
<built-in function abs>
#abs()代表对函数的调用 abs是函数本身
2.函数名也是变量
f=abs #f变量也是指向abs所指向的函数
#是否可以通过该变量f来调用这个函数?
print(f(-10))
10
#结论:变量f指向了abs函数本身
既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另外一个函数作为参数,
这种函数就称为高阶函数
def add(x,y,f):
return f(x)+f(y) #abs(-10)+abs(5)
print(add(-10,5,abs))
15
函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编
程范式。Python 内建的高阶函数有 map、reduce、filter、sorted。
map
map()
函数接收两个参数,一个是函数,一个是序列,
map
将传入的函数依次作用到序
列的每个元素,并把结果作为新的
list
返回。
'' map(func, *iterables) --> map object Make an iterator that computes the function using arguments from each of the iterables. Stops when the shortest iterable is exhausted. '''
# 一个函数f(x)=x2,要把这个函数作用在一个list [1, 2, 3, 4, 5, 6, 7, 8, 9]
a=[1,2,3,4,5,6,7,8,9]
def f(x):
return x*x
result_list=[]
for i in a:
result_list.append(f(i))
print(result_list)
[1, 4, 9, 16, 25, 36, 49, 64, 81]
#使用map实现
it=map(f,a) #返回的it是一个可迭代的对象
print(it)
print(type(it))
<map object at 0x000001DC22E38100>
<class 'map'>
#判断是否是可迭代的对象
from collections import Iterator
print('判断是否是可迭代的:',isinstance(it,Iterator))
print(list(it))
判断是否是可迭代的: True
[1, 4, 9, 16, 25, 36, 49, 64, 81]
map 实现将 list 所有数字转为字符串
a=10
#将10转换为字符串
s=str(a)
print(type(s))
a=[1,2,3,4,5,6,7,8,9] #将列表中每个元素转换为字符串
L=map(str,a)
print(list(L))
<class 'str'>
['1', '2', '3', '4', '5', '6', '7', '8', '9']
map 函数传入两个列表
a=[1,2,3,4]
b=[10,20,30]
def f(x,y):
return x+y
L=map(f,a,b)
print(list(L))
[11, 22, 33]
reduce
reduce
把一个函数作用在一个序列
[x1, x2, x3...]
上,这个函数必须接收两个参数,
reduce
把结果继续和序列的下一个元素做累积计算,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
reduce 实现对一个序列求和
from functools import reduce
#计算一个序列的求和
a=[1,2,3,4,5,6,7,8,9,10]
sum=0
for i in a:
sum+=i
print('累加和:',sum)
def sumTest(x,y):
return x+y
sum=reduce(sumTest,a)
print('reduce计算列表求和:',sum)
累加和: 55
reduce计算列表求和: 55
from functools import reduce
#把序列[1, 3, 5, 7, 9]变换成整数13579。将列表中的每个元素乘以10加上后一个元素。
a=[1, 3, 5, 7, 9]
def fun(x,y):
return x*10+y
result=reduce(fun,a)
print(result)
- 13579
filter
Python
内建的
filter()
函数用于过滤序列。和
map()
类似,
filter()
也接收一个函数和一个
序列。和
map()
不同的时,
filter()
把传入的函数依次作用于每个元素,然后根据返回值是
True
还是
False
决定保留还是丢弃该元素。
filter 过滤列表,删掉偶数,只保留奇数
#在一个列表中,删掉偶数,保留奇数
def is_odd(n):
# if n%2==0:
# return False
# else:
# return True
return n%2 == 1
L=filter(is_odd,[1,2,3,4,5,6,7,8,9,10])
print(list(L))
[1, 3, 5, 7, 9]
一个序列中的空字符串删掉
#一个序列中的空字符串删掉
a=['A', '', 'B', None, 'C', ' ']
def not_empty(s):
return s and s.strip()
L=filter(not_empty,a)
print(list(L))
['A', 'B', 'C']
sorted
排序算法,排序也是在程序中经常用到的算法。
#1.对数值进行排序
sort_list=sorted([42,422,4,2,-100,3,-10])
print('默认升序排序',sort_list)
#逆序排序,给sorted添加reverse参数
sort_list=sorted([42,422,4,2,-100,3,-10],reverse=True)
print('逆序',sort_list)
#对字符串ASCII A:65 a:97
sort_list=sorted(['abc','ad','ABC','D','d','C'])
print('字符串排序',sort_list)
sort_list=sorted(['abc','ad','ABC','D','d','C'],reverse=True)
print('字符串逆序排序',sort_list)
#sorted是高阶函数,他还可以接收一个key函数来实现自定义的排序
#对数值列表,按绝对值的大小排序
sort_list=sorted([42,422,4,2,-100,3,-10],key=abs)
print('默认升序排序',sort_list)
#对字符串列表,忽略大小写
sort_list=sorted(['abc','ad','ABC','D','d','C'],reverse=True,key=str.lower)
print('字符串逆序排序',sort_list)
默认升序排序 [-100, -10, 2, 3, 4, 42, 422]
逆序 [422, 42, 4, 3, 2, -10, -100]
字符串排序 ['ABC', 'C', 'D', 'abc', 'ad', 'd']
字符串逆序排序 ['d', 'ad', 'abc', 'D', 'C', 'ABC']
默认升序排序 [2, 3, 4, -10, 42, -100, 422]
字符串逆序排序 ['D', 'd', 'C', 'ad', 'abc', 'ABC']
最后
以上就是轻松枕头为你收集整理的python函数式编程及高级函数高阶函数mapreducesorted 的全部内容,希望文章能够帮你解决python函数式编程及高级函数高阶函数mapreducesorted 所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复