[Tutor] Strings

Dave Angel davea at davea.name
Thu Nov 6 02:39:38 CET 2014

```William Becerra <wbecerra1 at gmail.com> Wrote in message:
>

have the following code:
names = "John, Cindy, Peter"
def find(str, ch, s):
index = 0
while index < len(str):
if s==1:
for char in names[:4]:
if str[index] == ch:
return index + 1
index = index + 1
if s==2:
for char in names[6:11]:
if str[index] == ch:
return index + 1
index = index + 1
if s==3:
for char in names[13:]:
if str[index] == ch:
return index + 1
index = index + 1
return -1
print find(names,"n", 2)

and my problem is:
I intend for the parameter s to tell the interpreter which name to
look at
so that i get the index return value related to that name.
for example:
John and Cindy both have a letter 'n' but when I call the function
with an s value of 2 I want it to return the index value of the
letter n in Cindy and not in John.

Your most immediate problem is that you're using index to fetch
characters from the original string, and that's only reasonable
for John. You could make a slice of the original, and search that
slice. Or you could change the comparison to:
if char == ch:

The loop could also be cleaner with enumerate.

Your second big problem is that you've hard coded the sizes of the
first two names in the slice expressions. The magic [6:11] for
example  certainly doesn't belong inside the function.

Third is your while loop makes no sense. Each of the if clauses
won't finish till you're done with the selected substring,  so
you might as well return right away. Drop that line entirely.

Anyway, I say you're trying to do too much in the one function. If
possible change the data structure of names to eliminate one of
the two tasks, or write two functions, a few lines
each.

I'd make
names = ["John", "Cindy", "Peter"]
And start the function with
name = names [s-1]

And now the task of the remainder of the function is to search a
name for a particular character.

--
DaveA

```