Python: Mi función devuelve “Ninguna” después de que haga lo que quiero que

Aqui esta mi progtwig

def reverse(letters): backwards = "" i = len(letters) - 1 while i >= 0: backwards = backwards + letters[i] i = i - 1 print (backwards) print (reverse("hello")) 

Funciona, imprime “olleh”, pero después imprime “Ninguno” en una nueva línea. Y estoy preguntando por qué es esto. Obviamente, el progtwig es revertir una palabra, el código funciona, y sin una función no imprime ninguna, así que no sé por qué lo hace en la función. Esto se está utilizando en otro progtwig más grande, así que lo necesito como una función, y debido a que es para la escuela, no se me permite simplemente usar la función .reverse (). Así que realmente necesito este código fijo en lugar de grandes cambios, si es posible.

La función devuelve None de forma predeterminada, por lo que debe return backwards explícitamente

También, puedes usar una forma pythonica para resolver el problema:

 letters[::-1] 

Puede usar una statement de retorno para salir de la función que devuelve un valor. Si la función llega al final sin alcanzar una statement de retorno, devolverá Ninguno de forma predeterminada

 def add1(x): return x+1 def returnsNone(): pass print(add1(2)) print(returnsNone()) 

Cada función devuelve algo en Python. Si no devuelve un valor explícitamente, Python le devuelve a su función None .

Su función no devuelve nada porque la print imprime en la salida estándar, mientras que return devuelve un valor. Pueden parecer iguales en el REPL, pero son completamente diferentes.

Así que para solucionar su problema, devuelva un valor:

 return backwards 

Prueba solo

  reverse(hello) 

De hecho con

 print reverse(hello) 

Usted está imprimiendo el valor de retorno de reversa. Y ese valor de retorno es Ninguno.

Déjame darte algunos consejos generales:

reverse () en su código es una función con efectos secundarios (impresión). Debería evitar las funciones con efectos secundarios cuando no las necesite, considere invertir () devolviendo la palabra en lugar de imprimirla:

 def reverse(letters): backwards = "" i = len(letters) - 1 while i >= 0: backwards = backwards + letters[i] i = i - 1 return backwards print (reverse("hello")) 

Además

 i = len(letters) - 1 while i >= 0: backwards = backwards + letters[i] i = i - 1 

no es fácil de mantener y si agrega funcionalidad al bucle, el decremento i = i-1 estará lejos del lugar donde debería estar “conceptualmente”. Prefieres tener decremento junto con el cheque:

 for i in xrange(len(letters)-1,-1,-1): backwards = backwards + letters[i] 

Cuando estoy flojo escribo

 myString = myString + fewChars 

para que pueda entender que seas perezoso Pero la adición de fewChars no modifica myString, pero crea una nueva. Si está agregando iterativamente muchos caracteres, rara vez la forma más eficiente es agregar uno por uno. Considere el uso de join (). Por ejemplo

 letters = 'word' lettersList = [letters[i] for i in xrange(len(letters)-1,-1,-1)] myReversed ''.join(lettersList) 

ok, estoy de acuerdo que no es legible y, probablemente, ni siquiera más rápido, pero para cadenas más grandes se escala mejor que un enfoque newString = oldString + oneChar

Dicho esto, más enfoques pythonicos.

 letters[::-1] 

ya sugerido por alguien más rápido que yo, normalmente funciona mucho mejor y es fácil de leer por los progtwigdores de Python.

Tiene sentido si lo piensas. Su reverse no devuelve nada, solo imprime su resultado. Pero cuando escribe print (reverse("hello")) , en realidad está imprimiendo lo que devuelve. Como no devuelve nada, None se imprime None .

Como se mencionó anteriormente. Si la función de python no llega a través de una statement de return , imprime None de forma predeterminada. Hacer un pequeño cambio como se muestra a continuación soluciona esto:

 def reverse(letters): backwards = "" i = len(letters) - 1 while i >= 0: backwards = backwards + letters[i] i = i - 1 return(backwards) # instead of print(backwards) print(reverse("hello"))