一句话搞定python六剑客
六劍客
一行搞定六劍客:三個(gè)函數(shù):map?filter?reduce?+?lambda?切片?推導(dǎo)列表
python最有特點(diǎn)的一行代碼,所有代碼均可以借用一行代碼(目標(biāo))
?
1.map(函數(shù),列表或者字符串)#字符串或者列表中每個(gè)字符或每個(gè)元素都帶入函數(shù)運(yùn)算
1.map函數(shù):
輸出結(jié)果為列表
1)列表元素的map運(yùn)算,
>>>?map(s,[1,2,3])
[2,?3,?4]
2)字符串元素的map運(yùn)算,函數(shù)用lambda實(shí)現(xiàn)
>>>?map(lambda?x:x.upper(),"abc")
['A',?'B',?'C']
3)函數(shù)自定義,應(yīng)用自定義函數(shù)套用將列表或字符串中每個(gè)元素輸出,
實(shí)例:自定義函數(shù)map
>>>?def?uppercase(s):
...?if?s>='A'?and?s<='Z':
...?return?s
...?else:
...?return?""
...
>>>?print?"".join(map(uppercase,"AABBabAN"))
AABBAN
?
實(shí)例:使用map函數(shù),將一個(gè)字符串中的小寫字母刪除掉,例如:“AABBaabb”,
結(jié)果返回"AABB"
?
def?delete_lowercase(s):
????if?s>='a'?and?s<="z":
????????return?""
????else:
????????return?s
?
print?"".join(map(delete_lowercase,"AABBaabb"))
>>>?"".join([i?for?i?in?map(lambda?x:(re.match(r"[ACDEFGHIJKLMNOPQRSTUVWXYZ]*",x).group()),"asdASD")?if?i!=""])
'ASD'、
2.filter?兩個(gè)參數(shù)(自定義函數(shù)名,列表)對(duì)列表中的元素過濾后輸出
?
filter實(shí)例:
>>>?def?uppercase(s):
...?if?s>='A'?and?s<='Z':
...?return?s
...?else:
...?return?""
...
>>>?print?"".join(map(uppercase,"AABBabAN"))
AABBAN
>>>?print?"".join(filter(uppercase,"AABBabFN"))
AABBFN
>>>
?
實(shí)例:
filter(lambda?x:x?in?string.uppercase,"AAaaSSBB")
?
reduce(lambda?x,y:x+y,range(1,101))
3、reduce (函數(shù)名,列表)將列表中的元素逐一累計(jì)
?
累加
>>>?print?reduce(lambda?x,y:x+y,range(1,101))
5050
階乘
>>>?print?reduce(lambda?x,y:x*y,range(1,5))
24
>>>?print?reduce(lambda?x,y:x*y,range(1,7))
720
實(shí)例:
list_a=[1,1,1,3,5,6,8]
func=lambda?x,y:x?if?y?in?x?else?x?+?[y]
print?reduce(func,[[],]+list_a)
?
4.lambda函數(shù),變量:運(yùn)算表達(dá)式:將變量按運(yùn)算表達(dá)式運(yùn)算后輸出
語法:變量:運(yùn)算表達(dá)式?如?x:x+1
?
引用:?函數(shù)名(變量賦值)?a(1)
>>>?a=lambda?x:x+1
>>>?a(4)
5
>>>?a=lambda?x,y,z:(x+y)*z
>>>?a(1,1,4)
8
>>>?a=lambda?x:s*x
>>>?s=1
>>>?a(5)
兩個(gè)參數(shù)lambda函數(shù)
import?string
fp?=?open("e:\\1.txt","w")
content=map(lambda?x,y:x+","+str(y)+"\n",list(string.lowercase),range(1,27))
fp.writelines(content)
?
list_a=[1,1,1,3,5,6,8]
func=lambda?x,y:x?if?y?in?x?else?x?+?[y]
print?reduce(func,[[],]+list_a)
5.推導(dǎo)列表?結(jié)果表達(dá)式+范圍+條件
?
[str(a)*i?for?i?in?range(1,times+1)]
實(shí)例:將列表中的每個(gè)元素變?yōu)橹貜?fù)字符串,如1?變?yōu)?a?2變?yōu)?aa?3變?yōu)閍aa
a=int(raw_input("input?a?value:"))
times=int(raw_input("input?count?times:"))
print?u"總和為:",eval("+".join([str(a)*i?for?i?in?range(1,times+1)]))
字符串轉(zhuǎn)換后?用+合并?并用eval?轉(zhuǎn)為求和
列表推導(dǎo)式是Python基礎(chǔ),好用,而又非常重要的功能,也是最受歡迎的Python特性之一,可以說掌握它是成為合格Python程序員的基本標(biāo)準(zhǔn)。本質(zhì)上可以把列表推導(dǎo)式理解成一種集合了變換和篩選功能的函數(shù),通過這個(gè)函數(shù)把一個(gè)列表轉(zhuǎn)換成另一個(gè)列表。注意是另一個(gè)新列表,原列表保持不變。
看示例:
(1)對(duì)列表中的每項(xiàng)元素進(jìn)行立方運(yùn)算(變換功能)
a?=?[1,?2,?3,?4,?5,?6,?7,?8,?9,?10]
b?=?[x?**?3?for?x?in?a]
print(a)?
print(b)
[1,?2,?3,?4,?5,?6,?7,?8,?9,?10]?
[1,?8,?27,?64,?125,?216,?343,?512,?729,?1000]
(2)對(duì)列表中為偶數(shù)的元素進(jìn)行立方運(yùn)算(帶篩選條件的變換功能)
a=?[1,?2,?3,?4,?5,?6,?7,?8,?9,?10]
b?=?[x?**?3?for?x?in?a?if?x?%?2?==?0]
print(b)
[8,?64,?216,?512,?1000]
???????從結(jié)果上可以看出有篩選條件的話是先篩選再變換,即先篩掉不滿足條件的元素,再進(jìn)行變換運(yùn)算。可以同時(shí)加多個(gè)篩選條件,如對(duì)大于5的且是偶數(shù)的元素進(jìn)行立方運(yùn)算,示例如下:
a=?[1,?2,?3,?4,?5,?6,?7,?8,?9,?10]
b?=?[x?**?3?for?x?in?a?if?x?%?2?==?0?if?x?>?5]
print(b)
[216,?512,?1000]
?
?
(3)與zip結(jié)合
???????將a,b兩個(gè)列表中相對(duì)應(yīng)得值組合起來,形成一個(gè)新列表。例如包含x坐標(biāo)的列表與y坐標(biāo)的列表形成相對(duì)應(yīng)的點(diǎn)坐標(biāo)[x,?y]列表。
a=?[-1,?-2,?-3,?-4,?-5,?-6,?-7,?-8,?-9,?-10]
b?=?[1,?2,?3,?4,?5,?6,?7,?8,?9,?10]
xy?=?[[x,?y]?for?x,?y?in?zip(a,?b)]
print(xy)
[[-1,?1],?[-2,?2],?[-3,?3],?[-4,?4],?[-5,?5],?[-6,?6],?[-7,?7],?[-8,?8],?[-9,?9],?[-10,?10]]
(4)支持多層for循環(huán)
???????將一個(gè)嵌套列表轉(zhuǎn)換成一個(gè)一維列表。
a=?[[1,?2,?3],?[4,?5,?6],?[7,?8,?9]]
b?=?[j?for?i?in?a?for?j?in?i]
print(b)
[1,?2,?3,?4,?5,?6,?7,?8,?9]
???????Python中還有字典推導(dǎo)式、集合推導(dǎo)式等,與列表推導(dǎo)式使用方式大致相同。
???????列表推導(dǎo)式的使用非常廣泛,從實(shí)際使用經(jīng)驗(yàn)來看,列表推導(dǎo)式使用的頻率是非常高的,也是相當(dāng)好用的。而對(duì)于列表推導(dǎo)式的多層for循環(huán),尤其是3層以上的或帶復(fù)雜篩選條件的,犧牲了較多的可讀性,直接用多個(gè)普通for循環(huán)方式實(shí)現(xiàn)就可以了,畢竟方便的實(shí)現(xiàn)功能是第一位的,多幾行代碼就多幾行吧。
實(shí)例:楊輝三角:
?#coding=utf-8
def?yhtriangle(n):
l=[1]
print?l
while?n>0:
?
l=[1]+[x+y?for?x,y?in?zip(l[:],l[1:])]+[1]
n-=1
?
print?l
?
yhtriangle(10)
6、切片
切片語法如下:
s[begin?:?end?:?stride]
與簡單切片語法相比,擴(kuò)展切片只是增加了第3個(gè)參數(shù),即步長參數(shù)(英文資料中通常稱為"stride"或"step")。
擴(kuò)展切片語法引入的"stride"參數(shù)是個(gè)需要特別注意的參數(shù),因?yàn)樗恼?負(fù)取值將會(huì)影響切片操作對(duì)源序列s的訪問方向,而這正是本文開始那幾個(gè)示例可能引起Python新手困惑的原因。
其實(shí)規(guī)則很簡單,說穿不值一文錢:
1)?當(dāng)stride參數(shù)為正值(positive)時(shí),表明切片操作從左至右(即正向)訪問源序列s的元素,此時(shí),若begin和end參數(shù)有缺省,則Python解釋器默認(rèn)將其設(shè)置為None。如s[0?:?:?1]會(huì)被解釋器當(dāng)作s[0?:?None?:?1],此時(shí),end實(shí)際取值要大于其有效索引范圍的上限值,以保證切片操作能訪問到源序列s從begin開始的所有元素(從左向右)。
2)?當(dāng)stride參數(shù)為負(fù)值(negative)時(shí),表明切片操作從右至左(即逆向)訪問源序列s的元素,此時(shí),若begin和end參數(shù)有缺省,則Python解釋器默認(rèn)將其設(shè)置為None。如s[-1?:?:?-1]會(huì)被解釋器當(dāng)作s[-1?:?None?:?-1],此時(shí),end實(shí)際取值要小于其有效索引范圍的下限值,已保證切片操作能訪問到源序列s從begin開始的所有元素(逆向,從右向左)。
3)?無論stride參數(shù)取正值還是負(fù)值,切片表達(dá)式的begin和end索引值需要保證在切片操作的訪問方向上,從begin到end之間有元素,這樣切片操作才能保證返回非空集。
s[4,8,1]
?切片實(shí)例:
import?os
os.system("ls?-al?>?a.txt")
with?open("a.txt")?as?fp:
????for?i?in?fp:
????????if?"1.py"?in?i:
????????????print?i.split()[-2]#倒數(shù)第二位
????????????break
?
>>>?l=[1,2,3,4,5,6]
>>>?l[:]
[1,?2,?3,?4,?5,?6]
>>>?l[1:]
[2,?3,?4,?5,?6]
l[:]
l[1:]
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/zyy98877/p/8490942.html
總結(jié)
以上是生活随笔為你收集整理的一句话搞定python六剑客的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 清除系统日志
- 下一篇: C/C++返回内部静态成员的陷阱