python map lambda 分割字符串_python六剑客:map()、lambda()、filter()、reduce()、推导类表、切片...
一:map():映射
map()函數(shù)在python2和python3中是區(qū)別的
python2中的定義:映射后,返回一個(gè)列表
>>> help(map)
Help on built-in function map in module __builtin__:
map(...)
map(function, sequence[, sequence, ...]) -> list
Return a list of the results of applying the function to the items of
the argument sequence(s). If more than one sequence is given, the
function is called with an argument list consisting of the corresponding
item of each sequence, substituting None for missing values when not all
sequences have the same length. If the function is None, return a list of
the items of the sequence (or a list of tuples if more than one sequence)
python3中的定義:映射后,返回一個(gè)迭代器,
>>> help(map)
Help on class map in module builtins:
class map(object)
| map(func, *iterables) --> map object
|
| Make an iterator that computes the function using arguments from
| each of the iterables. Stops when the shortest iterable is exhausted.
map()有兩個(gè)參數(shù),一個(gè)函數(shù),一個(gè)序列,序列中每一個(gè)元素都會(huì)做為參數(shù)傳給前邊的函數(shù),然后生成新的對(duì)象(python2中是list,python3中是iterator),第二個(gè)參數(shù)必須用一個(gè)序列:元祖,列表,字符串
python2中的map():
>>> map(str,[1,2,3,4])
['1', '2', '3', '4']
python3中的map():
搭配lambda函數(shù)
>>> map(lambda x:x.upper(),"abc")
['A', 'B', 'C']
map()函數(shù)搭配lambda傳多個(gè)參數(shù)
python2:
例子:2個(gè)list,[1,2,3][4,5,6],合并為[(1, 4), (2, 5), (3, 6)]
>>> a=[1,2,3]
>>> b=[4,5,6]
>>> map(lambda x,y:(x,y),a,b)[(1, 4), (2, 5), (3, 6)]
python3:
>>> map(lambda x,y:(x,y),a,b)
>>> type(map(lambda x,y:(x,y),a,b))
>>> list(map(lambda x,y:(x,y),a,b))
[(1, 4), (2, 5), (3, 6)]
也可以自己定義函數(shù)
map()傳多個(gè)參數(shù)(序列)時(shí),每次取元素進(jìn)行map時(shí),是在每個(gè)序列的相同位置取值,
然后作為一個(gè)元祖?zhèn)鹘o參數(shù)前邊的函數(shù)的,所以用這個(gè)原理,把函數(shù)設(shè)置None,也可以生成題中的結(jié)果,由此也能看到map函數(shù)在取值時(shí)的邏輯
>>> map(None,list1,list2)
[(1, 4), (2, 5), (3, 6)]
或者用zip()函數(shù)也可以,zip()函數(shù)在python2和python3中也是有區(qū)別的
python2中的zip():>>> zip(a,b)[(1, 4), (2, 5), (3, 6)]
python3中的zip():
>>> a = [1,2,3]
>>> b = [4,5,6]
>>> zip(a,b)
>>> type(zip(a,b))
>>> list(zip(a,b))
[(1, 4), (2, 5), (3, 6)]
二:lambda匿名函數(shù)
lambda語(yǔ)句被用來(lái)創(chuàng)建新的函數(shù)對(duì)象,并且在運(yùn)行時(shí)返回它們。
Python使用lambda關(guān)鍵字來(lái)創(chuàng)建匿名函數(shù)。這種函數(shù)得名于省略了用def聲明函數(shù)的標(biāo)準(zhǔn)步驟。
lambda只是一個(gè)表達(dá)式,函數(shù)體比def簡(jiǎn)單很多
lambda的主體是一個(gè)表達(dá)式,而不是一個(gè)代碼塊。僅僅能在lambda表達(dá)式中封裝有限的邏輯進(jìn)去。
#如下邊例子,x,y,z相當(dāng)于匿名函數(shù)中的參數(shù),x+y+z是函數(shù)體,匿名函數(shù)的定義賦值給了a,a就是一個(gè)函數(shù),可以用a()來(lái)調(diào)用這個(gè)函數(shù)
>>> a=lambda x,y,z:x+y+z
>>> a(1,2,3)
6
三:filter()
filter和map的區(qū)別是,filter保留函數(shù)返回為true的值,不返回的不顯示
map是保留返回的結(jié)果,無(wú)論返回的是啥,filter會(huì)把不滿足true條件的結(jié)果忽略掉
例子:刪除字符串中的小寫字母
#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"))
結(jié)果:
D:\>python test.py
['A', 'A', 'B', 'B', '', '', '', '']
AABB
保留數(shù)字中大于5的位
#-*-coding:utf-8-
def func(n):
if int(n)>5:
return n
print filter(func,"123467")
#只要return的是True,就會(huì)保留
結(jié)果:
D:\>python test.py
67
或者一行搞定
>>> filter(lambda x:int(x)>=5,"12345678")
'5678'
filter()根據(jù)參數(shù)中的序列,返回相同形式的序列,列表返回列表,字符串返回字符串
或者一行搞定
>>> 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')
python3:
>>> filter(lambda x:int(x)>5, "12346789")
>>> list(filter(lambda x:int(x)>5, "12346789"))
['6', '7', '8', '9']
>>> tuple("12345678")
('1', '2', '3', '4', '5', '6', '7', '8')
四:推導(dǎo)列表
>>> [i for i in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
相當(dāng)于把for循環(huán)中每次循環(huán)得到的數(shù)作為一個(gè)列表的一個(gè)元素,知道所有循環(huán)執(zhí)行結(jié)束
各個(gè)元素生成的過(guò)程相當(dāng)于以下兩句得到的:
for i in range(10):
print i
>>> [i for i in range(10) if i !=5]
[0, 1, 2, 3, 4, 6, 7, 8, 9]
練習(xí):a=[[1,2,3],[4,5,6]]用推導(dǎo)列表生成[[1, 4], [2, 5], [3, 6]]
[[j[i] for j in a] for i in range(3)]
結(jié)果:
[[1, 4], [2, 5], [3, 6]]
以上推導(dǎo)列表過(guò)程轉(zhuǎn)換成for循環(huán):最外層的for也對(duì)應(yīng)轉(zhuǎn)換成for循環(huán)的最外層
>>> for i in range(3):
...???? print "\n**************"
...???? for j in a:
...???????? print j[i],
...
結(jié)果中有三個(gè)元素,每個(gè)元素又是包含2個(gè)元素的列表,這個(gè)元素是執(zhí)行一次for循環(huán)得到的值
拆解過(guò)程:
每執(zhí)行一次完整的循環(huán),生成兩個(gè)數(shù),這個(gè)兩個(gè)數(shù)會(huì)以列表的形式作為最后結(jié)果列表的一個(gè)元素,
也就是說(shuō),推導(dǎo)列表的每一步生成的結(jié)果會(huì)以列表的形式存在,包括最終的結(jié)果
>>> for i in range(3):
...???? print "\n**************"
...???? for j in a:
...???????? print j[i],
...。、,
**************
1 4
**************
2 5
**************
3 6
五:reduce()累計(jì)操作
Reduce()累計(jì)操作,要搭配函數(shù)來(lái)執(zhí)行
>>>?reduce(lambda?x,y:x+y,[1,2,3,4])
10
第一次x=1,y=2, x+y=3,之后x+y的結(jié)果3賦值給x,y為3
第二次x=3,y=3,x+y=6,之后x+y的結(jié)果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
結(jié)果3傳給x
y從第二次開始存結(jié)果
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就對(duì)了
>>> 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'
六:切片,就是數(shù)列的切片,比較基本也比較常用
>>> [1,2,3,4,5][3:5]
[4, 5]
練習(xí):用map,lambda,推到列表,正則,join,去掉字符串中的小寫字母
>>> import re
>>> "".join([i for i in map(lambda x:(re.match(r"[A-Z]*",x).group()),"abcABC") if i !=""])
'ABC'
拆解過(guò)程:
>>> [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")
at 0x00000000054EDB38>
>>> re.match(r"[A-Z]*","ABC").group()
'ABC'
練習(xí):統(tǒng)計(jì)字符串中一共有幾個(gè)數(shù)字
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
總結(jié)
以上是生活随笔為你收集整理的python map lambda 分割字符串_python六剑客:map()、lambda()、filter()、reduce()、推导类表、切片...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 悲观锁和乐观锁_悲观锁和乐观锁处理并发操
- 下一篇: GB / ISO / 等保 网络安全相关