迭代器的形成及退出

2021-10-23 19:54:53 字數 3331 閱讀 6010

#迭代是乙個訪問集合元素的方式

#迭代器是乙個可以記住遍歷位置的物件

#迭代器物件從集合的第乙個元素開始訪問,直到所有元素被訪問完結束

#迭代器只能向前不會後退

#第一種集合資料型別:列表,元組,字典,集合,字串等

#第二種:生成器

#統稱為可迭代物件

# 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...