def add(s, x): return s + x def gen(): for i in range(4): yield i base = gen() for n in [1, 10]: base = (add(i, n) for i in base) print list(base)
In [3]: s = 'hi' In [4]: s.__getitem__ Out[4]: <method-wrapper '__getitem__' of str object at 0x7f9457eed580> In [5]: s.next # 没有next方法 --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-5-136d3c11be25> in <module>() ----> 1 s.next AttributeError: 'str' object has no attribute 'next' In [6]: l = [1,2] # 同理 In [7]: l.__iter__ Out[7]: <method-wrapper '__iter__' of list object at 0x7f945328c320> In [8]: l.next --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-8-c6f8fb94c4cd> in <module>() ----> 1 l.next AttributeError: 'list' object has no attribute 'next' In [9]: iter(s) is s #iter() 没有返回本身 Out[9]: False In [10]: iter(l) is l #同理 Out[10]: False
In [13]: si = iter(s) In [14]: si Out[14]: <iterator at 0x7f9453279dd0> In [15]: si.__iter__ # 有__iter__ Out[15]: <method-wrapper '__iter__' of iterator object at 0x7f9453279dd0> In [16]: si.next #拥有next Out[16]: <method-wrapper 'next' of iterator object at 0x7f9453279dd0> In [20]: si.__iter__() is si #__iter__返回自己 Out[20]: True
In [1]: %paste class DataIter(object): def __init__(self, *args): self.data = list(args) self.ind = 0 def __iter__(self): #返回自身 return self def next(self): # 返回数据 if self.ind == len(self.data): raise StopIteration else: data = self.data[self.ind] self.ind += 1 return data ## -- End pasted text -- In [9]: d = DataIter(1,2) In [10]: for x in d: # 开始迭代 ....: print x ....: 1 2 In [13]: d.next() # 只能迭代一次,再次使用则会抛异常 --------------------------------------------------------------------------- StopIteration Traceback (most recent call last) ----> 1 d.next() <ipython-input-1-c44abc1904d8> in next(self) 10 def next(self): 11 if self.ind == len(self.data): ---> 12 raise StopIteration 13 else: 14 data = self.data[self.ind]
class Data(object): # 只是iterable:可迭代对象而不iterator:迭代器 def __init__(self, *args): self.data = list(args) def __iter__(self): # 并没有返回自身 return DataIterator(self) class DataIterator(object): # iterator: 迭代器 def __init__(self, data): self.data = data.data self.ind = 0 def __iter__(self): return self def next(self): if self.ind == len(self.data): raise StopIteration else: data = self.data[self.ind] self.ind += 1 return data if __name__ == '__main__': d = Data(1, 2, 3) for x in d: print x, for x in d: print x,
In [8]: sys.getsizeof(range(1000000)) Out[8]: 8000072 In [9]: sys.getsizeof(xrange(1000000)) Out[9]: 40
def gen(): print 'begin: generator' i = 0 while True: print 'before return ', i yield i i += 1 print 'after return ', i a = gen() In [10]: a #只是返回一个对象 Out[10]: <generator object gen at 0x7f40c33adfa0> In [11]: a.next() #开始执行 begin: generator before return 0 Out[11]: 0 In [12]: a.next() after return 1 before return 1 Out[12]: 1
In [15]: def func(): ....: print 'begin' ....: for i in range(4): ....: yield i In [16]: a = func() In [17]: list(a) #检索数据,开始执行 begin Out[17]: [0, 1, 2, 3]
In [18]: a = ( i for i in range(4)) In [19]: a Out[19]: <generator object <genexpr> at 0x7f40c2cfe410> In [20]: a.next() Out[20]: 0
def multipliers(): return (lambda x : i * x for i in range(4)) #修改成生成器 print [m(2) for m in multipliers()]
for n in [1, 10]: base = (add(i, n) for i in base)
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有