Differences between revisions 1 and 17 (spanning 16 versions)
Revision 1 as of 2010-12-19 21:23:30
Size: 4401
Editor: host86-154-237-157
Comment:
Revision 17 as of 2019-12-15 14:51:18
Size: 5300
Editor: MatsWichmann
Comment:
Deletions are marked like this. Additions are marked like this.
Line 2: Line 2:
Line 8: Line 7:
For loops are traditionally used when you have a piece of code which you want to repeat ''n'' number of times. As an alternative, ''while'' exists, however, while is used when a condition is to be met, or if you want a piece of code to repeat forever, for example - ''for'' loops are traditionally used when you have a block of code which you want to repeat a fixed number of times. The Python ''for'' statement iterates over the members of a sequence in order, executing the block each time. Contrast the ''for'' statement with the [[WhileLoop|''while'' loop]], used when a condition needs to be checked each iteration, or to repeat a block of code forever. For example:
Line 11: Line 10:
{{{#!python numbers=disable
for x in range(0,3):
    print 'We\'re on time %d' % (x)

{{{
for x in range(0, 3):
    print("We're on time %d" % (x))
Line 15: Line 15:
''While loop from 1 to infinity, therefore running infinity times.''
{{{#!python numbers=disable


''While loop from 1 to infinity, therefore running forever.''

{{{
Line 19: Line 22:
    print "To infinity and beyond! We're getting close, on %d now!" % (x)     print("To infinity and beyond! We're getting close, on %d now!" % (x))
Line 23: Line 26:
As you can see, they serve different purposes. The for loop runs for a fixed amount - in this case, 3, while the while loop theoretically runs forever. You could use a for loop with an huge number, but what's the point of doing that when you have a construct that already exists? As the old saying goes, "why try to reinvent the wheel?".
As you can see, these loop constructs serve different purposes. The ''for'' loop runs for a fixed amount - in this case, 3, while the ''while'' loop runs until the loop condition changes; in this example, the condition is the boolean ''True'' which will never change, so it could theoretically run forever. You could use a ''for'' loop with a huge number in order to gain the same effect as a ''while'' loop, but what's the point of doing that when you have a construct that already exists? As the old saying goes, "why try to reinvent the wheel?".
Line 27: Line 32:
If you've done any programming before, there's no doubt you've come across a for loop or an equivalent to it. In Python, they work a little differently. Basically, any object with an iterable method can be used in a for loop in Python. Even strings, despite not having an iterable method - but we'll not get on to that here. You can define your own iterables by creating an object with next() and __iter__() methods. This means that you'll rarely be dealing with raw numbers when it comes to for loops in Python - great for just about anyone!
If you've done any programming before, you have undoubtedly come across a ''for'' loop or an equivalent to it. Many languages have conditions in the syntax of their ''for'' loop, such as a relational expression to determine if the loop is done, and an increment expression to determine the next loop value. In Python this is controlled instead by generating the appropriate sequence. Basically, any object with an iterable method can be used in a ''for'' loop. Even strings, despite not having an iterable method - but we'll not get on to that here. Having an iterable method basically means that the data can be presented in list form, where there are multiple values in an orderly fashion. You can define your own iterables by creating an object with next() and iter() methods. This means that you'll rarely be dealing with raw numbers when it comes to for loops in Python - great for just about anyone!
Line 31: Line 38:
When you have a piece of code you want to run '''x''' number of times, then code within that code which you want to run '''y''' number of times, you use what is known as a "nested loop". In Python, these are heavily used whenever someone has a list of lists - an iterable object within an iterable object.
When you have a block of code you want to run '''x''' number of times, then a block of code within that code which you want to run '''y''' number of times, you use what is known as a "nested loop". In Python, these are heavily used whenever someone has a list of lists - an iterable object within an iterable object.

{{{
for x in range(1, 11):
    for y in range(1, 11):
        print('%d * %d = %d' % (x, y, x*y))
}}}
Line 35: Line 50:
Like the ''while'' loop, the ''for'' loop can be made to exit before the given object is finished. This is done using the ''break'' keyword, which will stop the code from executing any further. You can also have an optional ''else'' clause, which will run should the ''for'' loop exit cleanly - I.E., without breaking.
Line 37: Line 51:
== Things to remember == Like the ''while'' loop, the ''for'' loop can be made to exit before the given object is finished. This is done using the ''break'' statement, which will immediately drop out of the loop and contine execution at the first statement after the block. You can also have an optional ''else'' clause, which will run should the ''for'' loop exit cleanly - that is, without breaking.
Line 39: Line 53:
 * range vs xrange {{{
for x in range(3):
    if x == 1:
        break
}}}
Line 41: Line 59:
The range() function creates a list containing numbers defined by the input. The xrange() function creates a number generator. You will often see that xrange() is used much more frequently than range. This is for one reason only - resource usage. The range() function generates a list of numbers all at once, where as xrange() generates them as needed. This means that less memory is used, and should the for loop exit early, there's no need to waste time creating the unused numbers. This effect is tiny, as you can see in the examples below.
Line 45: Line 62:
''Nested loops''
{{{#!python numbers=disable
for x in xrange(1,11):
    for y in xrange(1,11):
        print '%d * %d = %d' % (x,y,x*y)
''For..Else''

{{{
for x in range(3):
    print(x)
else:
    print('Final x = %d' % (x))
Line 52: Line 71:
''Early exit''
{{{#!python numbers=disable
for x in xrange(3):
    if x==1:
        break
}}}

''For..Else''
{{{#!python numbers=disable
for x in xrange(3):
    print x
else:
    print 'Final x=%d' % (x)
}}}
Line 68: Line 73:
{{{#!python numbers=disable
string="Hello World"

{{{
string = "Hello World"
Line 71: Line 77:
    print x     print(x)
Line 75: Line 81:
{{{#!python numbers=disable
collection=['hey',5,'d']

{{{
collection = ['hey', 5, 'd']
Line 78: Line 85:
    print x     print(x)
Line 81: Line 88:

''Loop over Lists of lists''


{{{
list_of_lists = [ [1, 2, 3], [4, 5, 6], [7, 8, 9]]
for list in list_of_lists:
    for x in list:
        print(x)
}}}


Line 82: Line 102:
{{{#!python numbers=disable
class iterable:

{{{
class Iterable(object):
Line 100: Line 121:
''range vs xrange''
{{{#!python numbers=disable
import time
Line 104: Line 122:
start = time.clock()
for x in range(10000000):
    if x==958857:
        break
    pass
''Your own range generator using yield''
Line 110: Line 124:
stop=time.clock()
print stop-start
start = time.clock()
for x in xrange(10000000):
    if x==958857:
        break
    pass
{{{
def my_range(start, end, step):
    while start <= end:
        yield start
        start += step
Line 118: Line 130:
stop=time.clock()
print stop-start
}}}
(For reference, this returned a sampled time of 0.524843830962 for the range loop and a time of 0.133692928435 for the xrange loop)
for x in my_range(1, 10, 0.5):
    print(x)
}}}


== A note on `range` ==

The [[https://docs.python.org/3/library/functions.html#func-range|''range'']] function is seen so often in ''for'' statements that you might think ''range'' is part of the ''for'' syntax. It is not: it is a Python built-in function which returns a sequence following a specific pattern (most often sequential integers), which thus meets the requirement of providing a sequence for the ''for'' statement to iterate over. Since ''for'' can operate directly on sequences, and there is often no need to count. This is a common beginner construct (if they are coming from another language with different loop syntax):

{{{
mylist = ['a', 'b', 'c', 'd']
for i in range(len(mylist)):
    # do something with mylist[i]
}}}

It can be replaced with this:

{{{
mylist = ['a', 'b', 'c', 'd']
for v in mylist:
    # do something with v
}}}

Consider {{{for var in range(len(something)):}}} to be a flag for possibly non-optimal Python coding.

For loops

Usage in Python

  • When do I use for loops?

for loops are traditionally used when you have a block of code which you want to repeat a fixed number of times. The Python for statement iterates over the members of a sequence in order, executing the block each time. Contrast the for statement with the ''while'' loop, used when a condition needs to be checked each iteration, or to repeat a block of code forever. For example:

For loop from 0 to 2, therefore running 3 times.

for x in range(0, 3):
    print("We're on time %d" % (x))

While loop from 1 to infinity, therefore running forever.

x = 1
while True:
    print("To infinity and beyond! We're getting close, on %d now!" % (x))
    x += 1

As you can see, these loop constructs serve different purposes. The for loop runs for a fixed amount - in this case, 3, while the while loop runs until the loop condition changes; in this example, the condition is the boolean True which will never change, so it could theoretically run forever. You could use a for loop with a huge number in order to gain the same effect as a while loop, but what's the point of doing that when you have a construct that already exists? As the old saying goes, "why try to reinvent the wheel?".

  • How do they work?

If you've done any programming before, you have undoubtedly come across a for loop or an equivalent to it. Many languages have conditions in the syntax of their for loop, such as a relational expression to determine if the loop is done, and an increment expression to determine the next loop value. In Python this is controlled instead by generating the appropriate sequence. Basically, any object with an iterable method can be used in a for loop. Even strings, despite not having an iterable method - but we'll not get on to that here. Having an iterable method basically means that the data can be presented in list form, where there are multiple values in an orderly fashion. You can define your own iterables by creating an object with next() and iter() methods. This means that you'll rarely be dealing with raw numbers when it comes to for loops in Python - great for just about anyone!

  • Nested loops

When you have a block of code you want to run x number of times, then a block of code within that code which you want to run y number of times, you use what is known as a "nested loop". In Python, these are heavily used whenever someone has a list of lists - an iterable object within an iterable object.

for x in range(1, 11):
    for y in range(1, 11):
        print('%d * %d = %d' % (x, y, x*y))
  • Early exits

Like the while loop, the for loop can be made to exit before the given object is finished. This is done using the break statement, which will immediately drop out of the loop and contine execution at the first statement after the block. You can also have an optional else clause, which will run should the for loop exit cleanly - that is, without breaking.

for x in range(3):
    if x == 1:
        break

Examples

For..Else

for x in range(3):
    print(x)
else:
    print('Final x = %d' % (x))

Strings as an iterable

string = "Hello World"
for x in string:
    print(x)

Lists as an iterable

collection = ['hey', 5, 'd']
for x in collection:
    print(x)

Loop over Lists of lists

list_of_lists = [ [1, 2, 3], [4, 5, 6], [7, 8, 9]]
for list in list_of_lists:
    for x in list:
        print(x)

Creating your own iterable

class Iterable(object):

    def __init__(self,values):
        self.values = values
        self.location = 0

    def __iter__(self):
        return self

    def next(self):
        if self.location == len(self.values):
            raise StopIteration
        value = self.values[self.location]
        self.location += 1
        return value

Your own range generator using yield

def my_range(start, end, step):
    while start <= end:
        yield start
        start += step

for x in my_range(1, 10, 0.5):
    print(x)

A note on `range`

The ''range'' function is seen so often in for statements that you might think range is part of the for syntax. It is not: it is a Python built-in function which returns a sequence following a specific pattern (most often sequential integers), which thus meets the requirement of providing a sequence for the for statement to iterate over. Since for can operate directly on sequences, and there is often no need to count. This is a common beginner construct (if they are coming from another language with different loop syntax):

mylist = ['a', 'b', 'c', 'd']
for i in range(len(mylist)):
    # do something with mylist[i]

It can be replaced with this:

mylist = ['a', 'b', 'c', 'd']
for v in mylist:
    # do something with v

Consider for var in range(len(something)): to be a flag for possibly non-optimal Python coding.

ForLoop (last edited 2022-01-23 09:18:40 by eriky)

Unable to edit the page? See the FrontPage for instructions.