1. 程式人生 > >生成器表示式 各種推導式

生成器表示式 各種推導式

openstack   瞭解即可

def generator():
    print(123)
    yield 1
    print(456)
    yield 2
    print(789)  #按道理print(789)不執行,但是最下面遇到next了,就會列印,但是會報錯

g = generator()
ret = g.__next__()
print('***',ret)
ret = g.__next__()
print('***',ret)
ret = g.__next__()
注意這個程式和上邊程式的對比
def
generator(): print(123) content
= yield 1 # 遇見= 等號,先執行等號右邊的。 print('***',content) print(456) yield 2 g = generator() ret = g.__next__() print('***',ret) ret = g.send('hello') #send效果和next效果一樣 print('***',ret)

send 

send作用範圍與next一樣

send的獲取下一個值得效果和next效果基本一致,只是在獲取下一個值得時候,給上一個的yiled的位置傳一個值。

使用send注意事項

1,第一次使用生成器的時候,是用next獲取下一個值。

2,最後一個yiled不能接收外部的值

3,send用的少,next用的多

#獲取移動平均值
def average():
    sum = 0
    count = 0
    avg = 0
    while 1:
        num = yield avg
        sum += num
        count += 1
        avg = sum/count

avg_g = average()
avg_g.__next__()
avg1 = avg_g.send(10)
avg1 = avg_g.send(20)
print(avg1)

預激生成器的裝飾器

def
init(func): #func = average() def inner(*args,**kwargs): g = func(*args,**kwargs) #g=average() g.__next__() #注意哦 ⑩③return g return inner @init #average = init(averrage) = inner def average(): sum = 0 count = 0 ⑩①avg = 0 while 1: ⑩⑥num = ⑩②yield avg⑩⑩ ⑩⑦sum += num ⑩⑧count += 1 ⑩⑨avg = sum/count ⑩④avg_g = average()⑥ ⑩⑩①ret = ⑩⑤avg_g.send(10) ⑩⑩②print(ret)

yield from

def generator():
    a = '12345'
    b = 'abcde'
    yield from a #yiled from a  =  #for i in a:
    yield from b                      #yiled i

g = generator()
for i in g:
    print(i)

列表推導式

print([i for i in range(10)])

結果 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
egg_list = (['雞蛋%s' %i for i in range(10)])
print(egg_list)

結果 ['雞蛋0', '雞蛋1', '雞蛋2', '雞蛋3', '雞蛋4', '雞蛋5', '雞蛋6', '雞蛋7', '雞蛋8', '雞蛋9']

生成器表示式

g = (i for i in range(10))   #注意與列表推導式區別就在括號變了
g = (i for i in range(10))     #這時的g就是生成器了,列印g結果是<generator object <genexpr> at 0x000001F1442CEF10>
print(g)
for i in g :
    print(i)

注意,列表推導式和生成器表示式的區別

1,括號不一樣

2,返回值不一樣

3,生成器表示式返回的是記憶體地址,所以幾乎不佔記憶體

各種推導式:列表推導式   集合推導式   字典推導式    (元祖沒有推導式)

列表推導式

print([i for i in range(10)])

結果 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
egg_list = (['雞蛋%s' %i for i in range(10)])
print(egg_list)

結果 ['雞蛋0', '雞蛋1', '雞蛋2', '雞蛋3', '雞蛋4', '雞蛋5', '雞蛋6', '雞蛋7', '雞蛋8', '雞蛋9']

[每一個元素或者相關元素的操作  for  元素  in  可迭代的資料型別]

[滿足條件的元素相關操作  for  元素  in  可迭代的資料型別  if  元素相關條件]    完整的列表推導式

ret = [i for i in range(30) if i%30 == 0]  #完整的列表推導式
print(ret)

注意:在列表推導式中先看if   

1,如果有if ,列表裡元素的個數不一定都在新列表裡

2,如果沒有if,列表裡元素對應的個數會和新列表裡元素的個數一樣

列表巢狀

names = [['jake','tom','steven'],['alice','jill','eva']]
ret = [name for li in names for name in li if name.count('e') == 2]
print(ret)

字典推導式

例一:將一個字典的key和value對調

dic = {'a':1,'b':2}
dic1 = {dic[k]:k for k in dic}
print(dic1)

集合推導式

例:計算列表中每個值的平方,自帶去重功能

squared = {x**2 for x in [1, -1, 2]}
print(squared)
# Output: set([1, 4])

練習題:

例1:  過濾掉長度小於3的字串列表,並將剩下的轉換成大寫字母

li = ['abcd','edft','asd']
li1 = [i.upper() for i in li if len(i) >= 3]
print(li1)