迭代器
#可以被netxt()函數調用不斷返回一個值的對象成爲迭代器:Iterator
#迭代器是訪問集合元素的一種方式,從集合第一個元素開始(用next()方法)訪問就不能回退,便於循環遍歷一些較大的數據集合節省內存和時間。 一個簡單的迭代器: numbers = iter([1,2,3]) print(numbers) print(numbers.__next__()) print(numbers.__next__()) Result:<list_iterator object at 0x1021777b8> 1 2
生成器
# 通過列表生成式,我們可以直接創建一個列表。但是,受到內存限制,列表容量肯定是有限的。 #如果我們僅僅需要訪問前面幾個元素,那後面絕大多數元素佔用的空間都白白浪費了。
#這樣就不必創建完整的list,從而節省大量的空間。在Python中,這種一邊循環一邊計算的機制,稱爲生成器:generator。
#一個簡單的生成器:
>>> g
=
(x
*
x
for
x
in
range
(
10
))
>>> g
<generator
object
<genexpr> at
0x1022ef630
>
#一個函數返回的是一個迭代器,這個函數就是一個生成器. # 主要作用是保持函數的執行狀態,可以中斷函數的執行然後繼續. def cash_money (number): while number > 0: number -= 100 yield 100 print("取了100元!") atm= cash_money(500) print(type(atm)) print(atm.__next__()) print(atm.__next__()) print("去吃飯")#中斷了函數的循環,去執行另外的任務. print(atm.__next__()) #繼續生成器中的循環 這個很強大.
而在實際操作中,我們並不用不停的__next__(),而是用for循環即可遍歷生成器:
>>> g = (x * x for x in range(10)) >>> for n in g: ... print(n) ... 0 1 4 9 16 25 36 49 64 81
總結:
我們已經知道,可以直接作用於for循環的數據類型有以下幾種 一類是集合數據類型,如list、tuple、dict、set、str等 一類是generator,包括生成器和帶yield的generator function 這些可以直接作用於for循環的對象統稱爲可迭代對象:Iterable 可以使用isinstance()判斷一個對象是否是Iterable對象: >>> from collections import Iterable >>> isinstance([], Iterable) True >>> isinstance({}, Iterable) True >>> isinstance('abc', Iterable) True >>> isinstance((x for x in range(10)), Iterable) True >>> isinstance(100, Iterable) False