Python技巧 物件迭代與反迭代

2021-08-16 23:51:53 字數 4115 閱讀 1456

welcome to my blog

例項化iter()

由可迭代物件得到迭代器

通過給iter()傳入可迭代物件(也就是例項化iter這個物件),得到迭代器物件

可迭代物件:列表,字串,元組,字典

#iter()的定義中:the argument must supply its own iterator, or be a sequence.

#說明了要麼自己是個可迭代物件,要麼是乙個序列

l = [1,2,3,45]

#使用 iter(l)相當於在內部呼叫 l.__iter__()

print l.__iter__() #

print l.next()

print l.next()

s = 'abcde'

#對於字串來說並沒有__iter__()方法,但是有__getitem__()方法

print s.__getitem__(0) #a

print s.__getitem__(1) #b

繼承迭代器iterator,實現next()方法(介面)

class

weatheriterator

(iterator):

#(繼承迭代器)

def__init__

(self,cities):

self.cities = cities

self.index = -1

#實現next()介面

defnext

(self):

self.index += 1

#保證向下進行

print

"-----", self.index

if self.index == len(self.cities):

raise stopiteration

# city = self.cities[self.index]

return self.getweather()

defgetweather

(self):

r = requests.get(u'' % self.cities[self.index])

t = json.loads(r.text)

return t['data']['cityname'], t['data']['qw']

繼承可迭代物件iterable,實現iter()介面(方法)

什麼是生成器函式? 呼叫yield語句的函式就是生成器函式

生成器和迭代器都支援.next()介面

def

f():

yield

1yield

2yield

3t = f()

#注意! 不是f.next(),f是指向函式這個整體,或說指向函式的位址,所以應該用f().next()

#無論用幾次f().next(),列印出來的都是1,因為每次使用f()時都是重新建立的物件,而不是之前那個f()

#所以想實現真正的next()得先用乙個變數指向某個例項物件,eg:t = f()

# print f().next(),f().next()

# print t.next()

# print t.next()

#生成器物件也是可迭代的

for x in t:

print x

#既然t是可迭代的,說明t實現了__iter__()介面

#t.__iter__()返回值是t自身,列印下式返回true

print t.__iter__() is t

#生成器yield實現了可迭代物件介面 .__iter__()

#生成器yield也實現了迭代器介面 .next()

1.

l = [1,2,3,4,5]

l.reverse() #這樣相當於是改變了原列表

for x in l:

print x

#使用帶步進值的切片操作,需要使用額外的空間

for x in l[::-1]:

print x

3.

#使用內建函式reversed()得到反向迭代器

for x in reversed(l):

print x

實現reversed()介面,類似iter()

class

floatrange:

def__init__

(self,start,end,step=0.1):

self.start = start

self.end = end

self.step = step

#實現正向迭代器

def__iter__

(self):

t = self.start

while t <= self.end:

yield t

t+=self.step

#實現反向迭代器

def__reversed__

(self):

t = self.end

while t>= self.start:

yield t

t-=self.step

#測試#正向迭代器(預設是正向的)

for x in floatrange(1.0,4.0,0.5):

print x

#反向迭代器,reversed()接收乙個iterable物件

for x in reversed(floatrange(1.0,4.0,0.5)):

print x

使用itertools中的islice

from itertools import islice

#islice(iterable, [start,] stop [, step])

f = open('a.txt','r')

print type(islice(f,100,150))

for line in islice(f,100,150):

print line

#只有乙個100,則代表stop值

#將檔案指標移動到開頭

f.seek(0)

for line in islice(f,100):

print line

f.seek(0)

#從100到結尾!!

for line in islice(f,100,none):

print line

f.close()

from itertools import islice

#range():return a list containing an arithmetic progression of integers.

l = range(20)

print type(l)

#iter() get an iterator from an object

t =iter(l)

#對l索引值為5--9的元素進行遍歷

# 注意!索引值為0--4的元素先被迭代器產生,但是沒有符合索引值範圍,所以並沒有使用

for x in islice(t,5,10):

print x

print

"-----------------"

#使用islice()對迭代器有消耗,也就是說,產生過的元素不再參與迭代

for x in t:

print x

# 所以使用islice時要隨時注意重新申請新的迭代物件,因為它會消耗原來的物件

# 但是直接用l沒有關係,因為l是list型別, list呼叫__iter__(self)介面後返回乙個可迭代物件,相當於t

# 這樣相當於每次都建立新的可迭代物件,但是l占用空間大,有幾個元素就佔幾個元素的空間,迭代器占用少,用到幾個占用幾個

for x in l:

print x

python 迭代與函式

返回結果是乙個列表 function 傳的是乙個函式名,可以是python內建的,也可以是自定義的。就像上面的匿名函式lambda iterable 傳的是乙個可以迭代的物件,例如列表,元組,字串這樣的。map 用法 a 1,2,3 y map lambda x x 1,a print list y...

Python高階專題 可迭代物件協議以及迭代器

1.迭代協議與可迭代物件 只有實現了迭代協議 iter 才可以稱為可迭代物件 2.迭代器 訪問集合內元素的方式,用於遍歷資料,但是無法返回,提供了惰性訪問資料,同時實現了 iter 以及 next 協議 from collections.abc import iterable,iterator it...

Python中的並行迭代與編號迭代

1.並行迭代 有時候,乙個程式中需要我們同事在乙個for迴圈中迭代兩個以上的集合。其中一種方法就是迴圈其中乙個集合的索引,然後根據索引對所有集合進行迴圈,例如 names anne beth george damon ages 12,45,32,102 for i in range len name...