不知哪兒看到乙個說法,大概是當map的函式引數可以直接引用乙個已有的函式變數時(比如內建函式int,str之類的),用map更優美些,否則還是用列表解析更直觀和快速.
我同意此說法.
昨天在寫乙個函式時,最開始用的是map:
defprocess_messages(arr,msgs,mode):
return map(lambda msg:process_message(arr,msg,mode),msgs)
可以看到,那個lambda顯得笨拙而龐大.今天起來轉念一想,用列表解析不是更好麼:
defprocess_messages(arr,msgs,mode):
return [process_message(arr,msg,mode) for msg in msgs]
前段時間沒事的時候用python模擬map函式時發現,map函式的功能就是列表解析的子集..當時沒有用到zip函式,版本是這樣:
def imap(func,*seqs):return (func(*(seq[i] for seq in seqs)) for i in range(len(seqs[0])))
今天突然發現zip函式原來是可以接受多個序列的,於是有了更優美的版本:
def imap(func,*seqs):return [func(*args) for args in zip(*seqs)]
從上面的imap可以看到,列表解析完全可以涵蓋map的功能.當然,一些由於程式構造需要傳遞函式變數的情況,可能只能使用map.但這種的話總是可以改的.
而且,對於兩個或兩個以上的序列情況,map函式更繁雜:
map(lambdaarg1,arg2,...,argn:func(arg1,arg2,...,argn),seq1,seq2,...,seqn)
[func(*args) for args in zip(seq1,seq2,...,seqn)]
filer也有這樣的傾向:
defclean_message(s):
return
''.join(filter(lambda
c:c.isalpha(),s.upper()))
defclean_message(s):
return
''.join(c for c in s.upper() if c.isalpha())
當然,以下這類情況用map,filter還是非常優美的:
string='12345
'map(int,string)
numseqs=[(1,1,1,0),(1,1,1,1)]
filter(all,numseqs)
附,強大而靈活的zip函式和for迴圈.
>>> for k,v in [(1,2),(2,4)]:k,v
1 22 4
>>> for k,v,x in [(1,2,3),(2,4,5)]:
k,v,x
1 2 3
2 4 5
>>> for k in [(1,2,3),(2,4,5)]:
k
(1, 2, 3)
(2, 4, 5)
>>>
python列表解析
列表解析是乙個列表對映出另乙個列表,它的基本形式是乙個方括號裡面包含乙個for語句對乙個iterable物件迭代 expression for target1 in iterable1 if condition1 for targetn in iterablen if conditionn 上面是列...
python 列表解析
m 1,2,3 4,5,6 7,8,9 col2 row 1 for row in m 獲取列表m的每個元素的第二個元素的值組成的列表 print col2 print row 1 1 for row in m 獲取列表m的每個元素的第二個元素 1的值組成的列表 print row 1 for ro...
Python列表解析
語法 1.expression for iter val in iterable 2.expression for iter val in iterable if cond expr l i 2 for i in range 1,11 print l 1,4,9,16,25,36,49,64,81,...