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

Então, eu consegui melhorar isso das variáveis e das redundâncias no código como o str(input()), mas essa parte nova da função do ask eu consigo entender, mais ou menos, de como ela funciona, mas não tenho total compreensão, isso me faz pensar se, no meu atual nível de iniciante, seria uma boa fazer isso no meu código, eu acho fica um pouco estranho uma parte de um código ser feita como um pleno e outra parte como um júnior, entende o que estou querendo dizer?

Carregando publicação patrocinada...
7

Qual parte exatamente vc não entendeu?

while True é um loop "infinito", já que a condição para se repetir é True (ou seja, sempre é verdadeira).

Dentro dele tem o input, e depois eu vejo se o que foi digitado é "y" ou "n": if answer in ('y', 'n'). Basicamente, ('y', 'n')é uma tupla contendo as strings 'y' e 'n', e o if verifica se answer é um dos valores desta tupla.

Claro que eu poderia ter feito if answer == 'y' or answer == 'n', também funciona. Nesse caso tanto faz um ou outro, mas se vc tivesse mais opções para verificar (digamos que 10, 20 ou até mais, por exemplo), uma tupla fica mais sucinto do que vários or. Por exemplo:

# supondo que existam 20 valores possíveis
if valor in ('valor1', 'valor2', 'valor3', .... , 'valor20'):

# o if acima é mais sucinto que:
if valor == 'valor1' or valor == 'valor2' or valor == 'valor3' ...  or valor == 'valor20':

Enfim, se entrar no if (ou seja, se digitar "y" ou "n"), ele retorna o valor que foi digitado (é o que o return faz). Um detalhe importante é que o return encerra a função (ou seja, ele também sai do while).


Enfim, se deixar assim fica mais claro?

import time

rules = [
    "You can't talk about Fight Club",
    "You can't talk about Fight Club",
    "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"
]

while True:
    want_to_know = input('$ Do you want to know the rules?(y/n) ')
    if want_to_know == 'y' or want_to_know == 'n':
        break # sai do while

if want_to_know == 'y':
    while True:
        for rule in rules:
            print(f"* {rule}")
            time.sleep(1)
        while True:
            understood = input('$ Did you understand the rules?(y/n) ')
            if understood == 'y' or understood == 'n':
                break # sai do while referente ao understood
        if understood == 'y':
            break # se entendeu as regras, sai do while externo

print('# Welcome to Fight Club')

Agora eu removi a função e usei um while para cada pergunta. A diferença é que vez de return, eu uso break, que serve para interromper um loop. Ou seja, se digitar "y" ou "n", ele sai do while, e se digitar outra coisa, o loop continua, chamando input novamente.

É basicamente o mesmo que a função faz, a única diferença é que a função precisa retornar o valor para quem a chama, por isso ela usa return em vez de break.

Mas repare que a parte das perguntas é praticamente igual (faz a pergunta, se for "y" ou "n" para, senão pergunta de novo). E quando vc tem trechos repetitivos que fazem basicamente a mesma coisa com poucas variações, estes trechos são fortes candidatos a ficarem isolados em uma função própria.

Outro ponto é que ter um loop dentro do outro pode deixar mais confuso, ainda mais se cada um tem seu break. Isso até seria um argumento contra o break, mas eu acho que na verdade é um argumento a favor de criar a função ask :-)


Aqui talvez seja uma questão de "estilo"/gosto pessoal, mas tem gente que prefere fazer algo como:

want_to_know = None
while want_to_know != 'y' and want_to_know != 'n':
    want_to_know = input('$ Do you want to know the rules?(y/n) ')

Ou seja, primeiro eu inicializo a variável com um valor que eu sei que é inválido, só para forçar a entrada no while. Também serve, veja qual fica mais claro para você.

2

Não sei nem como te agredecer mano, que explicação bem feita, adcionou muito ao meu conhecimento, mandei o máximo de TabCoins que o site me permitiu para você, parabéns e muito obrigado👏 :)

1

Boa noite mano👋, fiquei o dia buscando entender linha por linha desse código e somente agora implementei ele com 100% de compreensão do codebase do meu projeto, por ficar buscando tanto compreender consegui encontrar até outra forma de otimização do código, e gostaria de mandar para você para uma avaliação se possível, desde já agradeço novamente pelo conhecimento passado pelos postos acima, me ajudaram muito!

def ask(text):
   while True:
    ask = input(text)
    if ask == "y":
      return True
    if ask == "n":
      return False
if ask("Do you want to know the rules?(y/n) "):
   while True:
      for rule in rules:
        print(f"* {rule}")
        time.sleep(0.5)
      understood = ask("Did you understand the rules?(y/n) ")
      if understood:
        break