日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python基础教程:生成器

發(fā)布時間:2025/3/20 python 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python基础教程:生成器 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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ū)別:

  • send和next()都是讓生成器向下走一次
  • send可以給上一個yield的位置傳遞值, 不能給最后一個yield發(fā)送值. 在第一次執(zhí)行生成器代碼的時候不能使用send()
  • ?生成器可以使?用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 666

    2、列表推導(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 可迭代對象]

    篩選模式:

    [ 結(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ū)別:

  • 列表推導(dǎo)式比較耗一次性加生成器表達幾乎不用內(nèi)存. 使用的時候才分配和使用內(nèi)存
  • 得到的值不一樣. 列表推導(dǎo)式得到的是一個列列表. 生成器表達式獲取的是一個生成器.
  • 生成器的惰性機制: 生成器只有在訪問的時候才取值. 說白了. 你找他要他才給你值. 不找他要. 他是不會執(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。