Python基礎-----三元表達式、列表生成式、生成器表達式

三元表達式:

變量 = 值1 if 條件為真 else 值2

類似于:

            res = '對了' if 1 > 2 else '錯了'
            print(res)
            >>> '錯了'
   普通表示:  if 1 > 2:
               print('對了')
            else:
               print('錯了')

列表生成式:

假如要生成0-9共10個數(shù)字,存放在列表中
類似于:

 l = [i for i in range(10)]
            print(l)
            >>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

   普通表示:  l = []
            for i in range(10):
               l.append(i)
            print(l)

列表解析與三元表達式共同使用:
假如要生成0-9共10個數(shù)字中大于5的數(shù)字,存放在列表中

   l = [i for i in range(10) if i>5]
   >>> [6, 7, 8, 9]

生成器:

為一種數(shù)據(jù)類型,該數(shù)據(jù)類型自動實現(xiàn)了迭代器協(xié)議(其他數(shù)據(jù)類型如字典、列表等,需要先執(zhí)行__iter__()方法)
所以生成器就是可迭代對象

生成器分類及在python中的表現(xiàn)形式:
1、生成器函數(shù):同常規(guī)函數(shù)一樣定義,但是使用yield語句(可以執(zhí)行多次)而不是return語句返回結果。yield語句一次返回一個結果,
在每個結果中間,掛起函數(shù)的狀態(tài),以便下次從它離開的地方繼續(xù)執(zhí)行;

   def test():
      for i in range(1,4):
         yield i
   a = test()
   print(a.__next__())
   >>> 1
   print(a.__next__())
   >>> 2
   print(a.__next__())
   >>> 3

生成器表達式:

類似于列表推導,但是生成器返回按需產(chǎn)生結果的一個對象,而不是一次構建一個結果列表
類似于列表生成式,只是將[]改為()

   l = (i for i in range(1,4))
   print(l.__next__())
   >>> 1
   print(l.__next__())
   >>> 2
   print(l.__next__())
   >>> 3

所以生成器表達式配合for以及內(nèi)置函數(shù)方便的使用一些功能
如求0~100的和

   sum(i for i in range(101))

生成器的優(yōu)點:

1、生成器的好處是延遲計算(按需產(chǎn)生結果),一次返回一個結果。也就是說,它不會一次生成所有的結果,這對于大數(shù)據(jù)量處理將會非常有用;
2、生成器還能提高代碼的可讀性。

注意事項:生成器只能遍歷一次(遍歷完成,函數(shù)失效),超出次數(shù)會拋出StopIteration異常

例子:
有一個 人口普查.txt

{'city':'A','people':1000}
{'city':'B','people':10100}
{'city':'C','people':12000}
{'city':'D','people':10300}
{'city':'E','people':102300}

想要獲取這五個城市的人口總和

def get_people(filename):
   with open(filename,'r',encoding='utf-8-sig') as f:
      for i in f:
         yield eval(i)['people']

data_people = get_people('人口普查.txt')
all_people = sum(data_people)
print(all_people)

求一段文字中,每個單詞出現(xiàn)的位置
普通方法

def index_words(text):
   result = []
   if text:
      result.append(0)
   for index,letter in enumerate(text,1):
      if letter == ' ':
         result.append(index)
   return result
print(index_words('helllo alex da sb'))

使用生成器

def index_words(text):
   try:
      if text:
         yield 0
      for index,letter in enumerate(text,1):
         if letter == ' ':
            yield index
   except StopIteration:   #捕獲生成器沒值異常
      print('沒了~~~')
g = index_words('helllo alex da sb')
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容