python碎片笔记2
TypeError: unhashable type: 'list'
字典的键必须可以哈希,list 不使用 hash 值进行索引,故其对所存储元素没有可哈希的要求:set、dict使用hash值进行索引,也即其要求欲存储的元素有可哈希的要求。Python不支持dict的key为list或dict类型,因为list和dict类型是unhashable(不可哈希)的。
什么叫做可哈希呢?
一个对象的哈希值如果在其生命周期内绝不改变,就被成为可哈希(它具有hash()方法),并可以同其他对象进行比较(它需要具有eq()方法),可哈希对象必须具有相同的哈希值比较结果才会相同。
一个对象的哈希值在生命周期内不改变,就被称为可哈希,可哈希性使得对象能够作为字典键或集合成员使用,因为这些数据结构要在内部使用哈希值。
可变容器(例如列表和字典)都不可哈希。所以,只有可哈希对象才能作为字典的键
如何去判断一个对象的哈希值是否改变:
1、所有python中不可变内置对象都是可哈希的
2、可变容器(列表,字典)不可哈希
3、用户定义类的实例对象默认可哈希
4、相等的两个对象一定拥有相等的哈希值,反之却不成立
列表生成表达式可以双循环嵌套
a=[[1,2][3,4][5,6]] for i in a: for j in i: print(j) b=[j for i in a for j in i] print(b)
lambda函数
lambda的一般形式是关键字lambda后面跟一个或多个参数,紧跟一个冒号,以后是一个表达式,lambda是一个表达式而不是一个语句。它能够出现在python语法不允许def出现的地方,作为表达式,lambda返回一个值(即一个新的函数)
lambda表达式之间可以嵌套使用
其可作为一个参数使用
将lambda复制给一个变量,通过这个变量调用该lambda
add=lambda: x,y:x+y add(1,2)
将lambda函数赋值给其他函数,从而将其他函数用该lambda函数替换
例如,为了把标准库time中的函数sleep的功能屏蔽,我们可以在程序初始化时调用:
time.sleep=lambda x:None
如此,后续代码中调用sleep将不会执行原有功能
可作为闭包:
lambda函数作为其他函数的返回值,返回给调用者
return lambda
此时,lambda实际上为定义在某函数内部的嵌套函数或内部函数,相应的,包含嵌套函数的函数称为外部函数,内部函数能够访问外部函数的局部变量,这个特性称为闭包。
def my_add(n) return lambda x:x+n add_3=my_add(3) add_3(7)
最后输出为10,此处lambda即是一个闭包,闭包先粗浅的认为是函数内的函数,在全局作用域范围内,add_3(7)可以正常执行且返回值为10,是因为再my_add局部作用域中,变量n的值在闭包的作用使得它在全局作用域也可以被访问。
使用常规函数形式如下:
def my_add(n): def wrapper(x): return x+n return wrapper add_5 = my_add(5) add_5(2)
Explicit is better than implicit(明了胜于晦涩)
字典相关补充:
字典确定的键值未定义为list时使用append报错,可使用try解决
字典不可以跨步定义,即:
dic['a']['1']=[]
在key值a还未定义时无法定义key值1
string相关:
split不会影响原字符串
暂时收工,工作进度问题继续django工程开发