#迭代是乙個訪問集合元素的方式
#迭代器是乙個可以記住遍歷位置的物件
#迭代器物件從集合的第乙個元素開始訪問,直到所有元素被訪問完結束
#迭代器只能向前不會後退
#第一種集合資料型別:列表,元組,字典,集合,字串等
#第二種:生成器
#統稱為可迭代物件
# from _collections_abc import iterator,iterable
## x = [1,2,3,'asd']
# print(isinstance(x,iterable))
# print(isinstance(1000,iterable))
## y = [x for x in range(10)]
# z = (x for x in range(10))
## print(type(y))
# print(type(z))
# print(isinstance(z,iterable)) #判斷是不是為可迭代物件
## print(iter(z))
# print(iter(y))
# print(isinstance(iter(y),iterable))
# print(isinstance(iter(y),iterator))
# print(isinstance(y,iterator))
#以列表為例,列表是個可迭代物件,iter這個方法獲取的是列表內部的迭代器
#生成器是乙個迭代器物件,列表或者集合等是可迭代的,但都不是迭代器
from _collections_abc import iterable,iterator
class mylist(object):
def __init__(self):
self.newlist = list()
'''該方法實現了增加乙個元素至列表末尾
:param data:
:return:
'''def __iter__(self): #只有加上這個iter才能成為可迭代物件,不然就是普通的類
'''當前類中,因為iter這個魔法方法獲取的是__iter__方法中的迭代器
:return:
'''iterobj = myiterator(self.newlist)
return iterobj
class myiterator(object):
#這個類實現的是迭代器類
def __init__(self,newlist):
self.newlist = newlist
#記錄的是當前迭代的索引
self.current_index = 0
def __next__(self):
#當前的魔法方法記錄遍歷的位置,第二個功能是記錄需要獲取的值
if self.current_index< len(self.newlist):
self.current_index+=1
return self.newlist[self.current_index-1]
else:
raise stopiteration
def __iter__(self):
return self
list1 = mylist()
print(isinstance(list1,iterable))
print(iter(list1))
print('###########################')
obj = myiterator([1,2,3,4,5,6,7,8,9,10])
print(isinstance(obj,iterable))
while true:
try:
value = next(obj)
print(value)
except stopiteration:
print('迭代成功')
break
class fibonacci:
'''迭代器類'''
def __init__(self,month):
self.a = 0
self.b = 1
self.month = month
self.n = 0
def __iter__(self):
return self
def __next__(self):
if self.n < self.month:
self.a,self.b = self.b,self.a+self.b
# self.n = self.n +1
self.n += 1
return self.a
else:
raise stopiteration
fi = fibonacci(5)
print(isinstance(fi,iterable))
print(isinstance(iter(fi),iterator))
for i in fi:
print(i)
注意點:
1、iter()方法訪問的是迭代器內部的__iter__魔法方法,__iter__這個魔法方法,直接返回迭代器物件本身,也就是self
2、next()方法訪問的是迭代器內部的__next__魔法方法,需要記錄資料的位置以及丟擲資料,所以,丟擲資料的邏輯寫在當前的方法
3、注意:__next__一定要判斷如果資料已經完全取出的時候,要主動丟擲錯誤 raise stopiteration
class myiterator(object):
#這個類實現的是迭代器類
def __init__(self,newlist):
self.newlist = newlist
#記錄的是當前迭代的索引
self.current_index = 0
def __next__(self):
#當前的魔法方法記錄遍歷的位置,第二個功能是記錄需要獲取的值
if self.current_index< len(self.newlist):
self.current_index+=1
return self.newlist[self.current_index-1]
else:
raise stopiteration #為了讓for迴圈自動退出
def __iter__(self):
return self
注意點:
raise stopiteration #為了讓for迴圈自動退出,不然不斷返回none
端硯的形成及分類
古代文代文房四寶中最能體現乙個人的個人修養的非硯台所屬了,而古代四大硯台中的佼佼者就要數端硯了,端硯不但古來已十分名貴,更因幾大名坑硯材枯竭,近年已所有名坑都已 封坑 特別是老坑已封坑多年,無石可採。所以現在銷售的都是以前開採過的,可謂賣一塊少一塊了。說了這麼多有關端硯現在就為大家介紹一下端硯的形成...
C vector迭代器及用法
vector 容器的迭代器是隨機訪問迭代器。當然,也可以通過全域性函式獲取它們。vector 有成員函式 push back 所以能夠通過使用 back insert iterator 來新增新的值。從前面章節了解到,可以通過呼叫全同的 back inserter 函式來獲取乙個後向插入迭代器。無法...
Collection集合及迭代器 Iterator
1 兩種容器a.陣列 存放任意型別,長度固定 b.集合 存放物件型別,長度可變 2 體系結構單列集合 collection list arraylist linkedlist vector set hashset linkedhashset treeset 3 常用方法a.增 public bool...