QNA > S > Sono Nuovo. Perché Def Main() Continua A Fermare Il Codice Per Andare Avanti?

Sono nuovo. Perché def main() continua a fermare il codice per andare avanti?

Guardando gli esempi di codice che hai postato. Capisco il def main(): introduce un blocco di codice indentato come definizione di una funzione senza argomenti chiamata main. A quel punto Python ha memorizzato cosa intendi per main. Ricordare la definizione non significa eseguire il codice nel blocco indentato sotto def. La linea non indentata dopo il blocco di codice è la prossima cosa che Python fa dopo aver memorizzato la vostra definizione di main. Quella linea successiva invoca main facendo sì che Python sorrida tranquillamente e dica Hey! Conosco una routine chiamata main. Vuole che la chiami senza argomenti. Main si aspetta di non avere argomenti, quindi farò quella chiamata e se main è buono, il vostro programma è in esecuzione. Ora c'è qualche stranezza nel tuo main, ma ci torneremo.

Nel secondo esempio di codice dai ancora una definizione di main() ma nota l'ultima linea. È una chiamata di main, ma è indentata, quindi fa parte del blocco di codice che viene definito, ma a differenza del primo esempio, dopo la definizione del blocco di codice di main la cosa successiva è la fine del file. Python potrebbe tranquillamente brontolare tra sé e sé su quanto sia fastidioso essere richiesto di ricordare una definizione e non averne mai bisogno prima della fine del semestre. Avendo raggiunto la fine con alcune cose memorizzate ma niente che chieda di eseguire il codice definito, Python esce e prontamente dimentica la vostra definizione di main. Conoscete qualche studente che mostra un comportamento simile alla fine del semestre?

Tornando al primo esempio di codice. Guardate l'ultima riga della definizione di main. È doppiamente indentata sotto un else sotto la def. È una chiamata ricorsiva condizionale di main e dubito fortemente che vogliate davvero la ricorsione qui. Un terribile dattilografo alla tastiera potrebbe far traboccare lo stack con chiamate ricorsive. Penso che quello che volete davvero sia un ciclo che continua a chiedere all'utente di scegliere una fattoria finché non ha fatto una scelta valida

Il mio suggerimento è di semplificare il codice. Si potrebbe chiedere all'utente un tipo di fattoria e controllare se trim(farmtype) è in farmlist. Continuate a chiedere in un ciclo finché l'utente non dà un tipo di fattoria valido. Poi potreste avere un dizionario con la chiave del tipo di fattoria con i valori delle linee veloci per congratularvi con l'utente per aver scelto il tipo di fattoria.

Invece di avere una lista separata di fattorie e un dizionario con la chiave del tipo di fattoria (che sarebbe un problema di manutenzione perché aggiungere un nuovo tipo di fattoria richiede di aggiungere il nuovo tipo di fattoria sia alla lista che al dizionario), sarebbe meglio controllare solo se il tipo di fattoria dell'utente è una chiave valida nel dizionario della vostra fattoria. Notate quante ripetizioni ci sono nel vostro albero if .... elif... elif? Catturando ciò che differisce da ramo a ramo in un dizionario, è necessario molto meno codice. Un principio del buon codice è DRY - Don't Repeat Yourself.

Vuoi divertirti? Invece di un ciclo che continua a chiedere all'utente di riprovare, codificate risposte sempre più brevi. Se l'utente non ci riesce in 3 tentativi, suggeritegli di cercare un aiuto professionale e il programma si spegne.

Grazie per l'A2A. Spero di aver risposto alla tua domanda e di averti dato una revisione gratuita del codice.

Divertiti.

Di Scarrow

Quali vantaggi ha il c stick più piccolo del controller del GameCube rispetto ai due stick analogici regolari? :: Cos'è l'errore 'MSA keep stopping' e come lo risolvo?
Link utili