yield and iter
yield
生成器,减少代码行数和内存占用,不用生成整个list。返回generator对象。直接next()会在访问不到下标时放弃,一种访问generator的方法
while True:
try:
print(g.__next__())
except StopIteration:
break
iter
迭代器,内建于for循环中,iter()函数返回一个迭代器对象,接受的参数是一个实现了__iter__()
方法的容器或迭代器(精确来说,还支持仅有__getitem__()
方法的容器),它仅可以在迭代至当前元素时才计算(或读取)该元素的值,在此之前可以不存在,在此之后可以销毁,所以非常适合遍历无穷个元素的集合(如斐波那契数列)或巨大的事物(如文件)。
alist=range(2)
it=iter(alist)
it.next()
>>>1
class Fib(object):
def __init__(self):
self._a = 0
self._b = 1
def __iter__(self):
return self
def next(self):
self._a, self._b = self._b, self._a + self._b
return self._a
for i, f in enumerate(Fib()):
print f
if i > 10:
break
# 仅仅使用两个变量
迭代器还有itertools
等工具
def itergroups(items, group_size):
# 输出将item可迭代元组序列
assert group_size >= 1# 确保group大于1
group = []
for x in items:
group.append(x)
if len(group) == group_size:
yield tuple(group)
del group[:]
if group:
yield tuple(group)
网友评论