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工程开发

原文地址:https://www.cnblogs.com/threeidiots/p/14835999.html