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 相关文章推荐
Python使用Socket(Https)Post登录百度的实现代码
May 18 Python
Python中操作MySQL入门实例
Feb 08 Python
浅要分析Python程序与C程序的结合使用
Apr 07 Python
Python实现股市信息下载的方法
Jun 15 Python
Python只用40行代码编写的计算器实例
May 10 Python
python通过pip更新所有已安装的包实现方法
May 19 Python
Python实现的随机森林算法与简单总结
Jan 30 Python
使用pygame模块编写贪吃蛇的实例讲解
Feb 05 Python
python pandas中DataFrame类型数据操作函数的方法
Apr 08 Python
selenium+python自动化测试之页面元素定位
Jan 23 Python
Django 路由层URLconf的实现
Dec 30 Python
python对文件的操作方法汇总
Feb 28 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桌面中心(一) 创建数据库
2007/03/11 PHP
PHP 身份证号验证函数
2009/05/07 PHP
php数字转汉字代码(算法)
2011/10/08 PHP
解析mysql left( right ) join使用on与where筛选的差异
2013/06/18 PHP
浅析php与数据库代码开发规范
2013/08/08 PHP
php无限级评论嵌套实现代码
2018/04/18 PHP
经典的带阴影的可拖动的浮动层
2006/06/26 Javascript
JavaScript中对象property的读取和写入方法介绍
2014/12/30 Javascript
bootstrap3 兼容IE8浏览器!
2016/05/02 Javascript
完美解决js传递参数中加号和&amp;号自动改变的方法
2016/10/11 Javascript
JavaScript严格模式详解
2017/01/16 Javascript
JS判断两个对象内容是否相等的方法示例
2017/04/10 Javascript
jquery Ajax实现Select动态添加数据
2017/06/08 jQuery
在vscode中统一vue编码风格的方法
2018/02/22 Javascript
Vue 页面权限控制和登陆验证功能的实例代码
2019/06/20 Javascript
JavaScript中的null和undefined用法解析
2019/09/30 Javascript
Vue.js自定义指令学习使用详解
2019/10/19 Javascript
vue2.x 通过后端接口代理,获取qq音乐api的数据示例
2019/10/30 Javascript
js获取本日、本周、本月的时间代码
2020/02/01 Javascript
小程序如何定位所在城市及发起周边搜索
2020/02/11 Javascript
Javascript模块化机制实现原理详解
2020/04/02 Javascript
加速vue组件渲染之性能优化
2020/04/09 Javascript
python实现dnspod自动更新dns解析的方法
2014/02/14 Python
使用py2exe在Windows下将Python程序转为exe文件
2016/03/04 Python
Python利用ORM控制MongoDB(MongoEngine)的步骤全纪录
2018/09/13 Python
python实现多层感知器
2019/01/18 Python
Python openpyxl读取单元格字体颜色过程解析
2019/09/03 Python
手把手教你Python yLab的绘制折线图的画法
2019/10/23 Python
Bodum官网:咖啡和茶壶、玻璃器皿、厨房电器等
2018/08/01 全球购物
美国综合购物商城:UnbeatableSale.com
2018/11/28 全球购物
Otticanet英国:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/02/10 全球购物
什么是触发器(trigger)? 触发器有什么作用?
2013/09/18 面试题
Unix控制后台进程都有哪些进程
2016/09/22 面试题
农民工工资承诺书范文
2014/03/31 职场文书
学习雷锋精神活动总结
2015/02/06 职场文书
golang中的空接口使用详解
2021/03/30 Python