Python基础教程:生成器
1、生成器
def func():print("111")yield 222 gener = func() # 這個時候函數(shù)不會執(zhí)行. 而是獲取到生成? ret = gener.__next__() # 這個時候函數(shù)才會執(zhí)行. yield的作用和return一樣. 也是返回 數(shù)據(jù) print(ret) 結(jié)果: 111 222由于函數(shù)中存在了yield. 那么這個函數(shù)就是一個生成器函數(shù). 這個時候. 我們再執(zhí)行這個函數(shù)的時候. 就不再是函數(shù)的執(zhí)行了. 而是獲取這個生成器.
如何使用呢? 想想迭代器. 生成器的本質(zhì)是迭代器. 所以. 我們可以直接執(zhí)行__next__()來執(zhí)行
send和__next__()區(qū)別:
?生成器可以使?用for循環(huán)來循環(huán)獲取內(nèi)部的元素:
''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' def func():print(111)yield 222print(333)yield 444print(555)yield 666 gen = func() for i in gen:print(i) 結(jié)果: 111 222 333 444 555 6662、列表推導(dǎo)式
lst = [] for i in range(1, 15):lst.append(i) print(lst)替換成列表推導(dǎo)式:
lst = [i for i in range(1, 15)] print(lst)列表推導(dǎo)式是通過一行來構(gòu)建你要的列表, 列表推導(dǎo)式看起來代碼簡單. 但是出現(xiàn)錯誤之后很難排查.
列表推導(dǎo)式的常用寫法:
篩選模式:
[ 結(jié)果 for 變量 in 可迭代對象 if 條件 ] # 獲取1-100內(nèi)所有的偶數(shù) lst = [i for i in range(1, 100) if i % 2 == 0] print(lst)3、生成器表達式
生成器表達式和列表推導(dǎo)式的語法基本上是一樣的. 只是把[]替換成()
生成器表達式也可以進行篩選:
''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' # 獲取1-100內(nèi)能被3整除的數(shù) gen = (i for i in range(1,100) if i % 3 == 0) for num in gen:print(num) # 100以內(nèi)能被3整除的數(shù)的平?方 gen = (i * i for i in range(100) if i % 3 == 0) for num in gen:print(num) # 尋找名字中帶有兩個e的?人的名字 names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'], ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']] # 不不?用推導(dǎo)式和表達式 result = [] for first in names:for name in first:if name.count("e") >= 2:result.append(name) print(result) # 推導(dǎo)式 gen = (name for first in names for name in first if name.count("e") >= 2) for name in gen:print(name)生成器表達式和列表推導(dǎo)式的區(qū)別:
生成器的惰性機制: 生成器只有在訪問的時候才取值. 說白了. 你找他要他才給你值. 不找他要. 他是不會執(zhí)行的.
4、字典推導(dǎo)式
''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' # 把字典中的key和value互換 dic = {'a': 1, 'b': '2'} new_dic = {dic[key]: key for key in dic} print(new_dic) # 在以下list中. 從lst1中獲取的數(shù)據(jù)和lst2中相對應(yīng)的位置的數(shù)據(jù)組成一個新字典 lst1 = ['jay', 'jj', 'sylar'] lst2 = ['周杰倫', '林俊杰', '邱彥濤'] dic = {lst1[i]: lst2[i] for i in range(len(lst1))} print(dic)5、集合推導(dǎo)式
集合推導(dǎo)式可以幫我們一個集合. 集合的特點: 無序, 不重復(fù). 所以集合推導(dǎo)式自帶去重功能
lst = [1, -1, 8, -8, 12] # 絕對值去重 s = {abs(i) for i in lst} print(s)總結(jié): 推導(dǎo)式有, 列表推導(dǎo)式, 字典推導(dǎo)式, 集合推導(dǎo)式, 沒有元組推導(dǎo)式
生成器表達式: (結(jié)果 for 變量 in 可迭代對象 if 條件篩選)
生成器表達式可以直接獲取到生成器對象. 生成器對象可以直接進行for循環(huán). 生成器具有惰性機制.
總結(jié)
以上是生活随笔為你收集整理的Python基础教程:生成器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python语法点滴
- 下一篇: websocket python爬虫_p