Почему происходит задвоение?

Функция menu(list_gosti) вызывает функцию list_zero(list_z), где происходит проверка на пустоту списка.

Если список пустой, то вызывается функция list_g(gos) (наполнение списка). В свою очередь list_g(gos) вызывает return menu(gos), и вот здесь после нажатия Enter повторно вызывается функция menu(list_gosti), хотя не должна.

Происходит задвоение меню после нажатия Enter, если в функции list_g прописать return menu(gos), а если прописать break то нет.

Это показано на скрине в консоли: сверху если return menu(gos), а снизу если break.

# Функция выбора дальнейших действий - меню
def menu(list_gosti):
    list_zero(list_gosti)
    num_menu = input('''\nЯкщо потрібно замінити гостя у запрошені натисніть 1
Якщо ж бажаєте дозапросити гостей натисніть 2
Для друку списку гостей введіть 3
Ваш вибір -  ''').lower().strip()
    if num_menu == '1':
        print('в процесі розробки')
    elif num_menu == '2':
        print('в процесі ще більшої розобки')
    elif num_menu == '3':
        prin(menu, list_gosti)
    else:
        print('Як добре що всі будуть!!!')


# Функция проверки на пустой список 
def list_zero(list_z):
    if len(list_gosti) == 0:
        print('Список запрошених гостей порожній, запросіть хоть одного гостя!!!')
        list_g(list_gosti)


# Функция наполнения списка 
def list_g(gos):
    print('Що б завершити наповнення списку введіть exit')
    while True:
        z = input('Запрошений гість - ').strip()
        if z == 'exit':
            print('\nВи запросили всіх гостей!!!')
            return menu(gos)# ЕСЛИ В ЭТОМ МЕСТЕ ЗАМЕНИТЬ НА 'BREAK' ,ЗАДВОЕНИЯ НЕ ПРОИСХОДИТ
        gos.append(z.title())
        if z == '':
            gos.remove(z)
        
list_gosti = []

menu(list_gosti)

результат с break


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

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

В функции меню вы вызываете list_zero. Она выполняется и так как мы имеем парадигму Императивный, то после исполнения функции идет исполнение следующей строки. menu() вызывается дважды, следовательно и выполнится оно дважды, если не прервать выполнение, чего, собственно, вы и не делаете :)

# Функция выбора дальнейших действий - меню
def menu(list_gosti):
    if len(list_gosti) == 0:
        print('The list of invited guests is empty, invite at least one guest')
        list_g(list_gosti)
        return # IMPORTANT RETURN
    num_menu = input('''\nIf you want to replace the guest in the invitation, press 1
If you want to invite guests, press 2
To print the guest list, enter 3
Your choice -  ''').lower().strip()
    if num_menu == '1':
        raise NotImplementedError()
    elif num_menu == '2':
        raise NotImplementedError()
    elif num_menu == '3':
        print(list_gosti)
    else:
        print('How good that everyone will be')


# Функция проверки на пустой список [USELESS FUNCTION]
def list_zero(list_z):
    if len(list_gosti) == 0:
        print('The list of invited guests is empty, invite at least one guest')
        list_g(list_gosti)


# Функция наполнения списка 
def list_g(gos):
    print('To complete the list, enter exit')
    while True:
        z = input('Invited guest -').strip()
        if z == 'exit':
            print('\nYou have invited all guests')
            return menu(gos)# ЕСЛИ В ЭТОМ МЕСТЕ ЗАМЕНИТЬ НА 'BREAK' ,ЗАДВОЕНИЯ НЕ ПРОИСХОДИТ
        gos.append(z.title())
        if z == '':
            gos.remove(z)
        
list_gosti = []

menu(list_gosti)
→ Ссылка