def TestIterator():
for e in [2, 4, 8, 16] :
print(e)
for c in 'ABCDEFG' :
print (c)
#use list iterator
for line in open("test.txt").readlines():
print (line )
#use file iterator, and it is better. not read all data into memory
for line in open("test.txt"):
print (line )
#TestIterator()
3) 自定义iterator类型
python2.7 实例:
class MyIterator():
def __init__(self, step):
self.step = step
def next(self):
if self.step==0:
raise StopIteration
self.step-=1
return self.step
def __iter__(self):
return self
myI = MyIterator(4)
for e in myI:
print e 在python2.7下运行正常,但是在3.1下有next需要改为__next__,有错误如下:TypeError: iter() returned non-iterator of type 'MyIterator'
python3.1代码如下:
class MyIterator():
def __init__(self, step):
self.step = step
def __next__(self):
if self.step==0:
raise StopIteration
self.step-=1
return self.step
def __iter__(self):
return self
myI = MyIterator(4)
for e in myI:
print (e)
def TestGenerator(l):
for e in l:
print ("before yield:" + str(e))
yield e
print ("after yield:" + str(e))
for el in TestGenerator([6,7,8,9]):
print (el)
#break 运行结果如下:
before yield:6
6
after yield:6
before yield:7
7
after yield:7
before yield:8
8
after yield:8
before yield:9
9
after yield:9
2)实例
def Generator2(l):
for e in l:
print ("before yield:" + str(e))
enew = yield e
print ("after yield:" + str(enew))
def TestGenerator2():
it = Generator2([6,7,8,9])
for i in range(6,10):
if i == 8 :
element = it.send(800)
else:
element = it.next()
print(element) 在python2.7下运行正常,但是在3.1下需要next()改为__next__(),否则有错误如下:AttributeError: 'generator' object has no attribute 'next'
运行结果:
before yield:6
6
after yield:None
before yield:7
7
after yield:800
before yield:8
8
after yield:None
before yield:9
9
3)实例
def counter(maximum):
i = 0
while i < maximum:
val = (yield i)
# If value provided, change counter
if val is not None:
i = val
else:
i += 1
def TestCounter():
co = counter(10)
for e in co:
print (e)
if(e == 2):
co.send(8)