首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于cs231n中的单行代码,这个iter()是否是多余的?

对于cs231n中的单行代码,这个iter()是否是多余的?
EN

Stack Overflow用户
提问于 2022-03-27 18:14:58
回答 1查看 40关注 0票数 1

这是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))吗?因为((self.X[i:i+B], self.y[i:i+B]) for i in range(0, N, B))也是生成器对象。实际上,我在这里并不完全理解iter()的函数,它只是调用生成器对象的函数__iter__并返回自身吗?我很困惑。

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2022-03-27 18:20:33

是的,打电话给iter是多余的。您可以很容易地检查调用生成器对象上的iter是否只返回Python中生成器对象本身:

代码语言:javascript
复制
>>> gen = (x for x in [])
>>> gen is iter(gen)
True

更正式地说,您可以从Python术语表中验证生成器表达式是否返回迭代器,并且所有迭代器在调用其__iter__方法时都返回自己:

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71639042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档