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中的面向对象编程的概念
Apr 27 Python
python TCP Socket的粘包和分包的处理详解
Feb 09 Python
python实现windows下文件备份脚本
May 27 Python
Python3.5内置模块之os模块、sys模块、shutil模块用法实例分析
Apr 27 Python
打包PyQt5应用时的注意事项
Feb 14 Python
基于django micro搭建网站实现加水印功能
May 22 Python
Matplotlib.pyplot 三维绘图的实现示例
Jul 28 Python
Pycharm2020.1安装中文语言插件的详细教程(不需要汉化)
Aug 07 Python
python3 googletrans超时报错问题及翻译工具优化方案 附源码
Dec 23 Python
使用gunicorn部署django项目的问题
Dec 30 Python
全网最细 Python 格式化输出用法讲解(推荐)
Jan 18 Python
python脚本框架webpy的url映射详解
Nov 20 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
五款常用mysql slow log分析工具的比较分析
2011/05/22 PHP
php读取mysql的简单实例
2014/01/15 PHP
php实现读取超大文件的方法
2014/07/28 PHP
详解PHP的Laravel框架中Eloquent对象关系映射使用
2016/02/26 PHP
PHP如何通过带尾指针的链表实现'队列'
2020/10/22 PHP
20个非常棒的 jQuery 幻灯片插件和教程分享
2011/08/23 Javascript
浅析Js(Jquery)中,字符串与JSON格式互相转换的示例(直接运行实例)
2013/07/09 Javascript
js实现动态添加、删除行、onkeyup表格求和示例
2013/08/18 Javascript
JavaScript中原型和原型链详解
2015/02/11 Javascript
js使用setTimeout实现定时炸弹的方法
2015/04/10 Javascript
javascript正则表达式总结
2016/02/29 Javascript
JS判断图片是否加载完成方法汇总(最新版)
2016/05/13 Javascript
JavaScript简单生成 N~M 之间随机数的方法
2017/01/13 Javascript
js实现PC端和移动端刮卡效果
2020/03/27 Javascript
jQuery上传插件webupload使用方法
2017/08/01 jQuery
Webpack框架核心概念(知识点整理)
2017/12/22 Javascript
Vue组件之极简的地址选择器的实现
2018/05/31 Javascript
解决element ui select下拉框不回显数据问题的解决
2019/02/20 Javascript
在vue-cli 3中给stylus、sass样式传入共享的全局变量
2019/08/12 Javascript
使用Layer组件弹出多个对话框(非嵌套)与关闭及刷新的例子
2019/09/25 Javascript
详解Vue.js 响应接口
2020/07/04 Javascript
[43:43]完美世界DOTA2联赛PWL S2 FTD.C vs Rebirth 第一场 11.22
2020/11/24 DOTA
[01:35:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第一场 1月18日
2021/03/11 DOTA
Python对列表中的各项进行关联详解
2017/08/15 Python
Linux下python3.6.1环境配置教程
2018/09/26 Python
Python模块汇总(常用第三方库)
2019/10/07 Python
DRF框架API版本管理实现方法解析
2020/08/21 Python
python动态规划算法实例详解
2020/11/22 Python
贝尔帐篷精品店:Bell Tent Boutique
2019/06/12 全球购物
简述你对Statement,PreparedStatement,CallableStatement的理解
2013/03/25 面试题
static全局变量与普通的全局变量有什么区别
2014/05/27 面试题
高一生物教学反思
2014/01/17 职场文书
运动会邀请函范文
2014/01/31 职场文书
领导干部作风整顿个人剖析材料
2014/10/11 职场文书
简单的个人租房协议书范本
2014/11/26 职场文书
导游词之唐山景点
2019/12/18 职场文书