1. 程式人生 > >Python全棧day18(三元運算,列表解析,生成器表達式)

Python全棧day18(三元運算,列表解析,生成器表達式)

協議 什麽是 list 列表解析 不但 pri 就是 雞蛋 無限制

一,什麽是生成器

  可以理解為一種數據類型,這種數據類型自動實現了叠代器協議(其他數據類型需要調用自己內置的__iter__方法),所以生成器是可叠代對象。

二,生成器分類在python中的表現形式

  1,生成器函數:常規函數定義,但是,使用yield語句而不是return語句返回結果。yield語句一次返回一個結果,在每個結果中間,掛起函數狀態,以便下次從它離開的地方繼續執行day18-5.py

def test():
    yield 1
    yield 2

g=test()
print(g)
print(g.__next__())
print(g.__next__())

<generator object test at 0x000001D40CF6F3B8>
1
2

  不同於return可以yield多個值,因為是可叠代對象所以有next方法

  2,生成器表達式:類似於列表推導,但是生成器返回按需產生結果的一個對象,而不是一次構建一個結果列表

  

三,三元表達式,如果表達式成立返回前面的值否則返回後面的值day18-7.py

name=‘zhangsan‘
print(‘SB‘ if name == ‘zhangsan‘ else ‘帥哥‘)

  

四,列表表達式,舉例說明 day18-8.py

#使用for循環實現生雞蛋
egg_list=[]
for i in range(10):
    egg_list.append(‘雞蛋%s‘ %i)

print(egg_list)

#使用列表表達式生雞蛋
l=[‘雞蛋%s‘%i for i in range(10) ]
print(l)

[‘雞蛋0‘, ‘雞蛋1‘, ‘雞蛋2‘, ‘雞蛋3‘, ‘雞蛋4‘, ‘雞蛋5‘, ‘雞蛋6‘, ‘雞蛋7‘, ‘雞蛋8‘, ‘雞蛋9‘]
[‘雞蛋0‘, ‘雞蛋1‘, ‘雞蛋2‘, ‘雞蛋3‘, ‘雞蛋4‘, ‘雞蛋5‘, ‘雞蛋6‘, ‘雞蛋7‘, ‘雞蛋8‘, ‘雞蛋9‘]

  使用for循環和列表表達式生成是結果是一樣的

  使用三元表達式加一個if判斷條件(三元表達式可以是三元也可以是二元,但是不能是四元)

l=[‘雞蛋%s‘%i for i in range(10) if i>5]
print(l)

[‘雞蛋6‘, ‘雞蛋7‘, ‘雞蛋8‘, ‘雞蛋9‘]

  以上使用表達式生成的列表直接在內存中,可以使用生成器表達式

egg_list=[‘雞蛋%s‘%i for i in range(10)]
laomuji=(‘雞蛋%s‘%i for i in range(10))
print(laomuji)
print(next(laomuji))    #next的本質就是調用__next__
print(laomuji.__next__())
print(next(laomuji))

<generator object <genexpr> at 0x000001D39C97F3B8>
雞蛋0
雞蛋1
雞蛋2

  PS:不能無限制的next因為定義生成器的時候定義了範圍0-9所以最多到雞蛋9

  總結:

  1,把列表解析的[]換成()得到的就是生成器表達式

  2,列表解析與生成器表達式都是一種便利的編程方式,只不過生成器表達式更節省內存

  3,Python不但所以叠代器協議讓for循環變得更加通用。大部分內置函數,也是使用叠代器協議訪問對象的。例如,sum函數是Python的內置函數,該函數使用叠代器協議訪問對象,而生成器實現了叠代器協議,所以,我們可以直接作用計算一系列值的和

print(sum(x ** 2 for x in range(4)))

14

  

Python全棧day18(三元運算,列表解析,生成器表達式)