scripts script run raspberry for compile python python-3.x raspberry-pi nested-function

for - run python script raspberry pi



¿Es Nesting Functions Pythonic? (4)

Estoy aprendiendo Python en mi R.Pi y me he topado con un pequeño inconveniente. Me parece que el siguiente código dejaría abierta la función "inputchecker" en la memoria mientras regresa a la función "getinput".

¿Es este código malo? ¿Debería hacerse de manera muy diferente?

def getinput(i): if i == 1: first = input("Would you like A or B? ") inputchecker(1, first) elif i == 2: second = input("Would you like C or D? ") inputchecker(2, second) def inputchecker(n, userinput): def _tryagain_(n): usage(n) getinput(n) if n == 1: if userinput in ("A", "B"): print("You chose wisely.") getinput(2) else: _tryagain_(n) elif n == 2: if userinput in ("C", "D"): print("You chose wisely.") else: _tryagain_(n) def usage(u): if u == 1: print("Usage: Just A or B please.") if u == 2: print("Usage: Just C or D please.") getinput(1)


Ciertamente evitaría las llamadas recursivas. Además, haría que la función de validación devuelva un booleano en lugar del número de la siguiente pregunta. Dado que usted hace las preguntas de todos modos en secuencia, eso parece complicarlo solo para el lector de su código.

Además, dejaría que la validación siempre devuelva algo: nunca se sabe: el primer argumento podría ser incorrecto también:

def getinput(): valid = False while not valid: first = input("Would you like A or B? ") valid = inputIsValid(1, first) valid = False while not valid: second = input("Would you like C or D? ") valid = inputIsValid(2, second) return [first, second] def inputIsValid(n, userinput): valid = False if n == 1: valid = userinput in ("A", "B") elif n == 2: valid = userinput in ("C", "D") if valid: print("You chose wisely.") else: usage(n) return valid def usage(u): if u == 1: print("Usage: Just A or B please.") elif u == 2: print("Usage: Just C or D please.") getinput()


No, el nombre getinput en la función anidada no crea una referencia. Se busca cada vez que se llama _tryagain_ , porque es un global. No es que esto importe, ya que un módulo se borra como un todo cuando Python se cierra, no hay una posibilidad real de una pérdida de memoria aquí.

Sin embargo, está utilizando la recursión para pedirles a los usuarios que ingresen, y su código es difícil de seguir. Use un bucle simple en su lugar, consulte Pedir al usuario que realice una entrada hasta que dé una respuesta válida .


Para responder a su pregunta sobre "pythonic": Aunque python puede hacer programación funcional, no está diseñada para eso. La sintaxis es un poco desgarbada, y al lenguaje le faltan algunas características . Algunas de esas características faltantes significan que la recursión es lenta .

Entonces, me quedaría con la programación imperfecta para ser "pitónico"


Tener dos funciones infinitamente llamadas entre sí no es realmente el mejor flujo de control. Sería mejor con un ciclo while

def getinput(i): while i: if i == 1: first = input("Would you like A or B? ") i = inputchecker(1, first) elif i == 2: second = input("Would you like C or D? ") i = inputchecker(2, second) def inputchecker(n, userinput): if n == 1: if userinput in ("A", "B"): print("You chose wisely.") return 2 else: getusage(i) return i elif n == 2: if userinput in ("C", "D"): print("You chose wisely.") else: getusage(i) return i

Probablemente sería aún mejor si lo simplificara en una sola función. No hay ninguna razón por la cual deba dividirse.