有'__iter__'
方法的就是可迭代物件
列舉些可迭代物件:str,list,tuple,dict,set,range,檔案控制代碼
獲取乙個物件的所有的方法dir();把每個方法以字串的格式放在乙個列表中返回回來
s1 = 'asdfas'
print(dir(s1))
#結果['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
判斷所有方法裡有沒有__iter__
s1 = 'asdfas'
print('__iter__' in dir(s1))
#true
可迭代物件是不能直接for迴圈取值的,之所以我們能是因為for迴圈內部自動幫我們轉化成迭代器了
可迭代物件可以轉化成迭代器
s = 'qwer'
s1 = iter(s)
print('__next__' in dir(s1))
#變數 = iter(要轉化的可迭代物件)
#或者這樣
s = 'qwer'
s1 = s.__iter__()
print('__next__' in dir(s1))
#(iter()函式就是呼叫的這個方法)
迭代器是用next()乙個乙個取值的
s = 'qwer'
s1 = iter(s) #s1 = s.__iter__()
print('__next__' in dir(s1))
print(next(s1)) #s1.__next__()
print(next(s1)) #s1.__next__()
print(next(s1)) #s1.__next__()
print(next(s1)) #s1.__next__()
#少乙個next可以,那就少取乙個值,多乙個不應,就報錯(停止迭代的這麼乙個錯誤)
'''trueqw
er'''
練習:把乙個列表轉化成迭代器,並用next乙個乙個取值
li = [11,22,33,44,55,66]
l1 = iter(li)
#print('__next__' in dir(l1))
print(next(l1))
print(next(l1))
print(next(l1))
print(next(l1))
print(next(l1))
print(next(l1))
優點
節省記憶體。
惰性機制:next一次就取乙個值
有乙個迭代器模式可以很好的解釋上面這兩條:迭代是資料處理的基石。掃瞄記憶體中放不下的資料集時,我們要找到一種惰性獲取資料項的方式,即按需一次獲取乙個資料項。這就是迭代器模式。
缺點
速度慢。以時間換空間
不走回頭路。
利用while迴圈模擬for迴圈對可迭代物件進行取值的機制
li = [1,2,3,4,5,6,7]
obj = iter(li)#將可迭代物件轉化成迭代器
while 1:
try:
print(next(obj))
except stopiteration:
break
生成器:python社群,生成器與迭代器看成是一種。生成器的本質就是迭代器。唯一的區別:生成器是我們自己用python**構建的資料結構。迭代器都是提供的,或者轉化得來的。
只要有yield就是生成器
生成器函式獲得生成器:yield
def func():
print(111)
print(222)
yield 3
a = 1
b = 2
c = a+b
print(c)
yield 4
ret = func()
print(next(ret))
print(next(ret))
'''111
222334
'''
yield將乙個可迭代物件,變成乙個生成器
def func():
l1 = [1,2,3,4,5]
yield from l1
#yield from l1 相當於
'''yield 1
yield 2
yield 3
yield 4
yield 5
'''#yield from 將l1這個列表變成了迭代器返回
ret = func()
print(next(ret))
print(next(ret))
print(next(ret))
'''123
'''
用一行**構建乙個比較複雜有規律的列表。
li =
for i in range(1,11):
print(li)
#[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
l1 = [i for i in range(1,11)]
print(l1)
#[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
列表推導式:分為兩類
篩選模式:滿足條件的留下來,不滿足扔了
生成器表示式:與列表推導式的寫法幾乎一模一樣。也有迴圈模式,篩選模式,多層迴圈構建,寫法上只有乙個不同:[ ] 換成 ( )
print([i for i in range(1,11)])#列表推導式
#[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print((i for i in range(1,11)))#生成器表示式
#at 0x000001e2308b2228>
obj = (i for i in range(1,11))
print(next(obj))#1
print(next(obj))#2
print(next(obj))#3
print(next(obj))#4
#或者這樣for迴圈
obj = (i for i in range(1,11))
for i in obj:
print(i)
'''12
3456
78910
'''
python中的迭代器與生成器
實現乙個迭代器,應滿足如下條件 簡單示例 usr bin env python class sampleiter sample iterator sampleiter sampleiter sampleiter.next a sampleiter.next b sampleiter.next tra...
python中的迭代器與生成器
1 迭代器 迭代器協議是指 物件必須提供乙個next方法,執行該方法要麼返回迭代中的下一項,要麼就引起乙個 stopiteration異常,以終止迭代 只能往後走不能往前退 可迭代物件 實現了迭代器協議的物件 如何實現 物件內部定義乙個 iter 方法 協議是一種約定,可迭代物件實現了迭代器協議,p...
Python生成器與迭代器
生成器只有在用的時候會出現在記憶體中,對比列表全部存在記憶體中,減少了記憶體占用 next 函式 依次取生成器的值 s x 2 for x in range 1000 中括號是列表解析,小括號表示生成一系列值,就是生成器 s at 0x7fa20aa8b048 print next s 用next ...