最近重新回憶了一下Python的生成器,下面給大家介紹一下
簡單的說,生成器只有在調用的時候在會生成相應的數據,我們來看一個例子
a =
[]
for
i
in
range(10
):
a.append(i)
print
(a)
運行結果如下:
其實,這么多行的代碼我們可以使用列表生成式一行代碼就可以搞定了如下:
>>> [ i*2
for
i
in
range(10
) ]
[0,
2, 4, 6, 8, 10, 12, 14, 16, 18]
OK,那看到這,可能有人會問,有什么卵用呢?
好處當然是有滴,聽我細說,首先列表生成器可以省內存
如果我們用一個列表存儲很多數據,但我們可能用到的只是前面的一些數據,那么就會耗時耗力,那么對于有規律(后面的元素比前面的大一)的元素,就可以考慮列表生成式
>>> ( i*2
for
i
in
range(10
) )
at 0x0000020DFC10B888>
當我把中括號改為小括號時發現,其實列表生成式返回的是一個內存地址,那么我給它賦值看一下效果
>>> temp = ( i*2
for
i
in
range(10
) )
>>>
for
i
in
temp:
...
print
(i)
...
0
2
4
6
8
10
12
14
16
18
>>>
如果循環的數特別大,我們在看下效果
>>> temp = ( i*2
for
i
in
range(10000000
) )
>>>
for
i
in
temp:
...
print
(i)
...
0
2
4
6
8
...
5134
5136
5138
5140
Traceback (most recent call last):
File
"
"
, line 2,
in
KeyboardInterrupt
>>> temp[1000
]
Traceback (most recent call last):
File
"
"
, line 1,
in
TypeError:
'
generator
'
object
is
not
subscriptable
還沒執行完,被我Ctrl+C中止了,中間省略了一些,然后我直接調用temp[1000],報錯了,由此看出,生成器只有在調用的時候才生成,不調用的時候沒有數據生成,那我怎么取數據呢?
只能調用__next__方法,如下:
>>> temp.
__next__
()
5142
>>> temp.
__next__
()
5144
>>> temp.
__next__
()
5146
朋友們有沒有發現一個問題,是接著我暫停的地方開始接著往下取的,那么問題來了,我能不能返回取上一個數據呢?答案是不行的,生成器只能不停的往下next
好的,相信你已經簡單了解生成器了,但是這是有規律的表達式,要是沒有規律的一些問題,例如,斐波那契數列問題,那可以使用函數實現
def
fib(temp):
n, a, b
= 0, 0, 1
while
n <
temp:
print
(b)
a, b
= b, a +
b
n
= n + 1
fib(
10)
此函數正常輸出就是斐波那契數列的值,那現在我給他變成生成器
def
fib(temp):
n, a, b
= 0, 0, 1
while
n <
temp:
yield
b
a, b
= b, a +
b
n
= n + 1
print
(fib(10))
返回值為
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

