码迷,mamicode.com
首页 > 编程语言 > 详细

python六剑客:map()、lambda()、filter()、reduce()、推导类表、切片

时间:2018-10-04 09:41:16      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:fun   lambda表达式   序列   代码块   关键字   函数对象   UNC   filter   结果   

一:map():映射

map()有两个参数,一个函数,一个序列,序列中每一个元素都会做为参数传给前边的函数,然后生成新的列表,

第二个参数必须用一个序列:元祖,列表,字符串

>>> map(str,[1,2,3,4])
[‘1‘, ‘2‘, ‘3‘, ‘4‘]

 也可以自己定义函数

技术分享图片

搭配lambda函数

>>> map(lambda x:x.upper(),"abc")
[‘A‘, ‘B‘, ‘C‘]

 

 

二:lambda匿名函数

lambda语句被用来创建新的函数对象,并且在运行时返回它们。

Python使用lambda关键字来创建匿名函数。这种函数得名于省略了用def声明函数的标准步骤。

lambda只是一个表达式,函数体比def简单很多

lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。

#如下边例子,x,y,z相当于匿名函数中的参数,x+y+z是函数体,匿名函数的定义赋值给了a,a就是一个函数,可以用a()来调用这个函数

>>> a=lambda x,y,z:x+y+z
>>> a(1,2,3)
6

三:filter()

filter和map的区别是,filter保留函数返回为true的值,不返回的不显示

map是保留返回的结果,无论返回的是啥,filter会把不满足true条件的结果忽略掉

例子:删除字符串中的小写字母

 

#encoding=utf-8
def delete_lowercase(s):
    if s>=‘a‘ and s<=‘z‘:
        return ""
    else:
        return s

print map(delete_lowercase,"AABBaabb")

print "".join(map(delete_lowercase,"AABBaabb"))

结果:

D:\>python test.py
[‘A‘, ‘A‘, ‘B‘, ‘B‘, ‘‘, ‘‘, ‘‘, ‘‘]
AABB

 

保留数字中大于5的位

#-*-coding:utf-8-

def func(n):

    if int(n)>5:

        return n

print filter(func,"123467")

#只要return的是True,就会保留

结果:

D:\>python test.py
67

 

或者一行搞定

>>> filter(lambda x:int(x)>=5,"12345678")

‘5678‘

filter()根据参数中的序列,返回相同形式的序列,列表返回列表,字符串返回字符串

或者一行搞定

>>> filter(lambda x:int(x)>=5,"12345678")

‘5678‘

>>> filter(lambda x:int(x)>=5,list("12345678"))
[‘5‘, ‘6‘, ‘7‘, ‘8‘]


>>> filter(lambda x:int(x)>=5,"12345678")
‘5678‘


>>> filter(lambda x:int(x)>=5,tuple("12345678"))
(‘5‘, ‘6‘, ‘7‘, ‘8‘)


>>> tuple("12345678")
(‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘)

四:推导列表

>>> [i for i in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> [i for i in range(10) if i !=5]
[0, 1, 2, 3, 4, 6, 7, 8, 9]

 

五:reduce()累计操作

Reduce()累计操作,要搭配函数来执行

>>> reduce(lambda x,y:x+y,[1,2,3,4])
10

第一次x=1,y=2, x+y=3,之后x+y的结果3赋值给x,y为3

第二次x=3,y=3,x+y=6,之后x+y的结果6赋值给x,y为4

第三次x=3,y=4,x+y=10


>>> 1:1+2  2:3+3  3:6+4

>>> reduce(lambda x,y:x+y,range(1,101))

5050

>>> reduce(lambda x,y:x+y,[1,2,3])

6

X=1,y=2

结果3传给x

y从第二次开始存结果

 

reduce(lambda x,y:x+y+y,[1,2,3])

x=1,y=2,y=2
x=5,y=3,y=3

x+y+y=5+3+3=11
x是5就对了

>>> reduce(lambda x,y:x+x+y,[1,2,3])

x=1,x=1,y=2

x+x+y=1+1+2=4 

x=4,x=4,y=3

x+x+y=4+4+3=11

 

>>> reduce(lambda x,y:x+x+y,[‘1‘,‘2‘,‘3‘])

x=1,x=1,y=2

x=’112’,x=’112’,y=’3’

x+x+y=‘1121123‘

 

六:切片,就是数列的切片,比较基本也比较常用

>>> [1,2,3,4,5][3:5]
[4, 5]

 

练习:用map,lambda,推到列表,正则,join,去掉字符串中的小写字母

>>> import re
>>> "".join([i for i in map(lambda x:(re.match(r"[A-Z]*",x).group()),"abcABC") if i !=""])
‘ABC‘

拆解过程:

>>> [i for i in map(lambda x:(re.match(r"[A-Z]*",x).group()),"abcABC") if i !=""]
[‘A‘, ‘B‘, ‘C‘]
>>> [i for i in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> [i for i in range(10) if i !=5]
[0, 1, 2, 3, 4, 6, 7, 8, 9]
>>> map(lambda x:(re.match(r"[A-Z]*",x).group()),"abcABC")
[‘‘, ‘‘, ‘‘, ‘A‘, ‘B‘, ‘C‘]
>>> lambda x:(re.match(r"[A-Z]*",x).group())("abcABC")
<function <lambda> at 0x00000000054EDB38>
>>> re.match(r"[A-Z]*","ABC").group()
‘ABC‘

练习:统计字符串中一共有几个数字

 

 

 

s="sdfa45ads46723"

 

#lambda

 

>>> filter(lambda x:x.isdigit(),list(s))

 

[‘4‘, ‘5‘, ‘4‘, ‘6‘, ‘7‘, ‘2‘, ‘3‘]

 

>>> len(filter(lambda x:x.isdigit(),list(s)))

 

7

 

>>> reduce(lambda x,y:x+y,map(lambda x:x.isdigit(),list("sdfa45ads46723")))

 

7

 

>>> reduce(lambda x,y:x+y,map(lambda x:len(x),filter(lambda x:x.isdigit(),[i for i in s][::-1])))

 

7

 

python六剑客:map()、lambda()、filter()、reduce()、推导类表、切片

标签:fun   lambda表达式   序列   代码块   关键字   函数对象   UNC   filter   结果   

原文地址:https://www.cnblogs.com/xiaxiaoxu/p/9740086.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!