1. 程式人生 > 實用技巧 >Python解析式與三元表示式

Python解析式與三元表示式

解析式

列表解析式的一般形式:

variable = [expression for value in iterable if condition]    
  變數        表示式       收集器              條件    

或者這樣的:

l = [i ** 2 for i in range(1, 21) if i % 2 == 0]
print(l)  # [4, 16, 36, 64, 100, 144, 196, 256, 324, 400]

也可以這樣,建立一個巢狀列表:

l = [[col for col in range(3)] for rows in range(5)]
print(l)  # [[0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]

上例中,大的列表共有rows個子元素,每個子元素(巢狀內的列表)是col。
或者 這樣的:

l = [x + y for x in 'abc' for y in 'ABC']
print(l)  # ['aA', 'aB', 'aC', 'bA', 'bB', 'bC', 'cA', 'cB', 'cC']

注意,不用一味的渴求簡便,要注意可讀性。

集合推導式

同樣的,集合也有其推導式,用法與列表類似,只要將中括號換為大花括號即可。

variable = {expression for value in iterable if condition}   
  變數        表示式       收集器              條件 

來個示例:

s = {i for i in range(10)}
print(s)  # {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

s1 = {i for i in range(10) if i % 2 == 0}
print(s1)  # {0, 8, 2, 4, 6}

s2 = {i ** 2 for i in range(10) if i % 2 == 0}
print(s2)  # {0, 8, 2, 4, 6}

s3 = {x + y for x in 'abc' for y in 'ABC'}
print(s3)  # {'aB', 'bA', 'aA', 'cC', 'bB', 'cA', 'cB', 'bC', 'aC'}

那麼同為花括號的字典呢,也有自己的推導式。

字典推導式

d = {k: '我是value啦' for k in range(5)}
print(d)  # {0: '我是value啦', 1: '我是value啦', 2: '我是value啦', 3: '我是value啦', 4: '我是value啦'}

三元表示式

接下來再說一個知識點——三元表示式,其語法是:

result = True if condition else False

if後跟條件,條件為真返回if左側的結果,當條件為假則返回else的結果,其等價於下面的示例:

x = 1  
y = 2  
if x < y:  
    print(x)  
else:  
    print(y)  
res = x if x < y else y  

有些情況下的程式碼結構相當的簡單,所以Python為我們提供一種將這種簡單結構的程式碼鑲嵌在較大的表示式內的格式。

深淺拷貝:

l2=[‘1’,’3’,’4’,’5’]

l1=l2     註釋:l2的值改變,l1的值隨之改變

l1=l2.copy()    註釋:l2的值改變,l1的值不改變

x=[‘3’,’5’]

l3=[‘1’,‘2’,‘3’,x]

l1=l3.copy()   註釋:x的值改變,l3和l1的值都改變。但是l3的值改變,l1的值不改變

l1=l3.deepcopy()     註釋:l3中的x值改變,不影響l1中x的值,自然也不會影響的l1。完全拷貝