Vezměte si následující:
items = []
items.append("apple")
items.append("orange")
items.append("banana")
# FAKE METHOD:
items.amount() # Should return 3
Jak zjistím počet prvků v seznamu položek
?
Jak zjistit velikost seznamu?
Chcete-li zjistit velikost seznamu, použijte vestavěnou funkci len
:
items = []
items.append("apple")
items.append("orange")
items.append("banana")
A nyní:
len(items)
návraty 3.
Všechno v Pythonu je objekt, včetně seznamů. Všechny objekty mají v implementaci C nějakou hlavičku.
Seznamy a další podobné vestavěné objekty s "velikostí" mají v Pythonu zejména atribut ob_size
, kde je uložen počet prvků v objektu. Kontrola počtu objektů v seznamu je tedy velmi rychlá.
Pokud však'zjišťujete, zda je velikost seznamu nulová, nebo ne, nepoužívejte len
- místo toho dejte seznam do logického kontextu - v případě prázdného seznamu se považuje za False, v opačném případě za True.
len(s)
Vrátí délku (počet položek) objektu. Argumentem může být posloupnost (například řetězec, bajty, trojice, seznam nebo rozsah) nebo kolekce (například slovník, množina nebo zmrazená množina).
Funkce len
je implementována pomocí __len__
z datového modelu docs:
object.__len__(self)
Volá se pro implementaci vestavěné funkce
len()
. Měla by vracet délku objektu, celé číslo >= 0. Také objekt, který nemá >= 0. definuje metodu__nonzero__()
[v Pythonu 2 nebo__bool__()
v Pythonu 3] a jehož metoda__len__()
vrací nulu. je v booleovském kontextu považována za nepravdivou.
A také vidíme, že __len__
je metoda seznamů:
items.__len__()
vrací 3.
len
(délku)A ve skutečnosti vidíme, že tuto informaci můžeme získat pro všechny popsané typy:
>>> all(hasattr(cls, '__len__') for cls in (str, bytes, tuple, list,
xrange, dict, set, frozenset))
True
len
pro testování prázdného nebo neprázdného seznamuPro testování konkrétní délky samozřejmě stačí testovat rovnost:
if len(items) == required_length:
...
Existuje však speciální případ pro testování nulové délky seznamu nebo jeho inverze. V takovém případě netestujte rovnost.
Rovněž neprovádějte:
if len(items):
...
Místo toho jednoduše proveďte:
if items: # Then we have some items, not empty!
...
nebo
if not items: # Then we have an empty list!
...
I vysvětlit proč zde, ale stručně řečeno, if items
nebo if not items
je jak čitelnější, tak výkonnější.
I když to nemusí být užitečné, protože by to dávalo mnohem větší smysl jako "out of the box" funkce, poměrně jednoduchý hack by bylo vytvořit třídu s vlastností length
:
class slist(list):
@property
def length(self):
return len(self)
Můžete ji použít takto:
>>> l = slist(range(10))
>>> l.length
10
>>> print l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
V podstatě se jedná o naprosto identický objekt jako seznam, navíc s výhodou, že má OOP-friendly vlastnost length
.
Jako vždy se může lišit.