生成器 推導式

生成器:指用python代碼寫出來得迭代器,生成器的本質就是迭代器

  建立生成器的方法:python

  1.經過生成器函數 ( yield)函數

  2.生成器表達式spa

生成器函數:

def func1(x):
    sum = 0
    for i in range(1,x):
        x += 1
        yield x
g = func1(6)    #生成器函數對
print(g)  
# <generator object func1 at 0x0000025E5D618780> #表示這是一個迭代器
print(g.__next__()) #一個next對應一個yield
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__()) #7 8 9 10 11
#yiedld 將值返回給生成器對象.__next__()

  yield 的做用:1.一個next對應一個yieldcode

        2.yield將值返回給生成器對象.__next__()對象

  yield 與return的區別

  return的做用是結束函數,給函數的執行者返回值blog

  yield 不會結束函數,一個next對應一個yield,給__next__()返回值內存

  生成器函數vs迭代器

區別1:自定製的區別generator

l1 = [1,2,4]
l2 = l1.__iter__()

def func1(x):
    x += 1
    yield x
    x += 2
    yield x
    x += 3
    yield x
g = func1(5)
print(g.__next__())
print(g.__next__())

區別2:內存級別的區別it

迭代器是須要將可迭代對象進行轉化,可迭代對象很是佔內存class

生成器是直接建立,不須要轉化,從本質上就節省內存

send 與next

send與nxet同樣,也是對生成器取值(執行一個yield)的方法

send 能夠給上一個yield 進行傳值

第一次取值永遠都是next

最後一個yield 永遠也得不到send傳的值

列表推導式:一行代碼幾乎搞定你須要的任何列表

  循環模式 :[變量(加工後的變量) for 變量 in iterable(可迭代對象)]

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

  篩選模式 :[變量(加工後的變量)for 變量  in  iterable(可迭代對象)if 條件]

l2 = [i for i in range(1,10) if i%2 ==0]
print(l2)   #[2, 4, 6, 8]

列表推導式優勢:一行解決,方便

缺點:容易着迷,不易拍錯,不能超過三次循環

列表推導式不能解決全部的列表的問題,全部不要太刻意使用

生成器表達式:跟列表推導式相同,把[]換成()便可

l1 = ( i for i in range(1,1000000))
print(l1.__next__())    #1
print(l1.__next__())    #2
print(l1.__next__())
print(l1.__next__())
print(l1.__next__())    #5
#能夠經過循環打印必定數量的取值

字典推導式(瞭解)

mcase = {"a":10,"b":35}
mcase_frequency = {mcase[k]:k for k in mcase}
print(mcase_frequency)  #{10: 'a', 35: 'b'}

集合推導式(瞭解)

sq = {x**2 for x in range(-5,6)}
print(sq)       #{0, 1, 4, 9, 16, 25}
#自帶去重功能
相關文章
相關標籤/搜索