1.网络训练:
在训练前先要看看读取数据的时间(常见的性能瓶颈)
2.import dis
dis 是 Python 内置的一个模块,其全称为 “Disassembler for Python bytecode”,用于反汇编 Python 字节码。它可以将 Python 代码编译成字节码形式,并显示出字节码的操作码(opcode),以及相应的操作数和常量等信息。
在使用 dis 模块时,需要先定义需要反汇编的函数或代码块,然后使用 dis.dis() 函数进行反汇编操作。
3. [0] * 3 [0, 0, 0] [0 for _ in range(3)] 三者内存不同 (cpython 源码问题)
[0] * 3 的内存分配 空的list为56个byte 一个指针为8个byte 56 + 8 * 3 = 80 内存空间为80byte (空间使用最小)
[0, 0, 0] 直接申请8个指针 8*8 + 56 = 120
[0 for _ in range(3)]申请 4个指针 4*8 +56 =88
4 默认参数问题:
如上代码,因为大多数人的items都为[],所以在class中默认items=[],但是在更新p1和p2的时候出错,因为p1 和 p2 的items 指向同一块内存空间。
如图所示,所以不能使用这种方法对参数进行初始化操作,如果需要这种功能,则需要用以下方法:
5. 列表推导式
[变量 for 变量 in iterable(可迭代对象)]
(1)生成 1-9的平方 [1, 4, 9, 16, 25, 36, 49, 64, 81]
[i*i for i in range(1, 10)]
(2)生成1到10中的偶数 [2, 4, 6, 8]
[i for i in range(1, 10) if i % 2 == 0]
(3)生成1到10中每个偶数的平方,三次方,四次方组成一个列表
[[x ** i for i in [2, 3, 4] for x in range(1, 11) if x % 2 == 0]]
6. matplotlib b站视频:(https://www.bilibili.com/video/BV1Pe4y1R79d/?spm_id_from=333.337.search-card.all.click&vd_source=bc3cd51950b607b63949ae5696d82dc2)
from matplotlib import pyplot as plt
fig, array = plt.subplots(3, 3)
print(fig) # fig = Figure(640x480)
print(array)
# array =
#[[<Axes: > <Axes: > <Axes: >]
# [<Axes: > <Axes: > <Axes: >]
# [<Axes: > <Axes: > <Axes: >]]
代码1:
代码2:
两个代码画出的图都为:
下面的图为画2*2的图
下面为fig的使用
7. enumerate
产生原因: 例如 a = [23, 12 ,123, 34] 我们要打印出每个元素 并且需要知道每个元素所在的index
for i in a:
print(i) # 这样无法得知每个元素的index
for i, v in enumerate(a, start=1): # start 默认值为0 如果改为1则默认从1开始数
print(i, v) # i为index v为值
8. zip
a = ['1', '2', '3']
b = ['a', 'b', 'c']
for i, j in zip(a, b):
print(i, j)
# 输出结果为 1 a \n 2 b \n 3 c
for i in zip(a, b):
print(i)
# 输出结果为 ('1', 'a') \n ('2', 'b') \n ('3', 'c')
9.layer._class_._name_ 为输出一层的名字
10. 迭代器
迭代器的定义:
1.类中定义了__iter__和__next__两个方法
2.__iter__返回对象本身,即self
3.__next__返回下一个数据,如果没有数据,则抛出一个StopIteration的异常
我们创建一个迭代器类型
之后创建一个迭代器对象
obj1 = IT()
v1 = next(obj1)
v2 = next(obj1)
v3 = next(obj1) # 抛出异常
obj2 = IT()
for item in obj2:
print(item)
# 迭代器在for循环内部首先会执行迭代器对象的__iter__方法并且获取返回值 返回本身 之后一直会反复执行next(对象)
11 生成器 (是特殊的迭代器)
使用yield关键字返回每次要返回的值
列表推导式的[]换为()就是生成器
[i for i in range(666666)] 直接把666666个元素装到列表中
(i for i in range(666666)) 记住规则 从0开始 每次加1
return 和 yield
到return 后就不执行函数后边的东西了
yield
yield后边没跟数字所以返回None
特别的 net.parameters()为生成器对象
12 可迭代对象 如果一个类中有__iter__方法(不一定有__next__)并且返回一个迭代器(生成器是特殊的迭代器 )对象:则称这个类创建的对象为可迭代对象。
区分可迭代对象和迭代器对象(都可以用for loop)
迭代器对象返回自己 可迭代对象返回一个迭代器
IT为迭代器对象 Foo为可迭代对象
v1 = range(10) v1 为可迭代对象
生成自定义range:
常见数据类型
v1 = list([1,2,3,4])
v1为可迭代对象,因为声明了__iter__方法并且返回了一个迭代器对象
判断是否为迭代器或可迭代对象
Iterator 判断是否为迭代器对象__iter__和__next__
Iterable 判断是否为可迭代对象__iter__
两个都为True则为迭代器 一个True 一个False为可迭代对象