这个iter()对于cs231n中的单行代码来说是多余的吗



这是cs231n的代码,我想知道在__iter__函数的返回行中,我们可以用return ((self.X[i:i+B], self.y[i:i+B]) for i in range(0, N, B))代替return iter((self.X[i:i+B], self.y[i:i+B]) for i in range(0, N, B))吗?因为CCD_ 4也是生成器对象。实际上我不太理解iter()的函数,它只是调用生成器对象的函数__iter__并返回它自己吗?我很困惑。

class Dataset(object):
def __init__(self, X, y, batch_size, shuffle=False):
"""
Construct a Dataset object to iterate over data X and labels y

Inputs:
- X: Numpy array of data, of any shape
- y: Numpy array of labels, of any shape but with y.shape[0] == X.shape[0]
- batch_size: Integer giving number of elements per minibatch
- shuffle: (optional) Boolean, whether to shuffle the data on each epoch
"""
assert X.shape[0] == y.shape[0], 'Got different numbers of data and labels'
self.X, self.y = X, y
self.batch_size, self.shuffle = batch_size, shuffle
def __iter__(self):
N, B = self.X.shape[0], self.batch_size
idxs = np.arange(N)
if self.shuffle:
np.random.shuffle(idxs)
return iter((self.X[i:i+B], self.y[i:i+B]) for i in range(0, N, B))
train_dset = Dataset(X_train, y_train, batch_size=64, shuffle=True)
val_dset = Dataset(X_val, y_val, batch_size=64, shuffle=False)
test_dset = Dataset(X_test, y_test, batch_size=64)
是的,调用iter是多余的。您可以很容易地检查在生成器对象上调用iter是否只返回Python外壳中的生成器对象本身:
>>> gen = (x for x in [])
>>> gen is iter(gen)
True

更正式地说,从Python词汇表中,您可以验证生成器表达式是否返回迭代器,以及所有迭代器在调用其__iter__方法时是否返回自身:

迭代器需要有一个返回迭代器对象本身的__iter__()方法,因此每个迭代器也是可迭代的,并且可以在大多数接受其他可迭代的地方使用。

最新更新