Else não imprime print

Olá pessoal boa tarde! Td bem com vcs? espero que sim, no codigo a seguir eu nao consigo imprimir o print apos o else, alguem pode me orientar por gentileza?

opçoes = ["1","2","3"]
opçao = input("Selecione a opção desejada:\n\n"
             "(1) Criar Registro de Estudante.\n"
             "(2) Listar Registro de Estudante.\n"
             "(3) Sair.\n\n"
             "Escolha uma das opções de 1 a 3: ").lower()
if opçao in opçoes:
  if opçao == "1":
     print("Criando Registro.")
  elif opçao == "2":
     print("Listando Registro.")
  elif opçao == "3":
     print("Programa Finalizado.")
  else 
     print("Opcão inválida! Selecione uma das opcões no menu.")

Para cair no else o comando tem que estar alinhado com o primeiro if do script.

opcoes = ["1", "2", "3"]

op = input("Informe um valor de 1 a 3:")

if op in opcoes:
    if op == "1":
        print("Um")
    elif op == "2":
        print("Dois")
    else:
        print("Três")
else:
    print("Opção inválida")
1 curtida

Não precisa do if opçao in opcoes. Vc já testa se é 1, 2, ou 3 (ou seja, está verificando todos os valores possíveis), então se não for nenhum deles, é porque o valor é inválido. Ou seja, poderia ser apenas:

if opçao == "1":
    print("Criando Registro.")
elif opçao == "2":
    print("Listando Registro.")
elif opçao == "3":
    print("Programa Finalizado.")
else:
    print("Opcão inválida! Selecione uma das opcões no menu.")

E nesse caso a lista opcoes passa a não ser necessária. E mesmo o lower não me parece necessário, pois as opções válidas são dígitos: se digitar uma letra, tanto faz se é maiúscula ou minúscula, nunca será um dígito. E se digitar um número, chamar lower não o altera. Então pode tirar o lower também.


Alternativa

Mas se a ideia é ter opções e ações associadas, poderia usar um dicionário, no qual cada opção é mapeada para uma tupla com as mensagens e demais informações. Por exemplo:

opçoes = {
    "1": ('Criar Registro de Estudante', 'Criando Registro'),
    "2": ('Listar Registro de Estudante', 'Listando Registro'),
    "3": ('Sair', 'Programa Finalizado')
}

print('Selecione a opção desejada:\n')
for opcao, mensagens in opçoes.items():
    print(f'({opcao}) {mensagens[0]}.')
op = input("Escolha uma das opções: ")

# se está no dicionário, pega a mensagem correspondente
if op in opçoes:
    print(f'{opçoes[op][1]}.')
else:
     print("Opcão inválida! Selecione uma das opcões no menu.")

Claro, provavelmente vc quer executar alguma coisa para cada opção, então bastaria adicionar a respectiva função em cada opção:

def cadastrar():
    print('cadastro')
    # faz o cadastro

def listar():
    print('listagem')
    # lista os cadastros

import sys
def sair(): # sai do programa
    sys.exit(0)

opçoes = {
    "1": ('Criar Registro de Estudante', 'Criando Registro', cadastrar),
    "2": ('Listar Registro de Estudante', 'Listando Registro', listar),
    "3": ('Sair', 'Programa Finalizado', sair)
}

print('Selecione a opção desejada:\n')
for opcao, mensagens in opçoes.items():
    print(f'({opcao}) {mensagens[0]}.')
op = input("Escolha uma das opções: ")
if op in opçoes:
    print(f'{opçoes[op][1]}.')
    # executa a função
    opçoes[op][2]()
else:
     print("Opcão inválida! Selecione uma das opcões no menu.")
1 curtida