一、map()函数

map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把list 的每个元素依次作用在函数 f 上,得到一个新的 list 并返回。 例如,对于list [1, 2, 3, 4, 5, 6, 7, 8, 9] 如果希望把list的每个元素都作平方,就可以用map()函数,我们只需要传入函数f(x)=x*x,就可以利用map()函数完成这个计算:

def f(x):return x*x
print map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])输出结果: [1, 4, 9, 10, 25, 36, 49, 64, 81]

注意:map()函数不改变原有的 list,而是返回一个新的 list。 利用map()函数,可以把一个 list 转换为另一个 list,只需要传入转换函数。 由于list包含的元素可以是任何类型,因此,map() 不仅仅可以处理只包含数值的 list,事实上它可以处理包含任意类型的 list,只要传入的函数f可以处理这种数据类型。

任务 假设用户输入的英文名字不规范,没有按照首字母大写,后续字母小写的规则,请利用map()函数,把一个list(包含若干不规范的英文名字)变成一个包含规范英文名字的list: 输入:['adam', 'LISA', 'barT'] 输出:['Adam', 'Lisa', 'Bart']

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def format_name(s):s1=s[0:1].upper()+s[1:].lower();return s1;print map(format_name, ['adam', 'LISA', 'barT'])

map()函数是python内置的高阶函数,对传入的list的每一个元素进行映射,返回一个新的映射之后的list

python3中,map函数返回的是一个map对象,需要list(map(fun,itor))来将映射之后的map对象转换成列表

二、lambda 函数

python 使用 lambda 来创建匿名函数。

  • lambda只是一个表达式,函数体比def简单很多。
  • lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
  • lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
  • 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
    语法

lambda函数的语法只包含一个语句,如下:

lambda [arg1 [,arg2,.....argn]]:expression

以lambda x: x+1为例,首先,它是一个函数:

def f(x):
return x+1

好,这个函数引用时需要传入一个参数,并且有一个返回值。这个参数一般是for x in L之类的传进来,或者直接调用f(3)。

(1)先看第一个例子

f = lambda x: x**2
print(f(5)) # 25

结果是25,很easy,这里要说明的是lambda x: x**2是一个函数,你如果print(f)的得到的是一个函数的地址,记住它是一个函数。

(2)和append搭配、在for循环内部

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
for x in range(5):li.append(lambda x: x**2)
print(li[0](2)) # 4
print(li[1](3)) # 9

注:此处省略li = []的初始化代码,后续一样
li是一个list,但是list里面存的可不是数,而是函数地址,而且是5个x**2的函数,所以无论你是li[0](2)还是li[1](2),结果都是4。一般情况下不会这样写程序,因为没什么用途。

这里说一下,看过一个程序这样写,猜测原作者是想让li在运算时append的是数据,或者是以为这样可以让li在调用时n的值不随x变,不管这样,这个程序实际效果和上面一样,x本身在变,n = x写不写没有区别,li内部仍然是5个一样的函数的地址。

for x in range(5):li.append(lambda n=x: n**2)
print(li[0](2)) # 4
print(li[1](3)) # 9

总结一下:lambda在for循环内部,和append搭配时,for循环不是为了给函数传递参数,只是为了生成多个函数。

(3)只和append搭配

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
li.append(lambda x: x**2)
print(li[0](1)) # 1
print(li[0](3)) # 9
print(li[1](3)) # IndexError: list index out of range

这儿说的是另外一种情况,程序中并没有给出匿名函数lambda的参数,在调用时才会给。而且li仅仅append了一次,所以li内部也仅有一个函数地址。调用时就不会有li[1]这种情况。

补充一种它的变形,说明一下对于这种情况,参数赋初值并无意义。

li.append(lambda x=5: x**2)
print(li[0](1)) # 1
print(li[0](3)) # 9
print(li[1](3)) # IndexError: list index out of range

(4)和append搭配、参数由for循环给出

举个栗子

li.append(lambda :x for x in range(10))
print(next(li[0])()) # 0
print(next(li[0])()) # 1
print(next(li[1])()) # IndexError: list index out of range

此处有大坑,首先你得认出来(lambda :x for x in range(10))这种形式可没有那么简单,这是产生一个生成器最简单的方法,它的返回值是一个generator,所以li内部就存了一个generator。还有此时的函数是没有参数的,等效为:

def f():
return x

有人会说这个函数有什么意义吗,是没什么意义,但是如果return x**2,其实还是有些意义的。

(5)放在[]中、参数由for循环给出

li = [lambda :x for x in range(10)]
print(li[0]()) # 9
print(li[1]()) # 9

这个函数其实不好理解,首先别看成生成器了,跟它没关系。
lambda :x仍然是一个函数(return x),在没有print(li[0]())之前它是不会被执行的,一旦运行print(li[0]()),就会输出x的值,那么x是多少呢,显然x在上一句程序里面已经变成9了,所以结果都是9,这里其实是闭包的问题,想避免这个问题,程序就不能写这么简洁了。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
for x in range(5):
def f():
return x**2
li.append(f())# instant run
print(li[0], li[1], li[2], li[3], li[4])

结果是0, 1, 4, 9, 16,是我们想要的,有人会说这儿为什么不把def f()简化一下呢?还真不能简化,比较结果便知:

for x in range(5):
li.append(lambda :x**2) # uninstant run
print(li[0](), li[1](), li[2](), li[3](), li[4]())
#16 16 16 16 16

看到区别了吧,f 是一个函数地址,而 f() 是一个函数被执行后的返回值,所以第一个程序可以得到每次循环的 x 值。

(6)lambda最常用:和map、reduce、filter等结合用

其实lambda最常用的还是和map、reduce、filter这些高级函数结合使用,不过那个时候就把它当做一个函数,而且格式相对固定,具体使用就看高级函数的使用规则,较为简单,就不展开。

#我们原来的函数是这样的
def square_z(x):return xx
#现在我们可以写成下面这样(冒号后面的一切都是对输入的操作,然后lambda x会返回结果):square1=lambda x:xx
print(square1(2))
#配合map,filter等lambda能发挥更大作用,一行代码就能打印列表内元素的平方数
print(list(map(lambda x:x*x,[1,2,3,4,5])))
print(list(filter(lambda x:x<3,[1,2,3,4,5])))

三、归纳函数(reduce):

第一个参数是函数名,第二个参数是sequence(序列,像list,tuple,str,set,dict都可以)

效果是这样的:reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
#提前准备一个函数,计算两数之和
from functools import reduce
def add_z(x,y):
return x+y
#计算1~10之间数字之和(还是不包含10)
r_z=reduce(add_z,range(1,10))
print(r_z)
print("r_z 的类型:%s"%type(r_z))

结果如下:

四、过滤器(filter):

第一个参数是函数名,用于筛选的函数,第二个参数是Iterable(list,tuple,set,dict,str),返回一个filter且filter属于Iterator

#用于过滤掉一切不需要的东西,下面我们以打印1~10之间的奇数为例说明:
from collections import Iterable,Iterator
#提前准备一个函数,判断是否为奇数
def odd_z(x):if x%2==1:return Trueelse:return False
f=filter(odd_z,range(1,10))
print("f 的类型:%s"%type(f))
print("f 是Iterator:%s"%isinstance(f,Iterator))
try:print(next(f),end='*')#f作为Iterator使用print(next(f),end='*')
except:print("\n结束了")
for i in f:#f作为Iterable使用print(i,end='$')

结果如下:

五、zip函数

zip() 函数用于将可迭代对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象。

如果各个可迭代对象的元素个数不一致,则返回的对象长度与最短的可迭代对象相同。

利用 * 号操作符,与zip相反,进行解压。

语法:

zip(iterable1,iterable2, ...)

参数说明:

iterable–一个或多个可迭代对象(字符串,列表,元组,字典)

举例说明

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9]
z = zip(a, b, c)print('z值:', list(z))print('打包a、c列表:', list(zip(a, c)))z = zip(a, b)
print('解压z:', list(zip(*z)))# 字典形式
v1 = {1: 11, 2: 22}
v2 = {3: 33, 4: 44}
v3 = {5: 55, 6: 66}
v = zip(v1, v2, v3)
print('v值:', list(v))
w = zip(*zip(v1, v2, v3))
print("w值:", list(w))# 搭配for循环
list1 = [2, 3, 4]
list2 = [5, 6, 7]
for x, y in zip(list1, list2):print(x, y, '--', x * y)

结果:

/usr/local/bin/python3.9 /Users/chenshifeng/MyCode/PythonCode/SFDSZL/1/a.py
z值: [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
打包a、c列表: [(1, 7), (2, 8), (3, 9)]
解压z: [(1, 2, 3), (4, 5, 6)]
v值: [(1, 3, 5), (2, 4, 6)]
w值: [(1, 2), (3, 4), (5, 6)]
2 5 -- 10
3 6 -- 18
4 7 -- 28Process finished with exit code 0

Python高阶函数--map、lambda、reduce、filter、zip相关推荐

  1. 高阶函数 map,reduce, filter的用法

    1. map 用法 1 def fun_C(x): 2 """求平方""" 3 return x ** 2 4 5 6 result = m ...

  2. python高阶函数map_简单了解python高阶函数map/reduce

    高阶函数map/reduce Python内建了map()和reduce()函数. 我们先看map.map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每 ...

  3. Python高阶函数(map,reduce,filter)

    python内置常用高阶函数:. 称为 函数式编程,常常有一下特点 函数本身可以赋值给变量,赋值后变量为函数: 允许将函数本身作为参数传入另一个函数: 允许返回一个函数. 按常用排序 map() 函数 ...

  4. python高阶函数、map reduce 自己如何去定义_「python」高阶函数map、reduce的介绍

    Python map 先看官方介绍: map(function, iterable, ...)Return an iterator that applies function to every ite ...

  5. 利用高阶函数map和reduce将字符串转化成浮点数

    转载于:https://www.cnblogs.com/xiaoningyu/p/10645598.html

  6. python中高阶函数map怎么用_python六十课——高阶函数之map

    1.高阶函数: 特点:函数的形参位置必须接受一个函数对象 分类学习: 1).map(fn,lsd1,[lsd2...]): 参数一:fn --> 函数对象 参数二:lsd1 --> 序列对 ...

  7. py函数式编程(高阶函数map/reduce/filter/sorted、闭包函数/返回函数、匿名函数lamber、@装饰器decorator、偏函数functool.partial())

    #py函数式编程.py #高阶函数map/reduce/filter/sorted.闭包函数/返回函数.匿名函数lamber.@装饰器decorator.偏函数functool.partial()# ...

  8. python高阶函数filter_python 高阶函数之filter

    前文说到python高阶函数之map,相信大家对python中的高阶函数有所了解,此次继续分享python中的另一个高阶函数filter. 先看一下filter() 函数签名 >>> ...

  9. python使用高阶函数实现_18.python高阶函数

    什么是高阶函数:一个函数可以作为参数传给另外一个函数(一个函数可以用来接收另一个函数作为参数),或者一个函数的返回值为另外一个函数(若返回值为该函数本身,则为递归),满足其一则为高阶函数.函数的形参位 ...

最新文章

  1. PICRUSt:16S预测宏基因组-扩增子分析锦上添花
  2. [原创]微软拼音输入法2007(含64位版)
  3. C语言试题四之计算并输出3到n之间所有素数的平方根之和
  4. stc单片机c语言 pdf,STC单片机C语言程序设计 第13章 STC单片机C语言指针.pdf
  5. myeclipse打包java文件_MyEclipse将Java项目打包成jar文件的三种方法
  6. java 四人帮,Java PatternDesign of GOF(四人帮巨著,享誉15年)第十五模式
  7. 单链表实现一元多项式相加_python面试系列 01如何实现单链表的逆序
  8. 一叶知秋:“安全“的野指针、 static函数、成员函数、this 指针、gcc编译器、name mangling
  9. ServiceStack.Redis 连接有密码的Redis问题解决
  10. 堆排序(python实现)
  11. 在java中调用python程序
  12. Linux x86-64 IOMMU详解(五)——Intel IOMMU初始化流程
  13. ORAN专题系列-11:5G O-RAN RIC的PaaS和SaaS是封闭与开放的融合
  14. 集线器,路由器,交换机的作用和区别是什么
  15. 大批明星出国避难,大批医生选择逆行,是时候改变我们的价值观了···
  16. 2022 海德堡桂冠论坛(HLF)见闻录
  17. 2022年危险化学品生产单位安全生产管理人员免费试题及危险化学品生产单位安全生产管理人员考试技巧
  18. 【目标检测】YOLOv5能识别英雄和小兵?原理解析~
  19. 到底什么是非线性规划?
  20. 围观设计模式(23)--行为型之命令模式(Command Pattern)

热门文章

  1. 消除warning方法
  2. python写linux脚本_Linux下设置python脚本文件为服务
  3. 【MM配置】Pricing 采购定价过程总览
  4. 【BOM精讲】BOM 入门基本常识
  5. sap 销售订单过量交货和拣配有关设置
  6. [abap] 通过动态参数获取字段数据
  7. AT NEW 用法和注意
  8. 关于SAP物料的历史库存
  9. MM模块部分名词解释
  10. 好用的数据分析工具能顶半个BI团队?大佬力荐这款工具值得体验