6.1. Loop While

6.1.1. Syntax

  • Continue execution when argument is True

  • Stops if argument is False

Listing 6.1. while loop generic syntax
while <condition>:
    <do something>

6.1.2. Convention

  • The longer the loop scope, the longer the variable name should be

  • Avoid one letters if scope is longer than one line

  • Generic names:

    • i - for loop counter

    • abort - for abort flags

    • abort_flag - for abort flags

6.1.3. Use Cases

Listing 6.2. Never ending loop. Used in servers to wait forever for incoming connections
while True:
    print('hello')
Listing 6.3. Stop conditions
i = 0

while i < 3:
    print(i)
    i += 1

# 0
# 1
# 2
Listing 6.4. Iterating over sequence. Better idea for this is to use for loop. for loop supports Iterators. len() must write all numbers to memory, to calculate its length
i = 0
data = ['a', 'b', 'c']

while i < len(data):
    print(i, data[i])
    i += 1

# 0 'a'
# 1 'b'
# 2 'c'
Listing 6.5. Exit flag. Exit flag pattern is useful if you have for example multi-threaded application
print('Ignition sequence started')
abort = False
i = 10

while not abort:
    print(i)
    i -= 1

    if i == 6:
        print('Fuel leak detected. Abort, Abort, Abort!')
        abort = True

# Ignition sequence started
# 10
# 9
# 8
# 7
# Fuel leak detected. Abort, Abort, Abort!

6.1.4. Force Exit the Loop

Listing 6.6. Force exit the loop using break keyword
print('Ignition sequence started')
i = 10

while True:
    print(i)
    i -= 1

    if i == 6:
        print('Fuel leak detected. Abort, Abort, Abort!')
        break

# Ignition sequence started
# 10
# 9
# 8
# 7
# Fuel leak detected. Abort, Abort, Abort!
Listing 6.7. Exiting the loop using break keyword
while True:
    number = input('Type number: ')

    if not number:
        # if user hit enter
        # without typing a number
        break

6.1.5. Force Skip Iteration

  • if continue is encountered, it will jump to next loop iteration

Listing 6.8. Force skip iteration using continue keyword
all_astronauts = ['Mark Watney', 'Jan Twardowski', 'Melissa Lewis', 'José Jiménez']
assigned_to_mission = ['Mark Watney', 'Melissa Lewis']
i = 0

while i < len(all_astronauts):
    name = all_astronauts[i]
    i += 1

    if name not in assigned_to_mission:
        continue

    print(name)

# Mark Watney
# Melissa Lewis
Listing 6.9. Force skip iteration using continue keyword
i = 0

while i < 10:
    print(i, end=', ')
    i += 1

    if i % 3:
        continue

    print(end='\n')

# 0, 1, 2,
# 3, 4, 5,
# 6, 7, 8,
# 9,

6.1.6. Assignments

6.1.6.1. Example

English
  1. Use data from "Input" section (see below)

  2. Create result: List[int]

  3. Use while to iterate over DATA

  4. Convert all elements of DATA to int

  5. Converted values add to result

  6. Compare result with "Output" section (see below)

Polish
  1. Użyj danych z sekcji "Input" (patrz poniżej)

  2. Stwórz result: List[int]

  3. Użyj while do iterowania po DATA

  4. Przekonwertuj wszystkie elementy DATA do int

  5. Przekonwertowane wartości dodaj do result

  6. Porównaj wyniki z sekcją "Output" (patrz poniżej)

Input
DATA = ['1', '2', '3']
Output
result: List[int]
# [1, 2, 3]
Solution
DATA = ['1', '2', '3']
i = 0
result = []

while i < len(DATA):
    value = int(DATA[i])
    result.append(value)
    i += 1

print(result)
# [1, 2, 3]

6.1.6.2. Loop For Substitute

English
  1. Use data from "Input" section (see below)

  2. Define result: list

  3. Use while to iterate over DATA

  4. If letter is in PL_ASCII then use conversion value as letter

  5. Add letter to result

  6. Compare result with "Output" section (see below)

Polish
  1. Użyj danych z sekcji "Input" (patrz poniżej)

  2. Użyj while do iteracji po DATA

  3. Jeżeli litera jest w PL_ASCII to użyj przekonwertowanej wartości jako litera

  4. Dodaj literę do result

  5. Porównaj wyniki z sekcją "Output" (patrz poniżej)

Input
PL_ASCII = {
    'ą': 'a',
    'ć': 'c',
    'ę': 'e',
    'ł': 'l',
    'ń': 'n',
    'ó': 'o',
    'ś': 's',
    'ż': 'z',
    'ź': 'z',
}

DATA = 'zażółć gęślą jaźń'
Output
result: str
# 'zazolc gesla jazn'

6.1.6.3. Loop While Convert

English
  1. Use data from "Input" section (see below)

  2. Create result: List[int]

  3. Use while to iterate over DATA

  4. Convert all elements of DATA to int

  5. Converted values add to result

  6. Compare result with "Output" section (see below)

Polish
  1. Użyj danych z sekcji "Input" (patrz poniżej)

  2. Stwórz result: List[int]

  3. Użyj while do iterowania po DATA

  4. Przekonwertuj wszystkie elementy DATA do int

  5. Przekonwertowane wartości dodaj do result

  6. Porównaj wyniki z sekcją "Output" (patrz poniżej)

Input
DATA = (2, 3, 3.5, 4, 4.5, 5)
Output
result: List[int]
# [2.0, 3.0, 3.5, 4.0, 4.5, 5.0]
The whys and wherefores
  • Reading user input

  • Input validation

  • Type casting

  • Sequences

  • Using while loop

  • Breaking loop

  • Using built-in functions

Hints
  • input(...)

  • mean = sum(...) / len(...)

6.1.6.4. Loop While Input

English
  1. Use data from "Input" section (see below)

  2. Using while Create grade_scale: List[float] from DATA (convert values to float)

  3. Using input() ask user about grade, one at a time

  4. User will type only valid int or float

  5. To iterate use only while loop

  6. If grade is on a new grade scale - add it to report card

  7. If grade is not on a new grade scale - print "Grade is not allowed" and continue input

  8. If user pressed Enter key, end inserting data

  9. At the end, print calculated mean

  10. Test case when report list is empty

Polish
  1. Użyj danych z sekcji "Input" (patrz poniżej)

  2. Używając while stwórz grade_scale: List[float] z DATA (przekonwertuj wartości do float)

  3. Do iterowania użyj tylko pętli while

  4. Używając input() poproś użytkownika o ocenę, jedną na raz

  5. Użytkownik poda tylko poprawne int lub float

  6. Jeżeli ocena jest w grade_scale - dodaj ją do dzienniczka

  7. Jeżeli oceny nie ma w grade_scale - wyświetl "Grade is not allowed" i kontynuuj wpisywanie

  8. Jeżeli użytkownik wcisnął Enter, zakończ wprowadzanie danych

  9. Na zakończenie wyświetl wyliczoną dla dzienniczka średnią arytmetyczną

  10. Przetestuj przypadek, gdy dzienniczek jest pusty

Input
DATA = (2, 3, 3.5, 4, 4.5, 5)
The whys and wherefores
  • Reading user input

  • Input validation

  • Type casting

  • Sequences

  • Using while loop

  • Breaking loop

  • Using built-in functions

Hints
  • mean = sum(...) / len(...)