Python的高阶函数用法实例分析


Posted in Python onApril 11, 2019

本文实例讲述了Python的高阶函数用法。分享给大家供大家参考,具体如下:

高阶函数

1.MapReduce

MapReduce主要应用于分布式中。

大数据实际上是在15年下半年开始火起来的。

分布式思想:将一个连续的字符串转为列表,元素类型为字符串类型,将其都变成数字类型,使用分布式思想【类似于一件事一个人干起来慢,但是如果人多呢?效率则可以相应的提高】,同理,一台电脑处理数据比较慢,但是如果有100台电脑同时处理,则效率则会快很多,最终将每台电脑上处理的数据进行整合。

python的优点:内置了map()reduce()函数,可以直接使用。

#python内置了map()和reduce()函数
'''
def myMap(func,li):
  resList = []
  for paser in li:
    res = func(paser)
    resList.append(res)
'''

2、map()函数

功能:将传入的函数依次作用于序列中的每一个元素,并把结果作为新的Iterator(可迭代对象)返回

语法:

map(func, lsd)

参数1是函数,参数2是序列

#一、map()
#原型 map(func, lsd)
#将单个字符转成对应的字面量整数
def chrToint(chr):
  return {"0":0,"1":1,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9}[chr]
list1 = ["2","1","4","5"]
res = map(chrToint, list1)
#[chr2int("2"),chr2int("1"),chr2int("4"),chr2int("5")]
print(res)
print(list(res))
#将整数元素的序列,转为字符串型
#[1,2,3,4] --》[“1”,“2”,“3”,“4”]
l = map(str,[1,2,3,4])
print(list(l))

输出:

<map object at 0x0000028288E76780>
[2, 1, 4, 5]
['1', '2', '3', '4']

练习:使用map函数,求n的序列[1,4,9,..,n^2]

num = int(input("请输入一个数:"))
map1 = map(lambda n: n*n,range(1,num+1))
print(list(map1))

输出:

请输入一个数:4
[1, 4, 9, 16]

3、reduce()函数

功能:一个函数作用在序列上,这个函数必须接受两个参数,reduce把结果继续和序列的下一个元素累计运算

语法:reduce(func,lsd)

参数1为函数,参数2为列表

reduce(f,[1,2,3,4])等价于f(f(f(1,2),3),4),类似于递归

from functools import reduce
#需求,求一个序列的和
list2 = [1, 2, 3, 4]
def mySum(x,y)
  return x+y
r = reduce(mySum,list2)
print("r=",r)

输出:

r= 10

练习1,将字符串转成对应字面量数字

from functools import reduce
#将字符串转成对应字面量数字
def strToint(str1)
  def fc(x, y):
    return x*10 + y
  def fs(chr):
    return {"0":0,"1":1,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9}[chr]
  return reduce(fc,map(fs,list(str1)))
a = strToint("12345")
print(a)
print(type(a))
#模拟map()函数
def myMap(func,li):
  resList = []
  for n in li:
    res = func(n)
    resList.append(res)

输出:

12345
<class 'int'>

练习2,求1!+2!+3!+…+n!之和。【使用map与reduce函数】

from functools import reduce
'''
求1!+2!+3!+...+n!之和
'''
num = int(input("请输入一个正数:"))
def jiecheng(n):
  ji = 1
  for i in range(1,n+1):
    ji *= i
  return ji
list1 = reduce(lambda x,y: x + y ,map(jiecheng,range(1,num+1)))
print(list1)

输出:

请输入一个正数:5
153

4、filter()函数

作用:把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留该元素还是丢弃该元素【通过一定的条件过滤列表中的元素】

'''
语法:
filter(func,lsd)
参数一:函数名
参数二:序列
功能:用于过滤序列
简单理解:把传入的函数依次作用于序列的每一个元素,根据返回的True还是False,决定是否保留该元素。
'''
#需求:将列表中的偶数筛选出来。
list1 = [1,2,3,4,5,6,7,8]
#筛选条件
def func(num):
  #保留偶数元素
  if num%2 == 0:
    return True
  #剔除奇数元素
  return False
list2 = filter(func,list1)
print(list2)
print(list(list2))
print(list1)

输出:

<filter object at 0x0000026E74106B38>
[2, 4, 6, 8]
[1, 2, 3, 4, 5, 6, 7, 8]

注意:使用filter()这个高阶函数,关键在正确实现一个“筛选”函数,filter()函数返回的是一个Iterator,也就是一个惰性序列,所以要强迫filter完成计算结果,需要使用list()函数获取所有的结果并且返回list.

练习

需求;将爱好为“无”的数据剔除掉

data= [["姓名","年龄","爱好"],["tom", 25, "无"],["hanmeimei", 26, "金钱"]]

data= [["姓名","年龄","爱好"],["tom", 25, "无"],["hanmeimei", 26, "金钱"]]
def filterWu(list1):
  for i in list1:
    if i == "无":
      return False
  return True
dataFilter = list(filter(filterWu,data))
print(dataFilter)

输出:

[['姓名', '年龄', '爱好'], ['hanmeimei', 26, '金钱']]

练习2,需求:打印2000到2020之内的闰年[使用filter函数]

import calendar
print(list(filter(calendar.isleap,range(2000,2020))))

输出:

[2000, 2004, 2008, 2012, 2016]

5、sorted()函数

sorted(iterable,key,reverse)作用:实现对列表的排序。

iterable:是可迭代类型;
cmp:用于比较的函数,比较什么由key决定;
key:用列表元素的某个属性或函数作为关键字,有默认值,迭代集合中的一项;
reverse:排序规则. reverse = True 降序 或者 reverse = False 升序,默认值为False。

返回值:是一个经过排序的可迭代类型,与iterable一样。

#排序
#第一类:冒泡 选择
#第二类:快速,插入,计数器
#注意:如果数据量小的情况下,上述两类用法的效率基本相同,但是,如果数据量大的情况下,第一类的效率很低
#1.普通排序
list1 = [4,3,5,6,1]
#默认为升序排序
list2 = sorted(list1)
print(list2)
#2.按绝对值大小排序
list3 = [4,-3,5,2,-9]
#key接受函数来实现自定义排序规则
#abs表示通过绝对值进行排序
list4 = sorted(list3, key=abs)
#利用map可以实现取绝对值之后的排序
list5 = sorted(map(abs,list3))
print(list3)
print(list4)
print(list5)
#3.降序排序
list5 = [2,1,4,5,6,7]
#通过设置reverse=True来表示反转
list6 = sorted(list5,reverse=True)
print(list5)
print(list6)
list7 = ['a','b','c','d']
list8 = sorted(list7)
print(list7)
#同样也可以实现升序排列,结果为abcd,排序依据为ASCII值
print(list8)
#自定义函数:按照字符串的长短来进行排序
def myLen(str1):
  return len(str1)
list7 = ['sddd','dded','et54y5','6576986oy','sa','sda']
#使用自定义函数,进行排序,key=函数名
list8 = sorted(list7, key = myLen)
print(list7)
print(list8)

输出:

[1, 3, 4, 5, 6]
[4, -3, 5, 2, -9]
[2, -3, 4, 5, -9]
[2, 3, 4, 5, 9]
[2, 1, 4, 5, 6, 7]
[7, 6, 5, 4, 2, 1]
['a', 'b', 'c', 'd']
['a', 'b', 'c', 'd']
['sddd', 'dded', 'et54y5', '6576986oy', 'sa', 'sda']
['sa', 'sda', 'sddd', 'dded', 'et54y5', '6576986oy']

class Student(object):
  def __init__(self,name,age):
    self.name = name
    self.age = age
  def __str__(self):
    return self.name +" "+ str(self.age)
stu1 = Student('lili1',18)
stu2 = Student('lili2',19)
stu3 = Student('lili3',17)
stu4 = Student('lili4',20)
stu5 = Student('lili5',20)
list2 = [stu1,stu2,stu3,stu4,stu5]
def com(Student):
  return Student.age
list3 = sorted(list2,key=lambda Student: Student.age)
for i in list3:
  print(i)

输出:

lili3 17
lili1 18
lili2 19
lili4 20
lili5 20

关于Python相关内容感兴趣的读者可查看本站专题:《Python函数使用技巧总结》、《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
sqlalchemy对象转dict的示例
Apr 22 Python
Python中itertools模块用法详解
Sep 25 Python
Python中的ctime()方法使用教程
May 22 Python
python开发之list操作实例分析
Feb 22 Python
python实现发送邮件功能
Jul 22 Python
python利用MethodType绑定方法到类示例代码
Aug 27 Python
Python GUI布局尺寸适配方法
Oct 11 Python
python使用百度文字识别功能方法详解
Jul 23 Python
python Kmeans算法原理深入解析
Aug 23 Python
新手学习Python2和Python3中print不同的用法
Jun 09 Python
python MD5加密的示例
Oct 19 Python
selenium自动化测试入门实战
Dec 21 Python
Python2与Python3的区别实例分析
Apr 11 #Python
Python3获取电脑IP、主机名、Mac地址的方法示例
Apr 11 #Python
基于django channel实现websocket的聊天室的方法示例
Apr 11 #Python
CentOS7安装Python3的教程详解
Apr 10 #Python
django富文本编辑器的实现示例
Apr 10 #Python
详解Python:面向对象编程
Apr 10 #Python
5款Python程序员高频使用开发工具推荐
Apr 10 #Python
You might like
PHP实现网上点歌(二)
2006/10/09 PHP
PHP最常用的ini函数分析 针对PHP.ini配置文件
2010/04/22 PHP
JS中encodeURIComponent函数用php解码的代码
2012/03/01 PHP
php打造属于自己的MVC框架
2012/03/07 PHP
PHP模拟asp.net的StringBuilder类实现方法
2015/08/08 PHP
CI框架中$this-&gt;load-&gt;library()用法分析
2016/05/18 PHP
PHP读MYSQL中文乱码的快速解决方法
2016/10/01 PHP
网站被恶意镜像怎么办 php一段代码轻松搞定(全面版)
2018/10/23 PHP
JavaScript函数学习总结以及相关的编程习惯指南
2015/11/16 Javascript
JavaScript事件处理的方式(三种)
2016/04/26 Javascript
jQuery实现6位数字密码输入框
2016/12/29 Javascript
浅谈Node异步编程的机制
2017/10/18 Javascript
vue项目中导入swiper插件的方法
2018/01/30 Javascript
微信小程序 授权登录详解(附完整源码)
2019/08/23 Javascript
Vue+Koa2+mongoose写一个像素绘板的实现方法
2019/09/10 Javascript
如何通过vscode运行调试javascript代码
2020/07/24 Javascript
three.js 如何制作魔方
2020/07/31 Javascript
JS实现购物车基本功能
2020/11/08 Javascript
vue基于Echarts的拖拽数据可视化功能实现
2020/12/04 Vue.js
python中元类用法实例
2014/10/10 Python
Python作用域用法实例详解
2016/03/15 Python
Python编程实现两个文件夹里文件的对比功能示例【包含内容的对比】
2017/06/20 Python
20行python代码的入门级小游戏的详解
2019/05/05 Python
python按比例随机切分数据的实现
2019/07/11 Python
Python符号计算之实现函数极限的方法
2019/07/15 Python
Python实现弹球小游戏
2020/08/01 Python
pycharm配置QtDesigner的超详细方法
2021/01/25 Python
英国航空官网:British Airways
2016/09/11 全球购物
奇怪的鱼:Weird Fish
2018/03/18 全球购物
理肤泉加拿大官网:La Roche-Posay加拿大
2018/07/06 全球购物
Ben Sherman官方网站:英国男装品牌
2019/10/22 全球购物
机械制造专业毕业生求职信
2014/03/02 职场文书
房产委托公证书样本
2014/04/04 职场文书
投资入股合作协议书
2014/10/28 职场文书
python数字图像处理数据类型及颜色空间转换
2022/06/28 Python
Python可视化神器pyecharts之绘制箱形图
2022/07/07 Python