用python编写图片生成器_python生成器
生成器
一、生成器
定義:
生成器與迭代器看成是一種。生成器的本質就是迭代器。
唯一的區別:
生成器是自己用python寫代碼構建的數據結構。迭代器都是(系統)提供的,或者轉化而來的
獲取生成器的三種方式:
生成器函數
生成器表達式
python內部提供部分
二、實現生成器函數
生成器函數也就是生成器
yield
yield return
yield from
代碼實現:
#普通函數:
def funf():
print(111)
print(222)
return 333
ret = funf() #此時ret = 333
print(ret)
----------------------
#生成器
def funf():
print(111)
print(222)
yield 333
ret = funf() #此時ret 是一個生成器對象
print(ret)
----------------------
#那怎么取值呢?
def funf():
print(111)
print(222)
yield 333
ret = funf()
print(next(ret))
-----------
#一個next對應一個yield
def funf():
print(111)
print(222)
yield 333
yield 444
yield 555
ret = funf()
print(next(ret))
print(next(ret))
print(next(ret))
--------------------
return 和 yield 區別
return:函數中只有一個return結束函數,并且給函數的執行者返回值
yield:如果函數有yield,那么它就是生成器函數而不是函數了,yield可以存在多個,一個next執行一個,兩個yield中間的代碼會依次執行!
例子:
def fun():
for i in range(1,5000):
yield F'{i}個包子'
ret = fun()
#第一個for循環打印1-200
for i in range(200):
print(next(ret))
#第二個for循環打印200-400
#迭代器的惰性機制
for i in range(200):
print(next(ret))
三、生成器表達式與列表推導式
3.1、推導列表式
用一行代碼構建一個比較復雜有規律的列表
列表推導式
循環模式:[變量(加工后的變量) for 變量 in iterable]
li = [i for i in range(10)]
print(li) #[1-10]
---------
li = [i*i for i in range(1,11)]
print(li)
li = [F'偶數是 {i}' for i in range(2,101,2)] #從2開始,2個2個選取
print(li)
篩選模式:[變量(加工后的變量) for 變量 in iterable if 條件]
li = [i for i in range(10) if i >5]
print(li) #[6, 7, 8, 9]
-----------
li = [i for i in range(1,31) if i%3==0]
print(li)
嵌套循環
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
print([name for lst in names for name in lst if name.count('e') >= 2]) # 注意遍歷順序,這是實現的關鍵
3.2、生成器表達式
語法基本上一樣 [] 變成 ()
模式都有
區別就是:一個省內存,一個需要大量內存
li = (i for i in range(10))
print(li) # at 0x000001F241B36948>
print(next(li)) #這樣輸出
生成器表達式和列表推導式的區別:
列表推導式比較耗內存,所有數據一次性加載到內存。而.生成器表達式遵循迭代器協議,逐個產生元素。
得到的值不一樣,列表推導式得到的是一個列表.生成器表達式獲取的是一個生成器
列表推導式一目了然,生成器表達式只是一個內存地址。
無論是生成器表達式,還是列表推導式,他只是Python給你提供了一個相對簡單的構造方式,因為使用推導式非常簡單,所以大多數都會為之著迷,這個一定要深重,推導式只能構建相對復雜的并且有規律的對象,對于沒有什么規律,而且嵌套層數比較多(for循環超過三層)這樣就不建議大家用推導式構建。
生成器的惰性機制: 生成器只有在訪問的時候才取值,說白了.你找他要才給你值.不找他要.他是不會執行的.
字典推導式
lst1 = ['jay','jj','meet']
lst2 = ['周杰倫','林俊杰','郭寶元']
dic = {lst1[i]:lst2[i] for i in range(len(lst1))}
print(dic)
集合推導式
lst = [1,2,3,-1,-3,-7,9]
s = {abs(i) for i in lst}
print(s)
總結
以上是生活随笔為你收集整理的用python编写图片生成器_python生成器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 下行物理信道rs_基于大规模MIMO技术
- 下一篇: graphpad图片怎么导出矢量图_Co