day13 生成器 三元运算 列表解析
生活随笔
收集整理的這篇文章主要介紹了
day13 生成器 三元运算 列表解析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本質上來說生成器迭代器都是一種數據類型,如果你直接打印生成器是無法得出值的,會得到一串內存地址,即一個對象
想要得到生成器的值必須要用for或者next,list等來獲取
生成器
生成器就是一個可迭代對象
本質上就是一種數據類型
表現形式有兩種
生成器函數: 使用yield 代替 return,但是可以返回多次值
調用之后函數內的代碼不執行,返回生成器
每從生成器中取一個值就執行一段,遇到yield就停止
如何從生成器取值:
for: 如果沒有break就可一直取到最后
next:每次取一個,首次使用時激活生成器
send:不能用在第一個,取下個值會給上個位置傳一個新的值
數據類型強制轉換: 會一次把所有的數據讀到內存中
生成器表達式
(條件成立的放在生成器的值 for i in 可迭代的 if 條件)
優點
生成器延遲計算,一次返回一個值,大數據量處理很好用
保存狀態
提高代碼可讀性
基本的生成器函數 1 def test(): 2 yield 1 3 yield 2 4 yield 3 5 g = test() 6 print(g) # <generator object test at 0x00000000027F4E58> 7 print(g.__next__()) # 1 8 print(next(g)) # 2 生成器的一次性 1 def test(): 2 for i in range(4): 3 yield i 4 t = test() 5 t1 = (i for i in t) 6 print(list(t1)) # [0, 1, 2, 3] 生成器是第一次性的。 7 print(list(t1)) # [] 生成器是第一次性的。再次使用就無法獲取了 迷惑操作 1 def test(): 2 for i in range(4): 3 yield i 4 t = test() 5 t1 = (i for i in t) 6 t2 = (i for i in t1) # 生成器在產生的時候,并不會有任何的操作 7 # 生成器是按需取值,因此一開始建立并沒有使用,是無值的 8 print(list(t1)) # [0, 1, 2, 3] 生成器被遍歷使用了,才會被消耗掉 9 print(list(t2)) # [] 生成器表達式 1 laomuji = ("雞蛋%s" % i for i in range(10)) # 生成器表達式 2 print(laomuji) # <generator object <genexpr> at 0x0000000002814E58> 3 print(laomuji.__next__()) # 雞蛋0 4 print(next(laomuji)) # 雞蛋1
列表解析
數據量比較大的時候不要用,很笨重
原有的正常操作,比較多代碼而且很啰嗦 1 egg_list = [] 2 for i in range(10): 3 egg_list.append("雞蛋%s" %i) 4 print(egg_list) 使用列表解析后 1 l = ["雞蛋%s" %i for i in range(5) ] 2 l1 = ["雞蛋%s" %i for i in range(5) if i>2 ] 3 # l2 = ["雞蛋%s" %i for i in range(10) if i>5 else i] # 不存在4元表達式 4 print(l) # ['雞蛋0', '雞蛋1', '雞蛋2', '雞蛋3', '雞蛋4'] 5 print(l1) # ['雞蛋3', '雞蛋4'] 6 # print(l2) # SyntaxError: invalid syntax
想要得到生成器的值必須要用for或者next,list等來獲取
生成器
生成器就是一個可迭代對象
本質上就是一種數據類型
表現形式有兩種
生成器函數: 使用yield 代替 return,但是可以返回多次值
調用之后函數內的代碼不執行,返回生成器
每從生成器中取一個值就執行一段,遇到yield就停止
如何從生成器取值:
for: 如果沒有break就可一直取到最后
next:每次取一個,首次使用時激活生成器
send:不能用在第一個,取下個值會給上個位置傳一個新的值
數據類型強制轉換: 會一次把所有的數據讀到內存中
生成器表達式
(條件成立的放在生成器的值 for i in 可迭代的 if 條件)
優點
生成器延遲計算,一次返回一個值,大數據量處理很好用
保存狀態
提高代碼可讀性
基本的生成器函數 1 def test(): 2 yield 1 3 yield 2 4 yield 3 5 g = test() 6 print(g) # <generator object test at 0x00000000027F4E58> 7 print(g.__next__()) # 1 8 print(next(g)) # 2 生成器的一次性 1 def test(): 2 for i in range(4): 3 yield i 4 t = test() 5 t1 = (i for i in t) 6 print(list(t1)) # [0, 1, 2, 3] 生成器是第一次性的。 7 print(list(t1)) # [] 生成器是第一次性的。再次使用就無法獲取了 迷惑操作 1 def test(): 2 for i in range(4): 3 yield i 4 t = test() 5 t1 = (i for i in t) 6 t2 = (i for i in t1) # 生成器在產生的時候,并不會有任何的操作 7 # 生成器是按需取值,因此一開始建立并沒有使用,是無值的 8 print(list(t1)) # [0, 1, 2, 3] 生成器被遍歷使用了,才會被消耗掉 9 print(list(t2)) # [] 生成器表達式 1 laomuji = ("雞蛋%s" % i for i in range(10)) # 生成器表達式 2 print(laomuji) # <generator object <genexpr> at 0x0000000002814E58> 3 print(laomuji.__next__()) # 雞蛋0 4 print(next(laomuji)) # 雞蛋1
列表解析
數據量比較大的時候不要用,很笨重
原有的正常操作,比較多代碼而且很啰嗦 1 egg_list = [] 2 for i in range(10): 3 egg_list.append("雞蛋%s" %i) 4 print(egg_list) 使用列表解析后 1 l = ["雞蛋%s" %i for i in range(5) ] 2 l1 = ["雞蛋%s" %i for i in range(5) if i>2 ] 3 # l2 = ["雞蛋%s" %i for i in range(10) if i>5 else i] # 不存在4元表達式 4 print(l) # ['雞蛋0', '雞蛋1', '雞蛋2', '雞蛋3', '雞蛋4'] 5 print(l1) # ['雞蛋3', '雞蛋4'] 6 # print(l2) # SyntaxError: invalid syntax
?
?
轉載于:https://www.cnblogs.com/shijieli/p/9705181.html
總結
以上是生活随笔為你收集整理的day13 生成器 三元运算 列表解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 京东App升级:确认百亿补贴将于38节上
- 下一篇: springboot集成springDa