初學python之解析式


解析式python

 

其目的主要用來減小編程行數,並減小棧幀從而達到代碼優化的效果編程

 

In [6]: [i ** 2 for i in range(11)]app

Out[6]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]ide

 

將生產環節元素表達式放在最前面函數

 

列表解析語法oop

[返回值 for 元素 可迭代對象if條件]優化

 

使用中括號表示,內部for爲循環跟if條件可選,返回一個新的列表spa

這樣能夠簡化編程中書寫而且減小了棧幀,從而達到優化效果orm

 

例:對i進行取模對象

In [23]: [ i for i in range(1,10) if i % 2 == 0]

Out[23]: [2, 4, 6, 8]

 

解析式中不能使用else 和 elif 因此須要用or 和 and來代替

In [4]: [i for i in range(20) if i %2 == 0 and i%3 == 0]

Out[4]: [0, 6, 12, 18]

 

使用or/ not

In [5]: [i for i in range(20) if i %2 == 0 or noti % 2== 0]

Out[5]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,12, 13, 14, 15, 16, 17, 18, 19]

 

使用and / not

In [11]: [i for i in range(20) if i % 2 ==0 andnot i % 3]

Out[11]: [0, 6, 12, 18]

能夠理解爲:

In [13]: [i for i in range(20) if i % 2 ==0 andnot i % 3 != 0]

Out[13]: [0, 6, 12, 18]

 

推導式的多重過濾

使用and進行代替多個if:if:if,對多重鄧加進行代替

 

 

for i in iter1:

    for j in iter2:

        lst.append(expr)

 

等價於:

In[14]: [expr for i in iter1 for j in iter2]

 

 

例:

1.  

In [14]: [ (x,y) for x in 'abc' for y in range(3)]

Out[14]:

[('a', 0),

('a', 1),

('a', 2),

('b', 0),

('b', 1),

('b', 2),

('c', 0),

('c', 1),

('c', 2)]

 

等價於:

In [21]: for i in 'abc':

    ...:     fory in range(3):

    ...:         lst.append((i,y))

  

 

In [26]: [{x:y} for x in "abcde" for yin range(3)]

Out[26]:

[{'a': 0},

{'a': 1},

{'a': 2},

{'b': 0},

{'b': 1},

{'b': 2},

{'c': 0},

等價於:

In [34]: for i in "abc":

    ...:     forx in range(3):

    ...:         lst.append({i:x})

 

 

在語句上第三個最方便,可是第一條最容易理解:

In [36]: [ (i,j) for i in range(7) if i > 4for j in range(20,25) if j > 23   ]

Out[36]: [(5, 24), (6, 24)]

 

In [37]: [(i,j) for i in range(7) for j inrange(20,25) if i > 4 if j > 23]

Out[37]: [(5, 24), (6, 24)]

 

In [39]: [(i,j) for i in range(7) for j inrange(20,25) if i > 4 and  j > 23]

Out[39]: [(5, 24), (6, 24)]

 

求99乘法表

 

[print ('{}*{}={:<3}{}'.format(j,i,i*j,'\n' ifi == j else ''),end = "") for i in range(1,10) for j in range(1,i+1)]

 

 


生成器表達式

與解析式同樣,只不過將中括號改成小括號

In [2]: a = (n for n in range(10))

In [3]: a

Out[3]: <generator object <genexpr> at 0x7fed4ea1cfc0>

 

In [5]: next(a)

Out[5]: 0

In [6]: next(a)

Out[6]: 1

In [7]: next(a)

Out[7]: 2

 

迭代中,只能使用一次,當獲取後則直接將其銷燬,再也不保留至內存空間中

使用next(a)的方法,必須必定是可迭代對象

 

 

使用生成器的好處:

   ·延遲計算

   ·返回迭代器,能夠進行迭代

   ·從簽到後走完一遍,不能回頭

 

 

例:

使用print進行觀察

In [8]: a = (print("{}".format(i+1))  for i in range(2))

In [9]: print(a)

<generator object <genexpr> at0x7fed51641f10>

 

In [10]: b = next(a)

1

In [11]: b = next(a)

2

In [12]: b = next(a)

---------------------------------------------------------------------------

StopIteration                             Traceback(most recent call last)

<ipython-input-12-78fca016cc6c> in<module>()

----> 1 b = next(a)

StopIteration:

 

 

 

生成器和列表解析式對比

 

當即生成和延後計算,能夠嵌套在列表解析式中從返回值來說,更節省內存,生成器則所有生成並返回

生成器沒有數據,佔用內存極少,使用的時候逐個返回

列表須要佔用更多的內存

 

計算速度

生成器耗時間很是短,列表解析消耗時間略長

生成器自己是一個迭代器

 

速度對比

In[14]: %timeit [x for x in range(500)]

18 μs ± 102 ns per loop (mean± std. dev. of 7 runs, 100000 loops each)

In[15]: %timeit (x for x in range(500))

741 ns± 7.58 ns perloop (mean ± std. dev. of 7 runs, 1000000 loops each)

 

 

 

集合解析式

將返回值for做爲可迭代對象經過if條件換位,

將括號換至爲大夥靠,生成後馬上返回一個集合

In [19]: {(x,x+1) for x in range(10)}

Out[19]:

{(0, 1),

(1, 2),

(2, 3),

(3, 4),

(4, 5),

(5, 6),

(6, 7),

(7, 8),

(8, 9),

(9, 10)}

 

 

字典解析式:

In [25]: {chr(0x41+x):x**2 for x in range(10) }

Out[25]:

{'A': 0,

'B': 1,

'C': 4,

'D': 9,

'E': 16,

'F': 25,

'G': 36,

'H': 49,

'I': 64,

'J': 81}

 

In [26]: {str(x):y for x in range(3) for y inrange(4)}

Out[26]: {'0': 3, '1': 3, '2': 3}

 

 

 

 

內建函數

 

iter 將一個可迭代對象封裝爲一個迭代器

a = iter(range(5))

 

迭代器對象,迭代器自己是可迭代的,因此說能夠經過iter方法將可迭代對象封裝爲迭代器而後經過next方法進行迭代

 

zip 拉鍊函數

將多個可迭代函數合併在一塊兒,返回一個迭代器,將每次不一樣對象中取到的元素合併到一個元組中

In [40]: list(zip(range(10),range(10)))

Out[40]:

[(0, 0),

(1, 1),

(2, 2),

(3, 3),

(4, 4),

(5, 5),

(6, 6),

(7, 7),

(8, 8),

(9, 9)]

 

 

zip木桶原理,取當前最短的,並再也不繼續

In [41]: list(zip(range(10),range(10),range(5)))

Out[41]: [(0, 0, 0), (1, 1, 1), (2, 2, 2), (3, 3,3), (4, 4, 4)]

 

 

若是某一個值超出,則只選擇最短的值,不會再進行屢次選取

In [42]: list(zip(range(10),range(10),range(50)))

Out[42]:

[(0, 0, 0),

(1, 1, 1),

(2, 2, 2),

(3, 3, 3),

(4, 4, 4),

(5, 5, 5),

(6, 6, 6),

(7, 7, 7),

(8, 8, 8),

(9, 9, 9)]

 

In [43]: list(zip(range(10),range(10),range(3)))

Out[43]: [(0, 0, 0), (1, 1, 1), (2, 2, 2)]

相關文章
相關標籤/搜索