1 关于list构建时 for in 和 * 的区别:
a = [[0] * 2] * 2
b = [[0] * 2 for _ in range(2)]
此时a和b对应的输出都是一致的
a, b = [[0, 0], [0, 0]]
对其中相同位置的元素做出改变
a[0][0] = 1
b[0][0] = 1
得到如下的结果
a : [[1, 0], [1, 0]]
b : [[1, 0], [0, 0]]
个人觉得可以理解为 * 是对数据的复制(对二维及以上的有效),故当对某一维度的数据进行修改时,其它维度则会进行相同的复制操作
而for in 就是单独进行操作
2 __setstate__ 和 __getstate__
2.1 无省略版本
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
# 反序列化(可以省略)
def __setstate__(self, state):
self.name = 'selfdefine'
self.age = 10086
print('setting')
def __getstate__(self):
print('getting')
return {'name': self.name, 'age': self.age}
def __str__(self):
return f'name : {self.name}\n age : {self.age}'
然后对其进行调用
demo1 = Person('hi', 24)
byte = pickle.dumps(demo1)
print(byte)
dic = pickle.loads(byte)
print(dic)
我们可以得到如下结果
getting
b'\x80\x04\x953\x00\x00\x00\x00\x00\x00\x00\x8c\x08__main__\x94\x8c\x06Person\x94\x93\x94)\x81\x94}\x94(\x8c\x04name\x94\x8c\x02hi\x94\x8c\x03age\x94K\x18ub.'
setting
name : selfdefine
age : 10086
2.2 省略 __ setstate__, 但此时__getstate__必须返回一个dict,dict中的keys and values会在pickle.loads时赋予class,对于不存在的内容会进行添加
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __getstate__(self):
print('getting')
return {'name': self.name, 'age': self.age}
def __str__(self):
return f'name : {self.name}\n age : {self.age}'
同样进行调用
getting
b'\x80\x04\x953\x00\x00\x00\x00\x00\x00\x00\x8c\x08__main__\x94\x8c\x06Person\x94\x93\x94)\x81\x94}\x94(\x8c\x04name\x94\x8c\x02hi\x94\x8c\x03age\x94K\x18ub.'
name : hi
age : 24
2.3 同时将__setstate__ 和 __getstate__省略:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f'name : {self.name}\n age : {self.age}'
进行调用之后有如下结果
b'\x80\x04\x953\x00\x00\x00\x00\x00\x00\x00\x8c\x08__main__\x94\x8c\x06Person\x94\x93\x94)\x81\x94}\x94(\x8c\x04name\x94\x8c\x02hi\x94\x8c\x03age\x94K\x18ub.'
name : hi
age : 24
2.4 在深度训练的过程中,对于每个epoch的test结果进行保存
3 map映射
对list中的每个元素都进行相同的操作
3.1 遍历
nums = [1, 2, 3, 4]
# 1
for i in range(len(nums)):
nums[i] += 1
# 2
for key, val in enumerate(nums):
nums[key] = val + 1
注意和下面这种遍历方式的区别,下面这种并不改变nums中的元素
nums = [1, 2, 3, 4]
for num in nums:
num += 1
3.2 匿名函数lambda
nums = [1, 2, 3, 4]
nums = list(map(lambda x: x + 1, nums))
3.3 列表解析
nums = [1, 2, 3, 4]
nums = [num + 1 for num in nums]