Treci la conținutul principal

Obținerea unui singur element

Această lecție arată cum să obții un singur element dintr-o listă: după poziția lui, după o condiție sau la întâmplare. Arată și cum să verifici dacă un element există.

Python are None, o valoare specială care înseamnă „nicio valoare”. Când o căutare poate eșua, o funcție Python poate returna elementul sau None, iar codul care o apelează testează rezultatul cu is not None.

Citirea unei poziții care nu există, cum ar fi words[5] într-o listă cu 5 elemente, oprește programul cu o eroare IndexError (o eroare la rulare). De aceea, fie verificăm mai întâi len(), fie folosim o funcție ajutătoare care face asta.

Alte limbaje au multe funcții gata făcute pentru asta. Python se limitează la câteva unelte: parantezele pătrate, funcția încorporată next() cu o valoare implicită și o mică funcție ajutătoare pe care o scrii o singură dată.


Obținerea după poziție

Fiecare element dintr-o listă are o poziție numită index. Primul index este 0, deci ultimul este len(words)-1.

Pentru a citi un element după poziție, scrie indexul între paranteze pătrate: words[3]. Python numără și de la sfârșit: un index negativ, cum ar fi words[-1], citește ultimul element fără niciun calcul cu lungimea.

Python nu are element_at_or_none() sau element_at_or_else(). O mică funcție ajutătoare verifică indexul față de len() și returnează fie elementul, fie None, fie rezultatul unei funcții de rezervă. Astfel, un index în afara intervalului nu poate genera o eroare IndexError.

Elementul de la o poziție

words[3] citește elementul de la indexul 3. Deoarece numărarea începe de la 0, acesta este al patrulea cuvânt.

Prompt
Creează o listă cu cuvintele one, two, three, four, five. Afișează elementul de la indexul 3 folosind paranteze pătrate.
Ieșire: program Python complet
Element at a position

Primul și ultimul element

Primul element este words[0]. Ultimul este words[-1]: un index negativ numără de la sfârșit, deci -1 este ultimul element, iar -2 cel dinaintea lui.

Prompt
Creează o listă cu cuvintele one, two, three, four, five. Afișează primul element cu indexul 0, apoi ultimul element cu indexul -1.
Ieșire: program Python complet
First and last element

Elementul de la o poziție sau None

element_at verifică indexul față de len(). Indexul 1 este în interval, deci returnează cuvântul two. Indexul 5 este în afara intervalului, deci returnează None în loc să genereze o eroare IndexError.

Prompt
Scrie o funcție ajutătoare element_at care returnează elementul de la un index sau None atunci când indexul este în afara intervalului. Apeleaz-o pe cuvintele one, two, three, four, five cu indexul 1 și cu indexul 5 și afișează ambele rezultate.
Ieșire: program Python complet
Element at a position, or None

Elementul de la o poziție sau o valoare de rezervă

element_at_or_else primește o funcție de rezervă. Funcția primește indexul, așa că poate construi un mesaj precum „Valoarea pentru indexul 5 nu este definită”.

Prompt
Scrie o funcție ajutătoare element_at_or_else care returnează elementul de la un index sau rezultatul unei funcții de rezervă care primește indexul. Apeleaz-o pe cuvintele one, two, three, four, five cu indexul 5 și cu o funcție de rezervă care construiește textul "Valoarea pentru indexul 5 nu este definită". Afișează rezultatul.
Ieșire: program Python complet
Element at a position, or a fallback

Obținerea după condiție

Deseori nu cunoști poziția. În schimb, cunoști o condiție: primul cuvânt mai lung de 3 litere, ultimul cuvânt care începe cu „f”. Condiția stă într-o expresie generator, cum ar fi w for w in words if len(w) > 3, care produce doar cuvintele care se potrivesc.

Pentru prima potrivire, transmite generatorul funcției încorporate next(). Aceasta ia prima valoare pe care o produce generatorul și nu se mai uită la restul. Când nimic nu se potrivește, next() generează o eroare StopIteration — doar dacă nu îi dai un al doilea argument, o valoare implicită, care este returnată în schimb.

Nu există o funcție pentru ultima potrivire. reversed() parcurge lista invers, deci next() peste un generator inversat găsește ultima potrivire: prima găsită în timpul parcurgerii inverse este ultima din listă.

Cu None ca valoare implicită, „nimic nu s-a potrivit” este doar un rezultat care is None.

Prima potrivire

next() ia primul cuvânt pe care generatorul îl produce cu len(w) > 3. Acel cuvânt este three.

Prompt
Creează o listă cu cuvintele one, two, three, four, five. Folosește next() cu o expresie generator pentru a găsi primul cuvânt mai lung de 3 litere și afișează acel cuvânt.
Ieșire: program Python complet
First match

Ultima potrivire

Generatorul parcurge reversed(words), deci pornește de la sfârșit. Primul cuvânt întâlnit care începe cu "f" este five, așa că next() îl returnează, iar celelalte cuvinte nu mai sunt verificate.

Prompt
Creează o listă cu cuvintele one, two, three, four, five. Folosește next() peste reversed() pentru a găsi ultimul cuvânt care începe cu "f" și afișează-l.
Ieșire: program Python complet
Last match

Prima potrivire sau None

Niciun cuvânt nu are mai mult de 6 litere, deci next() returnează valoarea implicită None, iar programul afișează „nu a fost găsit”. În lista de numere, primul număr par este 2.

Prompt
Folosește next() cu None ca valoare implicită. În cuvintele one, two, three, four, five caută un cuvânt mai lung de 6 litere și afișează "nu a fost găsit" atunci când rezultatul este None. Apoi caută în numerele 1, 2, 3, 4 primul număr par și afișează-l.
Ieșire: program Python complet
First match, or None

Ultima potrivire sau None

reversed(numbers) parcurge numerele invers. Ultimul număr par este 4 și este găsit imediat.

Prompt
Folosește next() peste reversed() cu None ca valoare implicită pe numerele 1, 2, 3, 4 pentru a găsi ultimul număr par și afișează-l atunci când rezultatul nu este None.
Ieșire: program Python complet
Last match, or None

Obținerea cu un selector

Uneori vrei mai întâi să transformi fiecare element și apoi să iei primul rezultat potrivit.

O funcție selector face transformarea și returnează None pentru rezultatele care nu se potrivesc. map() aplică selectorul fiecărui element, iar next() cu un test is not None ia primul rezultat bun. Lista de aici conține în același timp un număr, un șir și o valoare bool — o listă Python poate amesteca tipuri. str() transformă orice valoare în text.

Prima valoare transformată care se potrivește

Fiecare valoare este transformată în text cu str(). 0 devine "0", care este prea scurt, deci selectorul returnează None. "true" are 4 caractere, deci este primul rezultat care nu este None, iar programul afișează true.

Prompt
Creează o listă care conține 0, șirul "true" și False. Scrie un selector care transformă o valoare în text cu str() și returnează None atunci când textul are mai puțin de 4 caractere. Afișează primul rezultat al selectorului care nu este None.
Ieșire: program Python complet
First converted value that fits

Element aleatoriu

Pentru a alege un element aleatoriu, alege un index aleatoriu. Modulul random oferă numere aleatorii; rng.randrange(n) returnează un număr de la 0 până la n-1, adică exact intervalul indexurilor valide.

Python are și rng.choice(), care alege direct un element. Acest exemplu alege mai întâi un index, ca să-l poți vedea; choice() face același lucru dintr-un singur apel.

Un generator creat cu random.Random(42) pornește de la un seed fix. Cu același seed, programul alege de fiecare dată același element, ceea ce face ieșirea previzibilă — exemplul își inițializează propriul generator cu seed exact din acest motiv. Folosește random.Random() fără seed când vrei un rezultat diferit la fiecare rulare.

Alegerea unui element aleatoriu

Cu seed-ul 42, generatorul alege indexul 0, deci programul afișează 1. Schimbă seed-ul și poate apărea un alt număr.

Prompt
Creează o listă cu numerele 1, 2, 3, 4. Creează un generator aleatoriu cu seed-ul 42 folosind random.Random, alege un index aleatoriu cu randrange și afișează elementul de la acel index.
Ieșire: program Python complet
Pick a random element

Verificarea existenței unui element

Pentru a verifica dacă o valoare este într-o listă, folosește operatorul in. Acesta returnează True sau False.

Python nu are contains_all(). Funcția încorporată all() face asta într-o singură linie: all(v in items for v in wanted) este True doar când fiecare valoare căutată este găsită. Se oprește imediat ce lipsește o valoare.

Python nu are nici is_empty(). Compară lungimea: len(s) == 0 înseamnă gol, len(s) > 0 înseamnă că nu este gol. Varianta specifică Python este și mai scurtă: o listă goală contează ca False într-o condiție, așa că majoritatea codului Python scrie if not words: pentru „gol” și if words: pentru „nu este gol”. Această pagină afișează verificările de lungime, pentru că ele spun exact ce se măsoară.

Conține o valoare

"four" este în listă, deci prima verificare este True. "zero" nu este, deci a doua verificare este False.

Prompt
Creează o listă cu cuvintele one, two, three, four, five. Folosește operatorul in pentru a verifica dacă "four" este în listă și dacă "zero" este în listă. Afișează ambele răspunsuri.
Ieșire: program Python complet
Contains one value

Conține toate valorile

Atât "four", cât și "one" sunt în listă, deci contains_all returnează True. "zero" lipsește, deci al doilea apel returnează False.

Prompt
Scrie o funcție ajutătoare contains_all care returnează True doar atunci când fiecare valoare dintr-o a doua listă se găsește în prima listă, folosind all() și operatorul in. Verifică dacă lista de cuvinte one, two, three, four, five conține four și one, apoi one și zero. Afișează ambele răspunsuri.
Ieșire: program Python complet
Contains all values

Gol sau nu

empty are lungimea 0, deci len(empty) == 0 este True. words are 5 elemente, deci și len(words) > 0 este True.

Prompt
Creează o listă cu cuvintele one, two, three, four, five și o listă goală. Afișează dacă lungimea listei goale este 0, apoi dacă lungimea listei de cuvinte este mai mare decât 0.
Ieșire: program Python complet
Empty or not empty