一、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']
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循环内部

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搭配

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,这里其实是闭包的问题,想避免这个问题,程序就不能写这么简洁了。

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)

#提前准备一个函数,计算两数之和
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 True
else:
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='$')

结果如下:

Python高阶函数--map的更多相关文章

  1. Python高阶函数map、reduce、filter、sorted的应用

    #-*- coding:utf-8 -*- from selenium import webdriver from selenium.webdriver.support.wait import Web ...

  2. python高阶函数——map/reduce

    python 内置了map()和reduce()函数 1.map()函数 map()函数接收两个参数,一个是函数,一个是可迭代对象Iterable,map将传入的函数依次作用于序列的每一个元素.并把结 ...

  3. Python——高阶函数——map filter zip

    一.map函数 1.作用:它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回. 2.实例 def f(x): return x* ...

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

    map()函数,接收两个参数,一个是函数,一个是序列,map()把传入的函数依次作用于序列的每个元素,并把结果作为新的序列返回: aa = [1, 2, 3, 4, 5] print("ma ...

  5. python 高阶函数 map lambda filter等

    map 描述 map() 会根据提供的函数对指定序列做映射. 第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表. ...

  6. Python高阶函数_map/reduce/filter函数

    本篇将开始介绍python高阶函数map/reduce/filter的用法,更多内容请参考:Python学习指南 map/reduce Python内建了map()和reduce()函数. 如果你读过 ...

  7. Python 函数式编程 & Python中的高阶函数map reduce filter 和sorted

    1. 函数式编程 1)概念 函数式编程是一种编程模型,他将计算机运算看做是数学中函数的计算,并且避免了状态以及变量的概念.wiki 我们知道,对象是面向对象的第一型,那么函数式编程也是一样,函数是函数 ...

  8. [py][lc]python高阶函数(匿名/map/reduce/sorted)

    匿名函数 - 传入列表 f = lambda x: x[2] print(f([1, 2, 3])) # x = [1,2,3] map使用 传入函数体 def f(x): return x*x r ...

  9. python--函数式编程 (高阶函数(map , reduce ,filter,sorted),匿名函数(lambda))

    1.1函数式编程 面向过程编程:我们通过把大段代码拆成函数,通过一层一层的函数,可以把复杂的任务分解成简单的任务,这种一步一步的分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. ...

随机推荐

  1. Android事件总线(二)EventBus3.0源码解析

    1.构造函数 当我们要调用EventBus的功能时,比如注册或者发送事件,总会调用EventBus.getDefault()来获取EventBus实例: public static EventBus ...

  2. JavaScript大杂烩8 - 理解文本解析的"黄金搭档"

    文本解析"黄金搭档" - String与RegExp对象 文本解析是任何语言中最常用的功能,JavaScript中也是一样,而正则表达式作为最常用的方式,JavaScript也同样 ...

  3. 一种快速部署开发用oracle的办法

    前段时间工作中需要在不少开发环境中快速提供开发可用的oracle环境,由于一一培训并部署原生oracle人力和时间成本过高,后来使用docker版本oracle,大大方便了开发工作的快速启动,方法记录 ...

  4. [20180124]奇怪的SQL*Net message from dblink.txt

    [20180124]奇怪的SQL*Net message from dblink.txt --//生产系统出现大量的SQL*Net message from dblink事件,自己分析看看. 1.环境 ...

  5. go time类操作

    fmt.Println(time.Now().Format("2006-01-02 15:04:05")) # 这是个奇葩,必须是这个时间点, 据说是go诞生之日, 记忆方法:6- ...

  6. 代理ARP--善意的欺骗

    1. 代理ARP(Proxy ARP)是什么? 顾名思义,它指通过中间设备(通常为Router)代替其他主机响应ARP请求.对于没有配置默认网关的主机想要与其他网络的另一台主机通信时,网关收到源主机的 ...

  7. httpd服务器的真实ip获取难题

    web服务器httpd中想要获取真正的ip是个难度,我们先要在配置文件中定义错误日志的格式:如下所示: 然后获取ip 上面三条输出日志中,第一条是直接访问http://172.16.213.157/i ...

  8. 02LaTeX学习系列之---TeX环境的搭建

    目录 02Latex的下载与安装及其编译IDE 目录 前言 (一)Tex Live的下载 1. Tex Live官方下载网站: (二)TeXStudio 1.TeXStudio官网下载 2.TeXSt ...

  9. C++基础算法学习——N皇后问题

    n皇后问题:输入整数n, 要求n个国际象棋的皇后,摆在n*n的棋盘上,互相不能攻击,输出全部方案. 代码如下: #include <iostream> #include<cmath& ...

  10. Linux 小知识翻译 - 「路径设置」

    这次聊聊路径的使用,这里的路径是「命令搜索路径」的简称. 在Linux上执行命令的时候,本来是需要命令的所在位置的绝对路径的,就像「/usr/bin/passwd」这样. 但是,对于经常使用的命令,如 ...