Executando verificação de segurança...
0

Minha sugestão é retirar as redundâncias e deixar o código o mais enxuto possível.

import time


def ask(question):
    return True if input(question) == "y" else False


def main():
    rules = [
        "You can't talk about Fight Club", "", "",
        "Only one fight at a time",
        "Only two people fight at a time",
        "No shoes or shirts",
        "Fights continue until necessary",
        "First-time attendees must fight",
    ]
    rules[2] = rules[1] = rules[0]
    if ask("$ Do you want to know the rules?(y/n) "):
        while True:
            for rule in rules:
                print(f"* {rule}")
                time.sleep(1)
            if ask("$ Did you understand the rules?(y/n) "):
                break
    print("# Welcome to Fight Club")


if __name__ == "__main__":
    main()
Carregando publicação patrocinada...
3

Em vez de:

def ask(question):
    return True if input(question) == "y" else False

Poderia ser apenas:

def ask(question):
    return input(question) == "y"

Pois o resultado do operador == é True ou False, então pode retornar o valor da expressão diretamente.


Mas tem uma diferença importante aí. No código original, ele verifica se o que foi digitado é "y" ou "n", e se for qualquer valor diferente disso ("a", "x", ou qualquer outra coisa), ele pede para digitar novamente.

Mas no seu código ele só pergunta uma vez e pronto. E se digitar qualquer coisa diferente de "y" (e que não necessarimente é "n"), ele considera que é False.

Enfim, é uma diferença sutil, mas que muda o comportamento do programa. Claro que por ser um projeto pessoal sem requisitos bem definidos, não precisamos ser tão rígidos. Mas é importante saber que os códigos não são equivalentes.

1
0

Se fosse um if convencional, funcionaria perfeitamente sem o else, mas esse tipo de expressão pythonic equivale ao operador ternário return input(question) == "y" ? true : false em linguagens baseadas em C, tais como C++, Java, Javascript, Typescript, entre outras.

Pode testar: se você retirar o else False provocará um erro do tipo SyntaxError: expected 'else' after 'if' expression.

Em relação à não detecção do caractere "n", partimos do "princípio da boa fé", ou seja, de que o usuário só digitaria "y" ou "n", e não outros caracteres diferentes, ou dígitos, e nem especiais CTRL + C, por exemplo, que precisariam de um tratamento adequado.

Em plataformas de desafios de programação (Topcoder, HackerRank, Leetcode, entre outras), esse princípio da boa fé se aplica. Quando um problema enuncia que as entradas são "y" ou "n", não é necessário se preocupar com outro valor.

Contudo, concordo que na vida real, fora de ambientes de testes, temos que estar preparados para tratar e testar todos os erros possíveis.