9.18. Optional parameters

To find the locations of the second or third occurrence of a character in a string, we can modify the find function, adding a third parameter for the starting position in the search string:

x
 
1
def find2(astring, achar, start):
2
    """
3
    Find and return the index of achar in astring.
4
    Return -1 if achar does not occur in astring.
5
    """
6
    ix = start
7
    found = False
8
    while ix < len(astring) and not found:
9
        if astring[ix] == achar:
10
            found = True
11
        else:
12
            ix = ix + 1
13
    if found:
14
        return ix
15
    else:
16
        return -1
17
18
print(find2('banana', 'a', 2))
19

(ch08_fun4)

The call find2('banana', 'a', 2) now returns 3, the index of the first occurrence of ‘a’ in ‘banana’ after index 2. What does find2('banana', 'n', 3) return? If you said, 4, there is a good chance you understand how find2 works. Try it.

Better still, we can combine find and find2 using an optional parameter.

19
 
1
def find3(astring, achar, start=0):
2
    """
3
    Find and return the index of achar in astring.
4
    Return -1 if achar does not occur in astring.
5
    """
6
    ix = start
7
    found = False
8
    while ix < len(astring) and not found:
9
        if astring[ix] == achar:
10
            found = True
11
        else:
12
            ix = ix + 1
13
    if found:
14
        return ix
15
    else:
16
        return -1
17
18
print(find3('banana', 'a', 2))
19

(chp08_fun5)

The call find3('banana', 'a', 2) to this version of find behaves just like find2, while in the call find3('banana', 'a'), start will be set to the default value of 0.

Adding another optional parameter to find makes it search from a starting position, up to but not including the end position.

28
 
1
def find4(astring, achar, start=0, end=None):
2
    """
3
    Find and return the index of achar in astring.
4
    Return -1 if achar does not occur in astring.
5
    """
6
    ix = start
7
    if end == None:
8
        end = len(astring)
9
10
    found = False
11
    while ix < end and not found:
12
        if astring[ix] == achar:
13
            found = True
14
        else:
15
            ix = ix + 1
16
    if found:
17
        return ix
18
    else:
19
        return -1
20
21
ss = "Python strings have some interesting methods."
22
23
print(find4(ss, 's'))
24
print(find4(ss, 's', 7))
25
print(find4(ss, 's', 8))
26
print(find4(ss, 's', 8, 13))
27
print(find4(ss, '.'))
28

(chp08_fun6)

The optional value for end is interesting. We give it a default value None if the caller does not supply any argument. In the body of the function we test what end is and if the caller did not supply any argument, we reassign end to be the length of the string. If the caller has supplied an argument for end, however, the caller’s value will be used in the loop.

The semantics of start and end in this function are precisely the same as they are in the range function.

Next Section - 9.19. Character classification