2013-10-01 11 views
5

Ecco il mio programmaPython: La mia funzione restituisce "Nessuno" dopo che la fa quello che voglio che

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

print (reverse("hello")) 

Funziona, esso stampa "olleh", ma dopo, la stampa "Nessuno" su un nuova linea. E sto chiedendo perché questo è. Ovviamente il programma è invertire una parola, il codice funziona, e senza una funzione non ne stampa nessuno, quindi non so perché lo fa nella funzione. Questo viene usato in un altro programma più grande, quindi ne ho bisogno come funzione, e poiché è per la scuola, non mi è permesso usare semplicemente la funzione .reverse(). Quindi ho davvero bisogno di questo codice corretto piuttosto che grandi cambiamenti, se possibile.

+1

possibile duplicato di [Restituisci elementi dalla lista in funzione. Python] (http://stackoverflow.com/questions/18990977/return-items-from-list-in-function-python) – Freddie

risposta

2

È possibile utilizzare un'istruzione di ritorno per uscire dalla funzione restituendo un valore. Se la funzione arriva alla fine senza raggiungere un'istruzione return, tornerà Nessuno di default

def add1(x): 
    return x+1 

def returnsNone(): 
    pass 

print(add1(2)) 
print(returnsNone()) 
+3

Che lingua è questa? Nessuna di queste definizioni è valida sintassi python. – Max

+0

@Max: andiamo, il primo mancava solo due punti :) – hugomg

+1

@missingno: Non solo quello. 'end' non significa niente di speciale in Python. – DSM

4

funzione di ritorno None di default, quindi si dovrebbe return backwards esplicitamente

anche, è possibile utilizzare un modo divinatorio per risolvere il problema:

+0

upvoting per modo pioneristico di risolvere il problema. –

0

Ha senso se ci pensate. Il tuo reverse non restituisce nulla: stampa solo il risultato. Ma quando scrivi print (reverse("hello")), stai effettivamente stampando i ritorni di reverse. Poiché non restituisce nulla, viene stampato None.

1

Ogni funzione restituisce qualcosa in in Python. Se non si restituisce esplicitamente un valore, Python restituisce la funzione None.

La funzione in realtà non restituisce nulla perché print stampa su stdout, mentre return restituisce effettivamente un valore. Possono guardare lo stesso nel REPL, ma sono completamente diversi.

Quindi, per risolvere il problema, restituire un valore:

return backwards 
0

provare solo:

reverse(hello) 

Infatti con

print reverse(hello) 

si stampa il valore di ritorno di inversione. E quel valore di ritorno è Nessuno.

Lasciate che vi dia qualche generale consiglia:

reverse() nel codice è una funzione con effetti collaterali (stampa). Si dovrebbe evitare di funzioni con effetti collaterali quando non è necessario, chiedere a reverse() restituendo la parola invece di stamparlo:

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

Inoltre

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

non è facile da mantenere e se aggiungi funzionalità al ciclo il decremento i = i-1 sarà lontano dal luogo in cui dovrebbe essere "concettualmente".Si dovrebbe preferire avere decremento insieme con il controllo:

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

Quando sono pigro scrivo

myString = myString + fewChars 

così posso capire che tu sia pigro. Ma l'aggiunta di pocheChar non modifica myString ma ne crea uno nuovo. Se si aggiungono molti caratteri in modo iterativo, raramente il modo più efficace è aggiungerne uno alla volta. Prendi in considerazione l'utilizzo di join(). Per esempio

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

ok Io sono d'accordo non è leggibile e probabilmente non ancora più veloce, ma per le stringhe più grandi si scale meglio di un newString = oldString + oneChar approccio.

Detto questo, più divinatorio avvicina

letters[::-1] 

già suggerito da qualcuno più veloce di me in genere funziona molto meglio e sono facili da essere letti da programmatori Python.

0

Come accennato in precedenza. Se la funzione python non trova una dichiarazione return, stampa None per impostazione predefinita. Effettuare una piccola modifica come mostrato di seguito corregge questo:

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