exemple practice
în Python, iterația ne permite să parcurgem o listă de elemente pentru a efectua anumite operații. O modalitate obișnuită de a crea o iterație este utilizarea buclelor for
, care au următorul format general.
for i in iterable:
expression
așa cum am discutat în articolul meu anterior, putem crea iteratoarele noastre personalizate care pot fi utilizate ca iterabile în buclele for
. Pentru a satisface „testarea rață” pentru iteratori, clasa personalizată trebuie să implementeze metodele __iter__()
și __next__()
. Un exemplu specific este prezentat mai jos.
în fragmentul de cod de mai sus, am implementat atât __iter__()
, cât și __next__()
metode care fac instanțele clasei personalizate Cubes
iteratoare, astfel încât instanța a putut fi utilizată într-o buclă for
.
Callables
pe lângă tipul de date încorporat dict
, un alt tip de dicționar important este defaultdict
, Disponibil în modulul collections
. Acest tip de date de tip dicționar are următorul constructor: defaultdict(])
. Mai exact, argumentul default_factory
este un tip de apelabil, cum ar fi o funcție sau o funcție lambda.
în articolul meu anterior, am arătat că putem utiliza defaultdict
prin trecerea unei funcții lambda. Iată exemplul utilizării sale.
>>> from collections import defaultdict
>>> letter_counts = defaultdict(lambda: 0)
>>> for i in 'abcddddeeeee':
... letter_counts += 1
...
>>> letter_counts.items()
dict_items()
în special, putem avea o mai bună flexibilitate pentru a utiliza tipul de date defaultdict
dacă ne creăm propria fabrică implicită. Cu filosofia „duck typing”, clasa personalizată trebuie să implementeze metoda __call__()
, care este de a face ceva apelabil. Să vedem cum funcționează.
așa cum se arată în codul de mai sus, vom crea DucklingFactory
clasa, a cărui __call__()
funcția returnează o listă de o Duckling
instanță. Folosind această funcție din fabrică, vom putea face numărul dorit de rațe înmulțind lista implicită de rațe.
sortare cu Len ()
o altă utilizare posibilă a tastării rațelor este implementarea funcției personalizate len()
, care poate fi utilizată la sortarea unei liste folosind funcția sort()
. Ca o notă laterală, unii oameni se referă la funcția len()
ca o funcție magică, deoarece este implementată apelând funcția __len__()
din spatele scenei (acele funcții cu subliniere duble ca prefix și sufix sunt numite funcții magice).
să presupunem că dorim să sortăm o listă de rațe pe baza lungimii numelui fiecărei rațe. Iată cum putem aplica tastarea rață în acest caz.
în fragmentul de cod de mai sus, clasa personalizată NamedDuck
implementează funcțiile __str__()
și __len__()
, care ne permit să folosim funcțiile str()
și len()
pe instanțele sale din liniile 10 și, respectiv, 12. Important, după cum puteți vedea, deși lista este amestecată cu rațe și șiruri numite, toate elementele pot apela funcțiile str()
și len()
, astfel încât lista poate fi sortată folosind len()
ca cheie și utilizată în înțelegerea listei atunci când dorim să tipărim rezultatul sortat.
astfel, implicația mai largă a acestei utilizări este că, atunci când avem o listă mixtă de elemente de diferite tipuri de date, atâta timp cât fiecare tip de date implementează aceleași funcții, elementele vor trece testarea rață și să fie aplicate cu operațiunile corespunzătoare. Iată un exemplu de caz de utilizare generală folosind funcția len () pe o listă mixtă de tipuri de date de str
, tuple
și list
.
>>> mixed_list = ]
>>> mixed_list.sort(key=len)
>>> mixed_list
, (1, 2), 'Amazing']