Пишу адресную книгу. Представленная ниже функция должна изменять адрес и после этого завершать цикл while. Но почему оператор break не работает?

def change():
    while True:
        ch = input('\tВведите имя контакта чей адресс вы хотите изменить:\n')
        if ch == '':
            print('вы ничего не ввели')

        for c, v in ab.items():
            if c == ch:
                new_address = input('Введите новый адресс:\n')
                ab[c] = new_address
                print('Адресс успешно изменен')
                break

Ответы (5 шт):

Автор решения: CrazyElf

С помощью break можно прервать только самый внутренний цикл. Вам нужно поменять "вечный" цикл while на цикл по булевой переменной. Примерно так:



def change():
    is_input_mode = True # <--
    while is_input_mode: # <--
        ch = input('\tВведите имя контакта чей адресс вы хотите изменить:\n')
        if ch == '':
            print('вы ничего не ввели')

        for c, v in ab.items():
            if c == ch:
                new_address = input('Введите новый адресс:\n')
                ab[c] = new_address
                print('Адресс успешно изменен')
                is_input_mode = False # <--
                break

→ Ссылка
Автор решения: Andy Pavlov

Решил обновить свой вариант. Без break и т.п. Просто на if и повторном вызове функции.

def change():
    ch = input('\tВведите имя контакта чей адрес вы хотите изменить:\n')
    if ab.get(ch):
        ab[ch] = input('Введите новый адрес:\n')
        print('Адрес успешно изменен')
    elif ch == 'exit':
        print('Пока')
    else:
        change()

ab = {'Alex': '[email protected]'}
change()
→ Ссылка
Автор решения: GrAnd

Если ab - это словарь, то цикл for вообще тут лишний.

def change():
    while True:
        ch = input('\tВведите имя контакта чей адрес вы хотите изменить:\n')
        if ch == '':
            print('Вы ничего не ввели')
        elif ch in ab:
            new_address = input('Введите новый адрес:\n')
            ab[ch] = new_address
            print('Адрес успешно изменен')
            break
        else:
            print('Имя контакта не найдено')

→ Ссылка
Автор решения: Kers

Можно просто прервать функцию return:

def change():
    while True:
        ch = input('\tВведите имя контакта чей адресс вы хотите изменить:\n')
        if ch == '':
            print('вы ничего не ввели')

        for c, v in ab.items():
            if c == ch:
                new_address = input('Введите новый адресс:\n')
                ab[c] = new_address
                print('Адресс успешно изменен')
                return

P.S. но вариант с управляющей переменной вместо True имхо более правильный (ответ CrazyElf).

→ Ссылка
Автор решения: Roge One

Команда break завершает цикл for, а не while. Для цикла while команда break не используется, поэтому рекомендую заменить её на команду return.Это прервет всю функцию.

→ Ссылка