生成器对象:
假设a = [1,2,3],我们知道x = [i for i in a]可以生成一个序列,那[]换成()会怎样呢,case如下:
>>> a = [1,2,3]
>>> x = (n for n in a)
>>> x
at 0x1064f7e60>
x变成了一个生成器。我们知道生成器跟序列的对比就是生成器不会一次保存全部对象在内存里,但访问速度没有序列快。这个就可以灵活运用了
——————————————————————————————————————————
生成器函数的send和next:
yield关键字常用来把函数变成生成器,而它也有另一种玩法,case如下:
>>> def test():
... a = 5
... while 1:
... f = (yield a)
... if f is not None:
... a = f
...
>>> g = test()
>>> g
>>> g.next()
5
>>> g.next()
5
>>> g.send(7)
7
>>> g.next()
7
>>>
send可以接收发送值
——————————————————————————————————————————
dict类的__missing__方法和defaultdict:
当dict类的key值不在dict中时,会调用这个方法,因此可以重写这个方法,case如下:
>>> class Test(dict):
... def __missing__(self, key):
... self[key] = r = []
... return r
...
>>> t = Test()
>>> t['a'].append(1)
>>> t
{'a': [1]}
>>>
在collections里面有个defaultdict,也是可以设置不存在的key的默认值,与__missing__类似:
>>> from collections import defaultdict >>> m = defaultdict(list) >>> m["foo"].append(1) >>> m["foo"].append(2) >>> dict(m) {'foo': [1, 2]}