108dataset 的细节

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)
#
#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值