Функции встроенные в Python: применение и особенности
В языке Python существует множество встроенных функций, доступных без импорта дополнительных модулей. Они обеспечивают базовые операции: от вывода информации до сложной обработки последовательностей. Ниже рассмотрены наиболее полезные из них, включая их комбинированное применение.
Основные стандартные функции и их комбинации
Как эффективно обработать список чисел: отфильтровать чётные, возвести в квадрат и отсортировать по убыванию?
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
result = sorted(map(lambda x: x**2, filter(lambda x: x % 2 == 0, numbers)), reverse=True)
print(result)стандартные функции языка python (стандартные функции python)
[100, 64, 36, 16, 4]
В этом примере используются три встроенные функции: filter отбирает чётные числа, map возводит их в квадрат, а sorted с параметром reverse=True сортирует по убыванию. Такой подход компактен и читаем.
Типичные ошибки: забыть преобразовать результат map или filter в список (в Python 3 они возвращают итераторы). При необходимости многократного использования следует обернуть в list().
Как узнать длину строки или другого контейнера?
text = "Привет, мир!"
print(len(text))
data = [1, 2, 3, 4, 5]
print(len(data))
empty_dict = {}
print(len(empty_dict))
12 5 0
Функция len возвращает количество элементов. Она работает для всех типов, поддерживающих протокол __len__.
Типичные ошибки: попытка применить len к генератору или итератору, у которых длина не определена (вызовет TypeError). Для получения длины итератора его сначала нужно преобразовать в список.
Как перебрать элементы с индексами без ручного счётчика?
fruits = ["яблоко", "банан", "киви"]
for index, fruit in enumerate(fruits):
print(index, fruit)
# также с начальным индексом
for i, f in enumerate(fruits, start=1):
print(i, f)
0 яблоко 1 банан 2 киви 1 яблоко 2 банан 3 киви
enumerate возвращает пары (индекс, элемент). Функция range полезна для генерации числовых последовательностей, например range(10) создаёт числа от 0 до 9.
Типичные ошибки: забыть, что range не включает верхнюю границу. Также enumerate возвращает итератор, поэтому его можно обойти только один раз.
Как проверить, что все элементы последовательности удовлетворяют условию?
nums = [2, 4, 6, 8]
print(all(x % 2 == 0 for x in nums)) # все чётные?
nums2 = [2, 3, 6]
print(any(x % 2 == 0 for x in nums2)) # хотя бы один чётный?
True True
all возвращает True, если все элементы итератора истинны (в логическом контексте). any возвращает True, если хотя бы один элемент истинен. Часто используются с генераторными выражениями для краткой проверки.
Типичные ошибки: передать пустой итератор: all([]) вернёт True, any([]) вернёт False. Это важно учитывать в логике.
Как преобразовать строку с числами в список целых чисел?
str_numbers = "1 2 3 4 5"
int_list = list(map(int, str_numbers.split()))
print(int_list)
[1, 2, 3, 4, 5]
map применяет функцию int к каждому элементу, полученному после split(). Обёртка list() материализует итератор.
Типичные ошибки: если в строке встречаются нечисловые символы, int вызовет ValueError. Следует предусмотреть обработку ошибок или использовать try/except.
Как объединить списки в словарь, используя ключи и значения из разных списков?
keys = ["a", "b", "c"]
values = [1, 2, 3]
d = dict(zip(keys, values))
print(d)
{'a': 1, 'b': 2, 'c': 3}
zip собирает элементы из нескольких итераторов в кортежи, а dict преобразует пары ключ-значение в словарь.
Типичные ошибки: если списки разной длины, zip обрежет до самого короткого. Для сохранения всех элементов используйте itertools.zip_longest.
Как динамически обратиться к атрибуту объекта по его имени?
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p = Person("Анна", 30)
attr_name = "name"
print(getattr(p, attr_name))
# установка атрибута
setattr(p, "city", "Москва")
print(hasattr(p, "city"))
Анна True
getattr получает значение атрибута, setattr устанавливает, hasattr проверяет существование. Это удобно для метапрограммирования.
Типичные ошибки: если атрибут не существует, getattr по умолчанию выбрасывает AttributeError. Можно указать значение по умолчанию: getattr(obj, attr, default).
Расширенные примеры использования встроенных функций
Пример 1. Функция map с несколькими итераторами.
a = [1, 2, 3]
b = [10, 20, 30]
c = [100, 200, 300]
result = list(map(lambda x, y, z: x + y + z, a, b, c))
print(result)
[111, 222, 333]
map принимает несколько итераторов и передаёт соответствующие элементы в функцию. Остановка происходит по самому короткому итератору.
Пример 2. Использование filter с None для удаления ложных элементов.
mixed = [0, 1, False, 2, '', 'hello', None]
cleaned = list(filter(None, mixed))
print(cleaned)
[1, 2, 'hello']
Если первым аргументом filter передать None, то функция отсекает все значения, которые в логическом контексте равны False.
Пример 3. Сортировка строк по пользовательскому ключу.
words = ['яблоко', 'банан', 'киви', 'апельсин']
sorted_words = sorted(words, key=lambda s: len(s))
print(sorted_words)
# Сортировка по последней букве
sorted_words2 = sorted(words, key=lambda s: s[-1])
print(sorted_words2)
['киви', 'банан', 'яблоко', 'апельсин'] ['банан', 'киви', 'апельсин', 'яблоко']
Аргумент key определяет функцию, вычисляющую значение для сравнения. Это позволяет гибко сортировать данные.
Пример 4. Объединение нескольких списков в список кортежей с помощью zip и распаковка в обратную операцию.
names = ['Иван', 'Мария', 'Пётр']
ages = [25, 30, 28]
cities = ['Москва', 'Санкт-Петербург', 'Казань']
combined = list(zip(names, ages, cities))
print(combined)
# Обратная операция: распаковка списка кортежей
names2, ages2, cities2 = zip(*combined)
print(names2, ages2, cities2)
[('Иван', 25, 'Москва'), ('Мария', 30, 'Санкт-Петербург'), ('Пётр', 28, 'Казань')]
('Иван', 'Мария', 'Пётр') (25, 30, 28) ('Москва', 'Санкт-Петербург', 'Казань')
Оператор * распаковывает список кортежей в аргументы для zip, что позволяет выполнить обратное преобразование.
Пример 5. Динамическое выполнение кода с помощью eval и exec (с осторожностью).
expr = "2 + 3 * 4"
result = eval(expr)
print(result)
code = """
def greet(name):
return f'Привет, {name}!'
print(greet('Мир'))
"""
exec(code)
14 Привет, Мир!
eval вычисляет одно выражение и возвращает результат. exec выполняет произвольный код Python. Эти функции опасны при работе с непроверенным вводом.
Пример 6. Использование property для создания вычисляемых атрибутов.
class Circle:
def __init__(self, radius):
self._radius = radius
@property
def area(self):
return 3.14159 * self._radius ** 2
@property
def radius(self):
return self._radius
@radius.setter
def radius(self, value):
if value <= 0:
raise ValueError("Радиус должен быть положительным")
self._radius = value
c = Circle(5)
print(c.area)
c.radius = 10
print(c.area)
78.53975 314.159
Декоратор @property превращает метод в атрибут, доступный для чтения. Сеттер позволяет контролировать присваивание.