2016-05-30 4 views
3

У меня есть следующий код:Пытаясь понять, почему вложенный цикл вызывается только первый раз

def get_preds(train,test,x_ranges,y_ranges): 
    global total_scores 
    global num_scores 
    for x_min, x_max in x_ranges: 
     for y_min, y_max in y_ranges: 
      ... 

Когда я запускаю этот метод на Python 2.7, он ведет себя, как ожидалось. Гнездо для циклов запускается за каждый раз, когда выполняется цикл out for.

Когда я загрузил этот же код в движок скриптов Python Kaggle, который работает на Python 3, вложенный цикл запускается только один раз. Для всех других итераций он пропускается.

Вот как метод вызывается:

dataset = pd.read_csv('../input/train.csv',dtype=types,index_col=0) 
split_t=math.floor((0.9)*786239) 

train = dataset[dataset.time < split_t] 
test = dataset[dataset.time >= split_t] 


def gen_ranges(size,step): 
    return zip(np.arange(0,size,step), np.arange(step, size+step, step)); 

x_ranges = gen_ranges(size,x_step) 
y_ranges = gen_ranges(size,y_step) 

preds_test_total = get_preds(train,test,x_ranges,y_ranges) 
+1

как вы называете эту функцию? –

+0

preds_test_total = get_preds (train, test, x_ranges, y_ranges) вне любого метода. –

+1

как вы называете функцию? в частности, 'yranges' - это список в обоих интерпретаторах, или это список в Python 2 и генератор в Python 3? – gboffi

ответ

2

В Python 3, zip() возвращает итератор. Вы можете только итерации через элементы итератора один раз. Чтобы воспроизвести поведение Python 2, используйте list(zip(...)) вместо zip(...).