手機版
你好,游客 登錄 注冊
背景:
閱讀新聞

Python 生成器和推導式

[日期:2019-10-07] 來源:Linux社區  作者:wangtp [字體: ]

一、Python生成器和生成器函數
1、生成器和生成器函數的概念
    1、生成器的本質是迭代器
    2、函數中包含yield,就是生成器函數

2、生成器函數的寫法
    def func():
        a =10
        yield 20
    gen = func()  #沒有執行,而是生成一個生成器
    普通函數和生成器函數的不同
    1、普通函數名()表示函數的的執行
    2、生成器函數名()不是函數的執行,而是生成一個生成器

    yield和return的不同
    1、retun表示返回,同時函數執行終止,return之后的代碼不會執行
    2、yield也表示返回,函數暫停,函數分段執行

    def func():
        a =10
        yield 20
        b = 30
        yield 40
    gen = func()  #生成一個生成器
    gen.__next__() #返回20 執行到第一個yield
    gen.__next__() #返回40 從第一個yeild開始執行到第二個yield

3、如何得到生成器
    1、生成器函數
      生成器函數名()
    2、生成器表達式
    3、類型轉換

4、生成器的特點
    1、節省內存
    2、惰性機制(每執行一次__next__()方法,取值一次)
    3、只能向前取值,不能退后

5、生成器的取值
    __next__()方法和send()方法的區別
      前者表示向下取值
      后者除了表示向下取值,還可以給上一個yield傳遞值
      注意:send()方法不能用在第一個取值,第一個取值只能用__next__()
            最后一個yield也不能用send()

6、生成器的好處
    節約內存
'''

#關于__next__()方法和send()方法的例子
def func():
    a = 1
    a2 = yield 2
    print(a2)
    c = 3
    c2 = yield 4
    print(c2)
    yield 5
gen = func() #生成一個生成器
gen.__next__()  #執行到了第一個yield
gen.send('test') #把參數傳遞到第一個yield
gen.send('娃哈哈') #把參數傳遞到第2個yield

#生成器的好處-節約內存的例子
#一次性買100件衣服,需要地方保存,比較浪費內存
li1 = []
def func2():
    for i in range(1,11):
        li1.append('衣服 %s' % i)
    return li1
ret = func2()
print(ret)  #100件衣服一次性生成出來,放到列表到了
print('----------1')

#最好的方式是下一個100件衣服的訂單,但是呢,需要一件,送一件,就不需要專門的地方保存了,節約內存
#方法1 生成器函數
def func3():
    for i in range(1,11):
        yield ('衣服 %s' %i)
gen = func3()  #生成一個生成器
print(gen.__next__()) #第一件
print(gen.__next__()) #第二件
for i in gen: #生成器本質是迭代器,支持for循環
    print(i)

#方法2 生成器表達式
# gen = (i for i in range(1,11))
# print(gen)  #生成一個生成器(類比:就是買衣服訂單)
# print(gen.__next__()) #第一件
# print(gen.__next__()) #第二件
# for i in gen: #生成器本質是迭代器,支持for循環
#    print(i)

二、推導式
推導式(列表推導式,字典推導式等)
1、列表推導式:[結果      for循環 if條件]
2、字典推導式:{key: value for循環 if條件}
3、集合推導式:{key        for循環 if條件}
注意:沒有元組推導式

三、生成器表達式
1、生成器表達式:(結果 for循環 if條件)
2、惰性機制(類比:彈夾沒子彈了,不能將同一個值,生成2次)
  生成器是記錄在內存中的一段代碼,產生的時候,沒有執行

生成器表達式和列表推導式的區別類比:
1、買100個雞蛋,列表推導式:是一次性把100個雞蛋買回來,需要地方存儲
2、生成器表達式:是買一只母雞,需要雞蛋就給下蛋

Linux公社的RSS地址http://www.vnrggh.live/rssFeed.aspx

本文永久更新鏈接地址http://www.vnrggh.live/Linux/2019-10/160935.htm

linux
本文評論   查看全部評論 (0)
表情: 表情 姓名: 字數

       

評論聲明
  • 尊重網上道德,遵守中華人民共和國的各項有關法律法規
  • 承擔一切因您的行為而直接或間接導致的民事或刑事法律責任
  • 本站管理人員有權保留或刪除其管轄留言中的任意內容
  • 本站有權在網站內轉載或引用您的評論
  • 參與本評論即表明您已經閱讀并接受上述條款
彩票平台