dir()
类似于type
dir是看里面的内置函数
__xxx__ 这是魔术方法(在某种特定条件下能够触发)
python里面所有的对象or变量都有__init__这个魔术方法?
python是面对对象的,都是类化的东西,所以都是有__init__的
在list里面没有__next__?
eg list1 = [1,2,3,4]
我们利用next[list1]去取数据的时候它提示'list' object is not an iterator
提示他不是一个迭代器,
我们利用iter将其变成一个迭代器
list1_t = list1.__iter__()
next(list1_t)
这样就可以依次取到列表中的数据了
所以我们在那个循环中,代码会先去iter中,然后让其返回一个可以next的对象。
list1 = [1, 2, 3, 4, 5]
for i in list:
print(i)
和
list1 = [1, 2, 3, 4, 5]
list1_t = list1.__iter__()
while True:
try :
print(next(list1_t))
except:
break
上面两种代码其实是一样的
这里就是细细的讲解了dataset里面的取数据细则。
里面的assert是非常重要的。
class MyDataset:
def __init__(self,all_data,all_label,batch_size):
self.all_data = all_data
self.all_label = all_label
assert len(self.all_data) == len(self.all_label)
self.batch_size = batch_size
def __iter__(self):
self.cursor = 0
return self
def __next__(self): # yield
batch_text = []
batch_label = []
for i in range(self.batch_size):
if self.cursor >= len(self):
raise StopIteration
t = self.all_data[self.cursor + i:self.cursor + i+1]
l = self.all_label[self.cursor + i:self.cursor + i+1]
#切片可以防止out of range
batch_text.extend(t)#这里的extend和append的区别是extend可以接受一个list作为参数,append只能接受一个元素,所以这里用extend。
batch_label.extend(l)
# self.cursor += 1
self.cursor = self.cursor + self.batch_size
return batch_text,batch_label
def __len__(self):
return len(self.all_label)
def get_data():
all_text = ["今天天气正好", "晚上的麻辣烫很难吃", "这件衣服很难看", "早上空腹吃早饭不健康", "晚上早点睡觉很健康"]
all_label = [1, 0, 0, 1,1]
return all_text,all_label
if __name__ == "__main__":
all_text, all_label = get_data()
epoch = 10
batch_size = 2
dataset = MyDataset(all_text,all_label,batch_size)
for e in range(epoch):
print("*"*20)
for batch_text,batch_labe in dataset:
print(batch_text)
print(batch_labe)
# print("")
# list1 = [1,2,3,4]
# list1_t = list1.__iter__() # yield
#
# while True:
# try:
# print(next(list1_t))
# except:
# break
#
# for i in list1:
# print(i)
下面细说一下python的报错机制
首先是assert
# list1 = [1,2,3,4]
# print(list1[10])
# 报错:IndexError: list index out of range
# str1 = "10"
# str1 += 1
# print(str1)
# 报错:TypeError: can only concatenate str (not "int") to str
list1 = [1,2,"10",3,4]
list2 = []
for idx,i in enumerate(list1):
try:
j = i+1
list2.append(j)
except Exception as e :
print(f"第{idx+1}个数据报错,报错信息为:{e},数据源为:{i},数据类型:{type(i)}")
# 报错信息:第3个数据报错,报错信息为:can only concatenate str (not "int") to str,数据源为:10,数据类型:<class 'str'>
# # except IndexError as indexerr:
# # print("....")
#
# print(list2)
#
#