1. 程式人生 > >一句話搞定python六劍客

一句話搞定python六劍客

red 方向 轉換成 OS mes turn cde body begin

六劍客

一行搞定六劍客:三個函數:map filter reduce + lambda 切片 推導列表

python最有特點的一行代碼,所有代碼均可以借用一行代碼(目標)

1.map(函數,列表或者字符串)#字符串或者列表中每個字符或每個元素都帶入函數運算

1.map函數:

輸出結果為列表

1)列表元素的map運算,

>>> map(s,[1,2,3])

[2, 3, 4]

2)字符串元素的map運算,函數用lambda實現

>>> map(lambda x:x.upper(),"abc")

[‘A‘, ‘B‘, ‘C‘]

3)函數自定義,應用自定義函數套用將列表或字符串中每個元素輸出,

實例:自定義函數map

>>> def uppercase(s):

... if s>=‘A‘ and s<=‘Z‘:

... return s

... else:

... return ""

...

>>> print "".join(map(uppercase,"AABBabAN"))

AABBAN

實例:使用map函數,將一個字符串中的小寫字母刪除掉,例如:“AABBaabb”,

結果返回"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 兩個參數(自定義函數名,列表)對列表中的元素過濾後輸出

filter實例:

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

>>>

實例:

filter(lambda x:x in string.uppercase,"AAaaSSBB")

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

3、reduce (函數名,列表)將列表中的元素逐一累計

累加

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

實例:

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函數,變量:運算表達式:將變量按運算表達式運算後輸出

語法:變量:運算表達式 如 x:x+1

引用: 函數名(變量賦值) 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)

兩個參數lambda函數

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.推導列表 結果表達式+範圍+條件

[str(a)*i for i in range(1,times+1)]

實例:將列表中的每個元素變為重復字符串,如1 變為 a 2變為 aa 3變為aaa

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)]))

字符串轉換後 用+合並 並用eval 轉為求和

列表推導式是Python基礎,好用,而又非常重要的功能,也是最受歡迎的Python特性之一,可以說掌握它是成為合格Python程序員的基本標準。本質上可以把列表推導式理解成一種集合了變換和篩選功能的函數,通過這個函數把一個列表轉換成另一個列表。註意是另一個新列表,原列表保持不變。

看示例:

(1)對列表中的每項元素進行立方運算(變換功能)

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)對列表中為偶數的元素進行立方運算(帶篩選條件的變換功能)

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]

從結果上可以看出有篩選條件的話是先篩選再變換,即先篩掉不滿足條件的元素,再進行變換運算。可以同時加多個篩選條件,如對大於5的且是偶數的元素進行立方運算,示例如下:

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結合

將a,b兩個列表中相對應得值組合起來,形成一個新列表。例如包含x坐標的列表與y坐標的列表形成相對應的點坐標[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循環

將一個嵌套列表轉換成一個一維列表。

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中還有字典推導式、集合推導式等,與列表推導式使用方式大致相同。

列表推導式的使用非常廣泛,從實際使用經驗來看,列表推導式使用的頻率是非常高的,也是相當好用的。而對於列表推導式的多層for循環,尤其是3層以上的或帶復雜篩選條件的,犧牲了較多的可讀性,直接用多個普通for循環方式實現就可以了,畢竟方便的實現功能是第一位的,多幾行代碼就多幾行吧。

實例:楊輝三角:

#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]

與簡單切片語法相比,擴展切片只是增加了第3個參數,即步長參數(英文資料中通常稱為"stride"或"step")。

擴展切片語法引入的"stride"參數是個需要特別註意的參數,因為它的正/負取值將會影響切片操作對源序列s的訪問方向,而這正是本文開始那幾個示例可能引起Python新手困惑的原因。

其實規則很簡單,說穿不值一文錢:

1) 當stride參數為正值(positive)時,表明切片操作從左至右(即正向)訪問源序列s的元素,此時,若begin和end參數有缺省,則Python解釋器默認將其設置為None。如s[0 : : 1]會被解釋器當作s[0 : None : 1],此時,end實際取值要大於其有效索引範圍的上限值,以保證切片操作能訪問到源序列s從begin開始的所有元素(從左向右)。

2) 當stride參數為負值(negative)時,表明切片操作從右至左(即逆向)訪問源序列s的元素,此時,若begin和end參數有缺省,則Python解釋器默認將其設置為None。如s[-1 : : -1]會被解釋器當作s[-1 : None : -1],此時,end實際取值要小於其有效索引範圍的下限值,已保證切片操作能訪問到源序列s從begin開始的所有元素(逆向,從右向左)。

3) 無論stride參數取正值還是負值,切片表達式的begin和end索引值需要保證在切片操作的訪問方向上,從begin到end之間有元素,這樣切片操作才能保證返回非空集。

s[4,8,1]

切片實例:

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]#倒數第二位

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:]

一句話搞定python六劍客