Когато работите с Python iterables, намирането на броя на елементите, които iterables съдържа, е обичайна операция. Научете как да използвате вградената len на Python, за да намерите дължината на итерируемите елементи и много повече.
Python предлага набор от вградени структури от данни и набор от методи за работа с тях. Освен това има вградени функции, които са полезни при работа с тези структури от данни. Една такава функция е len(), която дава броя на елементите, присъстващи в итерируем.
В този урок ще научим как да използваме функцията len() със списъци, кортежи, низове и др. Ще видим и няколко обичайни случая на употреба.
Да започваме!👩🏫
Съдържание
Синтаксис на функцията len() на Python
Ето синтаксиса за използване на функцията len на Python:
len(iterable)
Както се вижда, функцията len() изисква един параметър, който е всеки валиден итерируем. Итерируемият често е един от списък, кортеж или низ. Но може да бъде и всеки друг валиден тип.
Виждаме, че синтаксисът за използване на функцията len() е супер прост. След това нека продължим с кодирането на няколко примера.
📑 За примерите за код в този урок можете да кодирате заедно в Python REPL.
Използване на функцията len() с Iterables
С последователности
Можете да използвате функцията len(), за да намерите дължината на итерируемите елементи като списъци, кортежи и низове.
Ето един пример:
>>> nums = [9,3,6,1,2] >>> len(nums) 5 >>> nums_tup = (9,3,6,1,2) >>> len(nums_tup) 5
За тези структури от данни, които съхраняват последователност, обикновено ще имате достъп до елементи, като използвате техния индекс или ще получите срез (подпоследователност), ако е необходимо.
С други колекции
Можете също да използвате функцията len() с други колекции на Python като набори и речници.
Тези структури от данни са неподредени колекции. Въпреки че може да не се интересувате от поръчването на артикулите, все пак е полезно да получите общия брой артикули в колекцията.
>>> nums_set = set(nums) >>> len(nums_set) 5 >>> prices = {'Notebook':5,'Pencil case':7,'Bookmarks':3,'Pens':1,'Markers':8} >>> len(prices) 5
Често срещани случаи на употреба на функцията len() на Python
Досега сме виждали прости примери за използване на функцията len() за получаване на броя на елементите в итерируем. Сега нека видим къде можем да използваме това на практика.
#1. Итерация с използване на цикли For
Цикълът for на Python предоставя конструкция за преминаване през итерируеми елементи в for елемент в итерируем синтаксис. Но ако искате да получите достъп до индекса на всеки елемент вместо до самия елемент или до индекса и елементите заедно, можете да използвате функцията range(), както е показано:
>>> nums = [9,2,4,7,8] >>> for i in range(len(nums)): ... print(f"Index {i}: {nums[i]}")
Тъй като range(N) дава последователността от цели числа 0,1,2,…,N – 1, използването на range(len(nums)) ни дава набор от валидни индекси, през които да преминаваме.
# Output Index 0: 9 Index 1: 2 Index 2: 4 Index 3: 7 Index 4: 8
Въпреки това, препоръчителният Pythonic начин за достъп до индекса и елемента е използването на функцията enumerate:
>>> nums = [9,2,4,7,8] >>> for idx,num in enumerate(nums): ... print(f"Index {idx}: {num}")
# Output Index 0: 9 Index 1: 2 Index 2: 4 Index 3: 7 Index 4: 8
#2. Условен цикъл с помощта на цикли while
Да кажем, че имате списък с числа nums. Списъчният метод pop() премахва последния елемент в списъка и го връща.
Докато дължината на списъка nums len(nums) е по-голяма от нула – има поне един елемент, който може да бъде премахнат.
>>> nums = [9,2,4,7,8] >>> while len(nums) > 0: ... nums.pop()
# Output 8 7 4 2 9
Горният пример е по-ясен начин за написване на следното:
>>> nums = [9,2,4,7,8] >>> while nums: ... nums.pop()
while nums: е еквивалентно на условието „докато списъкът nums не е празен“.
#3. Проверка и валидиране на дължината на итералите
Друга често срещана употреба на функцията len е при проверка и валидиране на дължината на определени итерируеми елементи.
Тук проверяваме дали потребителското име е валиден низ въз основа на дължината (изчислена с помощта на функцията len()):
>>> username = "another-random-user" >>> if len(username) > 10: ... print("Username too long; should be 10 characters long at max.") ... elif len(username) < 5: ... print("Username too short; should be at least 5 characters long.") ... else: ... print("Valid username!")
Username too long; should be 10 characters long at max.
#4. Разбиране на списък и речник
Разбиранията в Python предоставят кратък синтаксис за конструиране на нови итерируеми елементи от съществуващи. Можем да използваме вградени функции в израз за разбиране.
Списък разбиране
В това разбиране на списъка ние използваме функцията len(), за да получим дължината на всеки низ в списъка с езици.
>>> languages = ['Python','C','Rust','JavaScript'] >>> len_langs = [len(lang) for lang in languages] >>> len_langs [6, 1, 4, 10]
Разбиране на речника
В това разбиране на речника ние използваме списъка с езици и функцията len(), за да създадем речник:
>>> languages = ['Python','C','Rust','JavaScript'] >>> lang_len = {lang:len(lang) for lang in languages} >>> lang_len {'Python': 6, 'C': 1, 'Rust': 4, 'JavaScript': 10}
Тук ключовете и стойностите са съответно езиковите низове и дължината на езиковите низове.
#5. Ключов параметър в персонализираното сортиране
Python има вградения метод sort() за сортиране на списъците на Python на място и функцията sorted() за сортиране на списъци и други итерируеми елементи.
И в двете можете да използвате ключовия параметър, за да персонализирате сортирането.
Тук сортираме списъка с езици въз основа на дължината на низа.
>>> languages = ['Python','C','Rust','JavaScript'] >>> languages.sort(key=len) >>> languages ['C', 'Rust', 'Python', 'JavaScript']
Във фрагмента по-долу използваме функцията sorted(), за да получим сортиран списък.
>>> languages = ['Hindi','English','German','French'] >>> sorted(languages,key=len) ['Hindi', 'German', 'French', 'English']
В този пример и „немски“, и „френски“ имат по 6 знака. Тъй като функцията sorted() извършва стабилно сортиране, подреждането в оригиналния списък се запазва.
#6. Дължина на масивите NumPy
Можете също да използвате функцията len() с други структури от данни като NumPy масиви.
>>> import numpy as np >>> np_array = np.array([3,4,6,9]) >>> type(np_array) <class 'numpy.ndarray'> >>> len(np_array) 4
В този случай np_array е вектор с 4 елемента. Така len(np_array) връща 4, броя на елементите, присъстващи в масива.
Матрицата е двуизмерен масив.
Помислете за следния пример. len(np_array) е 2, което е броят на редовете.
>>> matrix = [[1,2,3],[4,5,6]] >>> np_array = np.array(matrix) >>> np_array array([[1, 2, 3], [4, 5, 6]]) >>> len(np_array) 2
За да разберем, нека се върнем към матрицата. Имаме структура на вложен списък, където външният списък съдържа два вложени списъка. И функцията len() връща броя на елементите в контейнер (тук това са два списъка):
>>> help(len) Help on built-in function len in module builtins: len(obj, /) Return the number of items in a container.
Въпреки това, когато започнете да работите с многоизмерни масиви, се препоръчва вместо това да използвате атрибута shape.
>>> np_array.shape (2, 3)
Често срещани клопки, които трябва да избягвате, когато използвате функцията len() на Python
За да завършим нашата дискусия, нека да разгледаме някои от често срещаните клопки, които трябва да избягвате, когато използвате функцията len в Python.
Използване на len() с неитерируеми типове данни
Знаем, че функцията len приема само валидни итерируеми като аргумент. Което означава, че ако извикате функцията len с невалиден тип данни, който не може да се повтори, ще попаднете на грешки.
Такива невалидни типове включват основните типове данни като цели числа, числа с плаваща запетая и булеви стойности:
>>> len(2) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: object of type 'int' has no len() >>> len(True) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: object of type 'bool' has no len() >>> len(3.14) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: object of type 'float' has no len()
В Python генераторите са ефективни за паметта избори за случаи на употреба, които изискват генериране на последователност. Генериращият обект връща елементите на последователността – при поискване – един по един елемент. Но генераторните обекти нямат дължина.
Така че ще попаднете на грешки, ако се опитате да изчислите дължината на генераторен обект:
>>> nums_sq = (i*i for i in range(10)) >>> nums_sq <generator object <genexpr> at 0x0157DBC0> >>> len(nums_sq) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: object of type 'generator' has no len()
Използване на len() с кортежи с дължина едно
Ако вмъкнете елемента само в кортеж, Python го интерпретира като единичен елемент, а не като кортеж.
Ето един пример:
>>> nums = (1) >>> len(nums) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: object of type 'int' has no len()
Така че, когато имате кортеж само с един елемент, инициализирайте го в тази форма: име_на_кортеж = (elt, ), така че да се интерпретира като кортеж:
>>> nums = (1,) >>> len(nums) 1
Обобщаване
Ето обобщение на това, което разгледахме в този урок:
- Можете да намерите броя на елементите във всеки итерируем, като използвате функцията len() в Python. Синтаксисът за използване на функцията за дължина е: len(any-valid-iterable).
- Това включва поредици като списъци, кортежи и низове. И други колекции като речници и комплекти.
- Функцията len() обикновено се използва в цикли и разбирания.
- Можете също да използвате функцията len() като ключов параметър, когато трябва да персонализирате сортирането според дължината. Например: сортиране на списък от низове въз основа на тяхната дължина.
След това научете как да използвате функцията sum() на Python.