Python диапазон и для петель - PullRequest
0 голосов
/ 19 июня 2020

Я играл с Python и запустил следующее:

for i,j in (range(-1, 2, 2),range(-1, 2, 2)):
    print(i,j)

Я ожидал, что это напечатает

>> -1, -1
>> 1, 1

Однако то, что получилось, было

>> -1, 1
>> -1, 1

(1) Почему это результат и что происходит за кулисами

(2) Если бы я хотел получить все комбинации -1 и 1 (которые равны (-1, -1 ), (-1,1), (1, -1) и (1,1)) Я знаю, что могу использовать вложенный для l oop

for i in range(-1,2,2):
    for j in range(-1,2,2):
        print(i,j)

Однако есть способ сделать это в одной строке с одним для вызова l oop (что я пытался сделать с исходным кодом)?

Ответы [ 3 ]

2 голосов
/ 19 июня 2020

Для вашего первого вопроса, в первой итерации l oop требуется range(-1, 2, 2), которое расширяется до [-1, 1], а затем присваивает i=-1 и j=1. Аналогично во втором цикле он делает то же самое для второго range(-1, 2, 2). Вам повезло, что в этом диапазоне есть два элемента. В противном случае это вызовет ошибку, например, range(-1, 4, 2) вызовет ошибку, так как он имеет 3 элемента. Вам нужно использовать i, j, k для этого l oop.

Для второго вопроса используйте itertools.product.

for i in product(range(-1, 2, 2), range(-1, 2, 2)): 
    print(i)
    #(-1, -1)
    #(-1, 1)
    #(1, -1)
    #(1, 1)
1 голос
/ 19 июня 2020

Первый вопрос: вы повторяете i и j в кортеже (диапазон (-1, 2, 2), диапазон (-1, 2, 2)). попробуйте этот код, и вы поймете.

>>> for i in (range(-1, 2, 2),range(-1, 2, 3)):
...     print(i)
... 
range(-1, 2, 2)
range(-1, 2, 3)
0 голосов
/ 19 июня 2020

Вы можете подумать, что диапазон (-1, 2, 2) равен (-1, 1), тогда

for i, j in (range(-1, 2, 2), range(-1, 2, 2)):

аналогично

for i, j in ((-1, 1), (-1, 1)):

Вы должны сделать это так

for i, j in zip(range(-1, 2, 2), range(-1, 2, 2)):
    print(i, j)

Для всех комбинаций -1 и 1 используйте это более гибкое

for i in range(-1,2,2):
    for j in range(-1,2,2):
        print(i,j)

или это

from itertools import product

for i, j in product(range(-1, 2, 2), range(-1, 2, 2)):
...