Skip to content Skip to sidebar Skip to footer

How To Change For-loop Iterator Variable In The Loop In Python?

I want to know if is it possible to change the value of the iterator in its for-loop? For example I want to write a program to calculate prime factor of a number in the below way :

Solution 1:

Short answer (like Daniel Roseman's): No

Long answer: No, but this does what you want:

def redo_range(start, end):
    while start<end:
        start+=1
        redo = (yield start)
        if redo:
            start-=2

redone_5 =False
r = redo_range(2, 10)
for i in r:
    print(i)
    if i ==5andnot redone_5:
        r.send(True)
        redone_5 =True

Output:

3
4
5
5
6
7
8
9
10

As you can see, 5 gets repeated. It used a generator function which allows the last value of the index variable to be repeated. There are simpler methods (while loops, list of values to check, etc.) but this one matches you code the closest.

Solution 2:

No.

Python's for loop is like other languages' foreach loops. Your i variable is not a counter, it is the value of each element in a list, in this case the list of numbers between 2 and number+1. Even if you changed the value, that would not change what was the next element in that list.

Solution 3:

The standard way of dealing with this is to completely exhaust the divisions by i in the body of the for loop itself:

defprimeFactors(number):
    for i inrange(2,number+1):
        while number % i == 0:
            print(i, end=',')
            number /= i

It's slightly more efficient to do the division and remainder in one step:

defprimeFactors(number):
    for i inrange(2, number+1):
        whileTrue:
            q, r = divmod(number, i)
            if r != 0:
                breakprint(i, end=',')
            number = q

Solution 4:

The only way to change the next value yielded is to somehow tell the iterable what the next value to yield should be. With a lot of standard iterables, this isn't possible. however, you can do it with a specially coded generator:

def crazy_iter(iterable):
  iterable = iter(iterable)
  for item in iterable:
    sent = yield item
    if sent is not None:
      yield None  # Return value of `iterable.send(...)`yield sent

num = 10iterable = crazy_iter(range(2, 11))
for i in iterable:
  if not num%i:
    print i
    num /= i
    if i > 2:
      iterable.send(i-1)

I would definitely not argue that this is easier to read than the equivalent while loop, but it does demonstrate sending stuff to a generator which may gain your team points at your next local programming trivia night.

Solution 5:

It is not possible the way you are doing it. The for loop variablecan be changed inside each loop iteration, like this:

for a in range (1, 6):
    print a
    a = a + 1print a
    print

The resulting output is:

1
2

2
3

3
4

4
5

5
6

It does get modified inside each for loop iteration.

The reason for the behavior displayed by Python's for loop is that, at the beginning of each iteration, the for loop variable is assinged the next unused value from the specified iterator. Therefore, whatever changes you make to the for loop variable get effectively destroyed at the beginning of each iteration.

To achieve what I think you may be needing, you should probably use a while loop, providing your own counter variable, your own increment code and any special case modifications for it you may need inside your loop. Example:

a = 1
while a <= 5:
    print a
    if a == 3:
        a = a + 1
    a = a + 1
    print a
    print

The resulting output is:

1
2

2
3

3
5

5
6

Post a Comment for "How To Change For-loop Iterator Variable In The Loop In Python?"