不定期写一些学到的Python小知识
代码如下:
def lookup(d, key): h = hash(key) cl = d.dath[h] for pair in cl: if key == pair[0]: return pair[1] else: raise KeyError, 'Key %s not found." % key
在字典查询的hash函数应满足两个原则:
要作为字典的key,对象必须要支持__hash__函数,并且满足上面两个原则
list对象不支持__hash__函数
list对象实现__hash__函数有两种实现方式:基于id和基于内容,然而两种方式对于list对象来说都有一定的副作用,所以Python规定内置的list对象不能作为字典的key。
tuple对象可以作为字典的key,tuple对象就是基于内容实现的__hash__函数,但是若tuple中有元素是可变对象,一人不可以作为字典的key。
用户自定义的类型可以作为字典的key,默认的hash(object)
是id(object)
,默认的cmp(object1, object2)
是cmp(id(object1), id(object2))
。特别注意的是,用户自定义类型是可变的,但依然可以作为字典的key。因为一般来说id比内容更重要,可以基于id来hash。若内容比id重要,可以在定义类的时候重载__hash__函数和__cmp__函数。
#### 三种格式 ## 1 [x * x for x in range(1, 11)] ## 2 [x * x for x in range(1, 11) if x % 2 == 0] ## 3 [x * x if x % 2 == 0 else -x for x in range(1, 11)]
通过列表生成器会占用很大的内存空间,而生成器可以是我们一边循环一边生成想要的数据。
创建方法:
## 1. g = (x * x for x in range(1, 11)] next(g) # 通过next()来获取每一个生成值 ## 2.利用yield将函数转换成关键字 def fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n += 1 return 'done' ## 3.捕获原来函数的返回值 g = fib(6) while True: try: x = next(g) print('g', x) except StopIteraction as e: print('Generator return value:', e.value) break
区分两个概念:
for
循环的对象统称为可迭代对象:Iterable
。next()
函数调用并不断返回下一个值的对象成为迭代器:Iterator
。list
, tuple
, dict
, set
, str
, 生成器, 带yield
的函数,这些虽然都是Iterable
,但只有生成器是Iterator
。要想将其他的数据类型也变成Iterator
,可以使用iter()
函数。