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"))