Python: Funcția Return nu va returna o listă (Programare, Python, Return)

Conor a intrebat.

Următoarea funcție tipărește aplicațiile instalate de pe un server.

def getAppNames():
    for app in service.apps:
        print app.name   

Funcția funcționează absolut bine și tipărește o listă de aplicații instalate, astfel:

Aplicația A

Aplicația B

Aplicația C

Aplicația D

Aplicația E

Aplicația F

Cu toate acestea, atunci când schimb „print” cu „return”, tot ceea ce obțin este „App A”. Am văzut întrebări similare pe această temă, dar nu găsesc o soluție și am explorat diferite metode. În principiu, am nevoie de funcția return ca și funcția print, aș aprecia orice ajutor.Mulțumesc.

Comentarii

  • Primul element din service.apps este returnat la prima iterație și apoi funcția se oprește. Este posibil să căutați def getAppNames(): return service.apps –  > Por Tim.
  • S-ar putea să vrei să citești câteva noțiuni de bază. Știți ce înseamnă un return face? –  > Por keyser.
5 răspunsuri
Bryan Oakley

The retur face ca funcția dvs. să iasă imediat. Din documentație:

return părăsește apelul de funcție curent cu lista de expresii (sau None) ca valoare de returnare.

Soluția rapidă este să salvați numele într-o listă temporară, apoi să returnați lista:

def getAppNames():
    result = []
    for app in service.apps:
        result.append(app.name)
    return result

Deoarece acesta este un lucru atât de comun de făcut – iterați o listă și returnați o nouă listă – python ne oferă o modalitate mai bună: înțelegeri de liste.

Puteți să rescrieți textul de mai sus în felul următor:

def getAppNames:
    return [app.name for app in service.apps]

Aceasta este considerată o soluție „pythonică”, ceea ce înseamnă că folosește caracteristici speciale ale limbajului pentru a ușura sarcinile comune.

O altă soluție „pythonică” implică utilizarea unui generator. Crearea unui generator presupune să luați codul original așa cum este, dar să înlocuiți return cu yield. Totuși, acest lucru afectează modul în care utilizați funcția. Din moment ce nu ați arătat cum utilizați funcția, nu voi arăta acest exemplu aici, deoarece ar putea adăuga mai multă confuzie decât claritate. Este suficient să spun că există mai mult de două moduri de a rezolva problema dvs.

Aaron Digulla

Există două soluții:

def getAppNames():
    return [app.name for app in service.apps]

sau

def getAppNames():
    for app in service.apps:
        yield app.name

Spre deosebire de return, yield va rămâne în buclă. Acest lucru se numește „generator” în Python. Puteți utiliza apoi list() pentru a transforma generatorul într-o listă sau pentru a itera peste el:

for name in getAppNames():
    ...

Avantajul generatorului este că nu trebuie să construiască întreaga listă în memorie.

Comentarii

  • Există cel puțin încă o soluție (ne-pythonică), care constă în a păstra bucla și a adăuga fiecare nume la o listă, apoi a returna lista. Acesta ar putea fi un concept mai simplu de înțeles pentru un programator începător. –  > Por Bryan Oakley.
Dmitri Loparev

Ar trebui să citiți documentele de bază despre Python 🙂

încercați asta:

def getAppNames():
    return [app.name for app in service.apps]

Comentarii

  • Cred că a oferi unui programator neexperimentat o înțelegere a listei fără a explica ce face nu este foarte util. –  > Por Bryan Oakley.
  • Cred că nu este un programator 🙂 –  > Por Dmitri Loparev.
  • Cu atât mai mult motiv pentru a da o explicație decât un cod. –  > Por Bryan Oakley.
  • Ca neprogramator, el are nevoie doar de o soluție, nu de o explicație, cred… În alt caz, cea mai bună alegere pentru a înțelege conceptele de bază, cum ar fi returnarea, este un om foarte începător, nu stackoverflow –  > Por Dmitri Loparev.
Tom Ron

După o instrucțiune return, funcția „se termină” – părăsește funcția, astfel încât bucla for face de fapt o singură iterație.

Pentru a returna o listă, puteți face –

return [app for app in service.apps]

sau doar –

return service.apps

Comentarii

  • El vrea doar numele. –  > Por Aaron Digulla.
Jon Cage

Prima dată când lovești un return comandă, funcția se întoarce, motiv pentru care veți obține un singur rezultat.

Câteva opțiuni:

  • Folosiți „yield” pentru a produce rezultate și pentru a face funcția să acționeze ca un generator.
  • Adunați toate elementele dintr-o listă (sau o altă colecție) și returnați-o.

Comentarii

  • +1 pentru menționarea yield; -1 pentru că ai făcut-o cuiva care nici măcar nu înțelege return. –  > Por Scott Hunter.
  • Am explicat mai întâi de ce return nu face ceea ce se așteaptă OP 😉 –  > Por Jon Cage.