2013-06-21 3 views
2

Так что мне немного любопытно, почему это не работает.Использование оператора «И» в петле в Python

Как же код, как:

for a in range(10) and b in range(10): 
    print a + b 

генерирует ошибку, которая говорит «Ъ не определен»?

Кроме того, код, как:

for a,b in range(10): 
    print a + b 

генерирует ошибку: "ИНТ объекты не итерацию.

Почему? Я заранее не установил их ценность, так как Python знает, что они являются объектами int? Кроме того, я знаю, что вы можете использовать цикл while вместо этого, но есть ли способ выполнить операцию, которую я выполняю, используя только цикл for-loop?

+0

Что вы ожидаете от 'a' и' b'? – dawg

+0

Ваша попытка анализируется как 'for a in (диапазон (10) и (b в диапазоне (10))'. 'B' должен быть определен для оценки второй части выражения' and'. (Первая часть , 'range (10)', всегда будет истинным, поскольку он является непустым списком в Python 2 и объектом 'range' в Python 3.) – chepner

ответ

3
for a,b in zip(range(10),range(10)): 
    print a + b 

должны отлично работать ... Если предположить, что понял ваш вопрос правильно , если нет, то

for a in range(10): 
    for b in range(10): 
     print a+b 

или даже [a+b for a in range(10) for b in range(10)]

+0

Спасибо! Я искал что-то вроде последней части кода; Мне очень понравилась серия цифр, которую я пытаюсь использовать для ответа на проблему Project Euler. –

1

Вы можете только перебор всех одного итерации в то время, в цикле for код в вашем вопросе как есть, является недопустимым. Я считаю, что это то, что вы хотели - итерация двух диапазонов одновременно:

for a, b in zip(range(10), range(10)): 
    print a + b 

zip функция создает одного итерации из 2-элементных кортежей, принимая один элемент из каждого диапазона, а затем мы можем распакуйте каждый элемент из кортежа в отдельные переменные.

EDIT:

Если вы пытаетесь гнездиться одну петлю внутри другой, стандартный способ сделать это будет так:

for a in range(10): 
    for b in range(10): 
     print a + b 

Но мы можем достичь того же эффекта с помощью itertools.product, который выглядит ближе к тому, что вы имели в виду в первую очередь:

import itertools as it 
for a, b in it.product(range(10), range(10)): 
    print a + b 
+0

Большое спасибо. То, что я на самом деле пытаюсь сделать, было рассмотрено Джораном Бисли, но я не знал о функции zip. –

+0

@ Liongold oh, я вижу :) в любом случае, см. Мой отредактированный ответ, вы найдете хорошую альтернативу в конце –

2

Другие ответы взрывающаяся как правильно, но никто не объяснил, что случилось с тем, что вы сделали.

for a in range(10) and b in range(10): 
    print a + b 

Это симпатичная идея некоторого интуитивного синтаксиса, но Python этого не знает. Старшинство то, что вы запрограммированы на самом деле работает так:

for a in ((range(10)) and (b in range(10))): 

Python думает, что вы пытаетесь сделать сложное выражение для генерации одного итерации перебрать. Первая ошибка возникает, когда она пытается оценить b для построения значения. Если b определено, то b in range(10) приведет к True или False. Результатом его обработки с помощью range(10) также будет логическое значение.Затем вы нажмете еще одну ошибку, пытающуюся выполнить итерацию по булеву.

for a,b in range(10): 
    print a + b 

Этот вид синтаксиса работает, если перечисление справа содержит элементы, которые являются 2-мя кортежами. Первый шаг в этом цикле for является эквивалентом попытки a,b = 0. Он пытается «распаковать» правую сторону, итерации по ней. Но вы не можете перебирать одно целое число. a и b еще не определены, но первым элементом диапазона (10) является. Это целое число, которое вы не можете перебрать.