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