Understanding DataLoader class

Hi, Im triying to understand what does “zip” in this code does, and why does it work this way , because when I try to “zip” any dataset[n] example , it returns an error which says “zip argument #2 must support iteration”.

def collate(b):
xs,ys = zip(*b)
return torch.stack(xs),torch.stack(ys)

class DataLoader():
    def __init__(self, ds, sampler, collate_fn=collate):
        self.ds,self.sampler,self.collate_fn = ds,sampler,collate_fn   
def __iter__(self):
    for s in self.sampler: yield self.collate_fn([self.ds[i] for i in s])

This code is from fast.ai v3 part 2 “03_minibatch_training.ipynb”.
Thanks!