While Loops with Sequences#
Strings are sequences of characters that we can access by index. Before
the for loop chapter, we use while loops with an index variable to
process strings one character at a time.
One Character Per Line#
To print each character of a string on its own line:
def one_char_per_line(s: str) -> None:
"""Print each character of s on a separate line."""
i = 0
while i < len(s):
print(s[i])
i += 1
one_char_per_line("bug")
Output:
b
u
g
Following the loop-planning rubric:
Changing variable:
i(the index)Initial value:
0Continuation condition:
i < len(s)(valid indices are 0 throughlen(s)-1)Update:
i += 1
Counting Vowels#
def count_vowels(s: str) -> int:
"""Return the number of vowel characters in s."""
vowels = "aeiouAEIOU"
count = 0
i = 0
while i < len(s):
if s[i] in vowels:
count += 1
i += 1
return count
print(count_vowels("Hello World")) # 3
Checking for All Digits#
def all_digits(s: str) -> bool:
"""Return True if every character of s is a digit."""
i = 0
while i < len(s):
if not s[i].isdigit():
return False
i += 1
return True
print(all_digits("12345")) # True
print(all_digits("123a5")) # False
Note the early return False — as soon as a non-digit is found, there
is no need to check further.
Finding a Character#
Search for the first occurrence of a target character:
def find_char(s: str, target: str) -> int:
"""Return the index of the first occurrence of target in s, or -1."""
i = 0
while i < len(s):
if s[i] == target:
return i
i += 1
return -1
This is essentially what s.find(target) does internally.
Note
The for loop (covered in the next chapter) makes iterating over a
string much cleaner — for ch in s: instead of managing an index
manually. The while forms above are shown to build understanding
of how indexing works; in practice you will almost always use for.