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]