生成器

 生成器的特色

1、內存空間的角度
一、普通列表會將全部元素存到內存中,所以能夠進行切片式操做。若是列表元素不少,加載到內存中的時間就會很長。
二、生成器只能for循環的過程當中提取,根據垃圾清理機制,不管生成器內有多少元素,都只會佔用一個內存地址。
 
 
2、調用方式:
一、普通列表的調用方法有不少,好比切片,添加,刪除等等。
二、生成器只有在調用時纔會生成相應的數據,調用方式有 " str__next__.()   str.send() ",而且每調用一次就產生一個值調用到最後一個值後會報錯(可用:異常處理)。
 
注意:
next:是直接調用yield,並不會傳值。
send:是調用並直接傳值給yield。
 
 
 
3、列表生成器和生成器格式:
一、列表生成器:
[ i * 2 for i in range(10) ]
結果顯示:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
 
 
二、生成器:
( i * 2 for i in range(10) )
結果顯示:<generator object <genexpr> at 0x00000000006E87D8>
 
注意:若是有1億行記錄
第一個格式的效果可能花費5分鐘或者跟多時間。
第二個格式基本上是毫秒級的,由於只獲取一個內存地址

 
 

列表生成器

1、列表生成器的種類:
一、普通列表:
a = [1,2,3]
 
二、列表生成器:(每次循環都*2)
[i*2 for i in range(10)]
 
1 至關於:
2 a = []
3 for i in rang(10):
4     a.append(i*2)
5  
6 print(a)

注意:相似python 2.7裏的range(100)和xrange(100)
一、rang:是逐個返回1~100範圍值。
二、xrang:是返回一個內存地址,該地址包含了100的值,只有在for循環時纔會顯示
三、使用xrang的優點,結合python的垃圾回收機制,能夠循環使用同一個python

 
 
2、兩個列表的區別:
a:是寫死的。
列表生成器:是可擴展的。
 
 

生成器概念

一、具備生成能力的函數叫生成器。
二、具備取東西能力的函數叫迭代器。
三、主要關注生成器如何去寫;迭代器主要是python內部封裝好的;無需過多關注
 
 
 
1、經過filter進行結果過濾:
 1 li = [11,22,33,44,55,34]
 2 result= filter(lambda x:x>33,li)
 3 print(result)
 4 
 5 返回一個對象:
 6 <filter object at 0x0000000000A55128>
 7 
 8 
 9 #返回結果:具備生成指定條件數據的能力的一個對象。只有在循環它的時候生成
10 #是一個內存地址,該地址包括大於33的全部值
11 #該結果只有在for循環時纔會顯示
View Code

 

2、使用yield()轉成生成器。
 1 def func():
 2    yield 1
 3    yield 1
 4    yield 1
 5 
 6 ret  = func()
 7 print('ret:',ret)
 8 
 9 顯示結果
10 ret: <generator object func at 0x0000000000A38938>
11 
12 
13 #只要函數中出現yield,則會變成生成器,返回內存地址<generator object func at 0x00000000011388E0>
View Code

 

當用for循環遍幣ret時,內存地址則會轉換成數值,以下:
1 for i in ret:
2     print('foi循環:',i)
3 
4 
5 
6 顯示結果:
7 foi循環: 1
8 foi循環: 1
9 foi循環: 1
View Code
註釋:
當for循環進入函數時,會找到yield1,並打印1,而後返回結果。
當在一次for循環時,會找到上一次的執行結果1,而後從上次執行結果後在執行一個2,而且返回。
屢次for循環,以此類推。
 
 
 
3、生成器的屬性:
生成器是因爲函數建立的,而函數名就是生成器。
 1 def myrange(arg):
 2     start = 0
 3     while True:
 4         if start > arg:
 5             return
 6         yield  start
 7         start += 1
 8 
 9 ret = myrange(3)
10 
11 r = ret.__next__()  #進入函數,找到yield,獲取yield後面的數據,每運行一次,生成器就會往下執行一個數值:
12 print(r)
13 r = ret.__next__()
14 print(r)
15 r = ret.__next__()
16 print(r)
17 r = ret.__next__()
18 print(r)
19       
20        顯示結果:
21 0
22 1
23 2
24 3
建立一個myrang的生成器:
相關文章
相關標籤/搜索