2013-04-20 2 views
3

Я новичок в python. Есть ли аналогичный способ написать этот цикл C для двух переменных в python?Python: C для цикла с двумя переменными

for (i = 0, j = 20; i != j; i++, j--) { ... } 
+0

Короткий ответ: не совсем.'for' в python - для итерации по итерируемым вещам, и в то время как' while' делает материал с переменными, которые вы хотели бы использовать C-like 'for' (обратите внимание, как' for' в C является только сокращенным 'while', таким образом, совершенно избыточный). – TNW

ответ

1

В зависимости от ситуации вы можете использовать ZIP:

lista = [1,2,3] 
listb = [4,5,6] 
for x,y in zip(lista, listb) 
     print(x, y) 

выходы:

1 4 
2 5 
3 6 

молнии документы здесь: http://docs.python.org/3.3/library/functions.html#zip

Кроме того, чтобы пойти с тем, что вы говорили два номера, вы можете сделать

for x,y in zip(range(0), range(10, 0, -1)) 
    if x == y: 
     break 
    # do stuff 

Это даст вам как увеличение, так и уменьшение значений.

4
>>> i, j = 0, 10 
>>> while i != j: 
...  # Your code here: 
...  print "i: %d j: %d" % (i, j) 
...  i += 1 
...  j -= 1 
... 
... 
i: 0 j: 10 
i: 1 j: 9 
i: 2 j: 8 
i: 3 j: 7 
i: 4 j: 6 

Если вам интересно, почему это часто можно увидеть >>> и ... в примерах кода это потому, что люди используют интерпретатор Python (Снаряд, если вы хотите), или обертка интерпретатора как bpython. Я действительно рекомендую получить bpython для тестирования кода, подобного этому.

7

Python 2.x

from itertools import izip, count 
for i, j in izip(count(0, 1), count(20, -1)): 
    if i == j: break 
    # do stuff 

Python 3.x:

from itertools import count 
for i, j in zip(count(0, 1), count(20, -1)): 
    if i == j: break 
    # do stuff 

Это использует itertools.count(), итератор, с некоторой начальной точки до бесконечности:

itertools.count(start=0, step=1)

Сделайте итератор, который возвращает равномерно разнесенные значения, начиная с n. Часто используется в качестве аргумента для imap() для генерации последовательных точек данных. Также используется с izip() для добавления порядковых номеров.

В Python 2.x вы должны использовать izip потому Py2K zip пытается создать список всех результатов, в отличие от izip которая возвращает iterator над результатами, как они получены. К сожалению, здесь мы имеем дело с бесконечными итераторами, так что zip не будет работать ... это, вероятно, хороший момент, почему zip был изменен для выполнения функции izip в Py3K (izip больше не существует).

Если вы без ума быть функциональной вы даже можете сделать это (но это выглядит некрасиво, на мой взгляд, так как я вырос ненавидеть lambda с):

from itertools import takewhile, izip, count 
for i, j in takewhile(lambda x: x[0] != x[1], izip(count(0, 1), count(20, -1))): 
    # do stuff 
1

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

for i in range(10): 
    j = 20 - i 
    ⋮ 
Смежные вопросы