Python для диапазона цикла со временем вместо добавления индекса - PullRequest
2 голосов
/ 30 сентября 2019

Есть ли более простой способ получить следующий код в C++ как Python?

for(long a = 1; a <= INT_MAX; a*=2)
    for(long b = a; b <= INT_MAX; b*=2)
        for(long c = b; c <= INT_MAX; c*=2)

Я могу переписать только как цикл while, поскольку Python, кажется, не поддерживает его.

Как и

a = 1
while(a <= INT_MAX):
  b = a
  while(b <= INT_MAX):
    c = b
    while(c <= INT_MAX):
      c *= 2
    b *= 2
  a *= 2

Мне трудно это читать, и я удивляюсь, есть ли лучший способ добиться этого.

Ответы [ 3 ]

4 голосов
/ 30 сентября 2019

Это читается лучше, если вы разложите его в генераторе.

def geometric_range(start, end, step):
    n = start
    while n < end:
        yield n
        n *= step

for a in geometric_range(1, INT_MAX + 1, 2):
    for b in geometric_range(a, INT_MAX + 1, 2):
        for c in geometric_range(b, INT_MAX + 1, 2):
            pass # or whatever
2 голосов
/ 30 сентября 2019

Вы сможете сделать следующее в Python 3.8, используя выражения присваивания :

i = 1
while (i := i*2) < INT_MAX:
   ...
0 голосов
/ 30 сентября 2019

Для этого конкретного кода может быть более очевидным перебирать биты:

INT_MAX = (1<<31) - 1

def highest_bit(x):
    return len(bin(x)) - 3

def bitfor(start, end=INT_MAX):
    start =  highest_bit(start)
    end = highest_bit(end) + 1   
    for i in range(start, end):
        yield 1 << i

for a in bitfor(1):
    for b in bitfor(a):
        for c in bitfor(b):
            pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...