**
我們每次用for迴圈取值,具體for迴圈是是怎麼實現的呢?
我們知道列表、字典、集合、字串都可以用for迴圈取值,而乙個數字為什麼不行呢
for迴圈也是有要求的,首先能迴圈取值的必須是乙個可迭代物件,看下面例子:
from collections import iterable
a ="abc"
print
(isinstance
(a, iterable)
)# 判斷是不是乙個可迭代的物件,返回true就是可迭代物件,所以能用for迴圈
再看乙個例子:
a =
1234
for i in a:
# 這裡會報錯:typeerror: 'int' object is not iterable
print
(a)
意思就是int不是乙個可迭代物件
print(isinstance(a, iterable)) # 返回false,所以不能用for迴圈
下面有3個變數
iter=[
1,2,
3,4,
5,6]
iter_1 =[1
,2,3
,4,5
,6].__iter__(
)iter_3 =
.__iter__(
)print
(type
(iter))
# 發現型別是乙個列表
print
(type
(iter_1)
)# 發現型別是乙個列表迭代器list_iterator
print
(type
(iter_3)
)# 發現型別是乙個字典迭代器dict_keyiterator
所以後面加上__iter__就是將乙個可迭代的物件變成了乙個迭代器
for迴圈就是在執行之前可迭代物件加了__iter__,變成了迭代器,然後一一去取值,那麼怎麼取值呢,就是用__next__
#乙個乙個的取值
print
('---'
, iter_1.__next__())
print
('---'
, iter_1.__next__(
))
如果取值時超出了迭代器的值,就會報乙個stopiteration錯誤(比如迭代器有2個值,但是用了3個__next__),所以這裡要想取所有值並且不報錯,就可以死迴圈取值和斷言
iter
=.__iter__(
)while
true
:try
: item = l_iter.__next__(
)print
(item)
except stopiteration:
break
這樣其實就相當於模擬了for迴圈
python中提供的生成器:
1.生成器函式:常規函式定義,但是,使用yield語句而不是return語句返回結果。yield語句一次返回乙個結果,在每個結果中間,掛起函式的狀態,以便下次重它離開的地方繼續執行
2.生成器表示式:類似於列表推導,但是,生成器返回按需產生結果的乙個物件,而不是一次構建乙個結果列表
def
fun1()
: a =
1print
('定義a變數'
)yield a
b =2print
('定義b變數'
)yield b
f1 = fun1(
)print
('f1 : '
, f1)
# 列印f1發現f1就是乙個生成器
print
('-'*20
)print
(next
(f1)
)#print(next(f1))
生成器表示式:
1、a = [「a%s」 % i for i in range(10)] # 如果range(100000),很占用記憶體
print(a)# 是生成乙個列表
結果:[『a0』, 『a1』, 『a2』, 『a3』, 『a4』, 『a5』, 『a6』, 『a7』, 『a8』, 『a9』]
2、a = (『a%s』 % i for i in range(10)) #生成器表示式, 如果range(100000),不占用記憶體,因為沒有生成,真正用時才會根據演算法生成。
print(a)
結果:# 返回的是乙個生成器的記憶體位址
print(next(a))
print(a.next())# 和next一樣,都是取值
把列表解析的換成()得到的就是生成器表示式
python迭代器以及生成器
iter 迭代器 每一次輸出下乙個值 a iter range 10 a.next a.next a.next 可以用捕獲異常來排除超出迭代範圍,或者判斷長度 try 1 0 except print error occur error occur 如 encoding utf 8 a iter r...
生成器和迭代器
可以直接作用於for迴圈的物件稱為可迭代物件 iterable.可以用isinstance 判斷乙個物件是否是iterable物件。isinstance iterable true isinstance iterable true isinstance 235,iterable false 而生成器...
迭代器和生成器
1 迭代器的概念 print dir 告訴我列表的所有用法 有雙下劃線的所有方法叫做雙下方法,是c語言已經寫好的方法。你可以用不止一種方法呼叫它。列表的用法變集合 set dir 求交集 set dir set dir set dir 求列表,字典,字串它們的用法的交集 他們共同的用法 iterab...