Найти в Дзене
@coolcoders

Встроенные функции часть 2

Оглавление

Продолжим изучение встроенных функций python

issubclass(class, classinfo)

Возвращает флаг, указывающий на то, является ли указанный класс подклассом указанного класса (классов).

class: Класс, требующий проверки.

classinfo: Класс, либо кортеж с классами. Если аргумент не является классом, либо кортежем с классами, возбуждается TypeError.

Возвращает True, если указанный класс является подклассом указанного класса (классов). Класс считается подклассом самого себя.

Для проверки того, является ли объект экземпляром класса (классов) используйте isinstance.

iter(object[, sentinel])

Возвращает объект итератора.

obj: Объект коллекции, поддерживающей итерирование (реализует __iter__()), либо объект, поддерживающий протокол последовательности (реализует __getitem__(), где аргумент целое, начиная с нуля). Если передан другой объект, возбуждается TypeError.

sentinel: Если этот аргумент предоставлен, то ожидается, что obj содержит объект, поддерживающий вызов. В этом случае, созданный итератор будет вызывать указанный объект (без аргументов) с каждым обращением к своему __next__() и проверять полученное значение на равенство с sentinel. Если полученное значение равно sentinel, возбуждается StopIteration, иначе возвращается полученное значение.

Функция возвращает итератор по объекту, поддерживающему итерирование по его элементам.

Одно из применений sentinel — чтение строк, пока не будет достигнута нужная. Следующий пример считывает файл, пока метод readline() не вернёт пустую строку:

with open('mydata.txt') as fp:
for line in iter(fp.readline, ''):
# Делаем что-либо с line.

Пользовательский тип, определивший __call__():

class MyIterable(object):

def __init__(self):
self.index = 0
self.items = [1, 2, 3, 4]

def __call__(self):
value = self.items[self.index]
self.index += 1
return value

iterator = iter(MyIterable(), 3)

print(next(iterator))
# 1
print(next(iterator))
# 2
print(next(iterator))
# StopIteration

len(s)

Возвращает число элементов в указанном объекте-контейнере.

s: Объект-контайнер, число элементов в котором требуется определить.

Возвращает число элементов в контейнерах: объекте-последовательности (строка, байты, кортеж, список, диапазон) или объекте-коллекции (словарь, множество, неизменяемое множество и пр.).

Пример:

len([1, 2, 'a']) # 3
len({'a': 'aa', 'b': 'bb'})
# 2
len('some')
# 4

Пользовательские типы данных могут определять метод __len__(), значение из которого, будет возвращено при вызове len().

locals()

Возвращает словарь, представляющий текущую локальную таблицу символов.

Обновляет и возвращает словарь с текущей локальной таблицей символов.

Если функция вызвана внутри другой функции, то она возвращает также свободные (объявленные вне функции, но используемые внутри неё) переменные.

def func(one=1):
two = 2
print(locals())

func()

{
'two': 2,
'one': 1
}

Содержимое словаря не следует изменять, потому как изменённые значения могут быть проигнорированы интерпретатором.

Для получения глобальной таблицы символов используйте globals().

map(function, iterable, ...)

Применяет указанную функцию к каждому элементу указанной последовательности/последовательностей.

function: Функция, которую следует применить к элементам последовательности или последовательностей. Должна принимать количество элементов равное количеству последовательностей. До python 3, если передано None, считается что требуется применить тождественное отображение (lambda *args: args), при этом, если передано несколько последовательностей результат будет содержать кортежи с данными из каждой из них.

iterable: Последовательность (или объект, поддерживающий итерирование), к элементам которой требуется применить функцию. Итератор останавливается, когда самая короткая из последовательностей исчерпана. До python 3, если в какой-либо из последовательностей количество элементов меньше, чем в остальных, недостающие элементы считаются None.

def func(el1, el2):
return '%s|%s' % (el1, el2)

# python 2
map(func, [1, 2], [3, 4, 5])
# ['1|3', '2|4', 'None|5']

# python 3
list(map(func, [1, 2], [3, 4, 5]))
# ['1|3', '2|4']

# python 2
dict(map(
None, [1, 2], [3, 4])) # {1: 3, 2: 4}

# python 3
dict(map(
lambda *args: args, [1, 2], [3, 4])) # {1: 3, 2: 4}

max(iterable, *[, key, default])

Возвращает элемент с набольшим значением из переданных в функцию.

iterable: Если указан один позиционный аргумент, то ожидается, что он является итерируемым объектом. Возвращается элемент с максимальным значением, найденный среди элементов этого объекта.

args: Если указано несколько позиционных аргументов, элемент с наибольшим значением разыскивается среди них.

key: Функция, принимающая один аргумент, используемая для упорядочивания элементов в случаях, когда максимальное значение имеют сразу несколько аргументов. Возвращает первый по порядку элемент с максимальным значением.

default: Этим аргументом можно указать значение, которое следует вернуть, если итерируемый объект окажется пустым. Если последовательность пуста и аргумент не указан, возбуждается ValueError.В указанном итерируемом объекте, или среди аргументов, обнаруживает и возвращает элемент с набольшим значением.

Пример:

max('baced') # e
max([10, 20, 3, 54, 18])
# 54
max([])
# ValueError

min(iterable, *[, key, default])

Возвращает элемент с наименьшим значением из переданных в функцию.

iterable: Если указан один позиционный аргумент, то ожидается, что он является итерируемым объектом. Возвращается элемент с минимальным значением, найденный среди элементов этого объекта.

args: Если указано несколько позиционных аргументов, элемент с наименьшим значением разыскивается среди них.

key: Функция, принимающая один аргумент, используемая для упорядочивания (см. также list.sort()) элементов в случаях, когда минимальное значение имеют сразу несколько аргументов. Возвращает первый по порядку элемент с минимальным значением.

default: Этим аргументом можно указать значение, которое следует вернуть, если итерируемый объект окажется пустым. Если последовательность пуста и аргумент не указан, возбуждается ValueError.

В указанном итерируемом объекте, или среди аргументов, обнаруживает и возвращает элемент с наименьшим значением.

Пример:

min('baced') # a
min([10, 20, 3, 54, 18])
# 3
min([])
# ValueError

next(iterator[, default])

Возвращает следующий элемент итератора.

iterator: Объект итератора, возвращающий элементы.

default: Значение, которое должно быть возвращено вместо возбуждения StopIteration, в случае исчерпания элементов при итерации.

Функция вызывает метод __next__() указанного объекта для получения следующего элемента.

При исчерпании элементов, возбуждается исключение StopIteration.

Пример:

def generate():
# Создадим итератор при помощи генератора.
for value in [1, 2]:
yield value

my_generator = generate()

next(my_generator)
# 1
next(my_generator)
# 2
next(my_generator)
# StopIteration

Для создания объекта итератора можно воспользоваться функцией iter().

oct(х)

Возвращает строку с восмеричным представлением указанного целого.

x: Целое, для которого требуется вычислить восмеричное представление. Может быть передан любой объект, реализующий метод __index__() , возвращающий целое.

Пример:

oct(10) # '012'
oct(777)
# '01411'

Если вы хотите преобразовать целое число в восьмеричную строку с
без префикса «0o», то используйте fromat

%#o' % 10, '%o' % 10 # ('0o12', '12')

format(10, '
#o'), format(10, 'o') # ('0o12', '12')

f'
{10:#o}', f'{10:o}' # ('0o12', '12')

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

Открывает файл и возвращает представляющий его объект.

file: Строка или байтовая строка, представляющая путь (абсолютный, либо относительный для текущей рабочей директории) к файлу, который требуется открыть. Либо целое, являющееся дескриптором файла (он будет закрыт при закрытии возвращаемого объекта ввода/вывода, при условии, что closfd установлен в True).

mode=r: Строка, обозначающая режим, в котором следует открыть файл.

buffering=-1: Целое. Политика буферизации. 0 — отключить буферизацию (только для двоичного режима); 1 — построчная буферизация (только для текстового режима); > 1 — размер буфера в байтах. Если не указана, используются политика буферизации по умолчанию (см. ниже).

encoding=None : Имя кодировки для кодирования/декодирования файла. Следует указывать только для текстовых файлов. Если не указана, используется системная кодировка: для определения вызывается locale.getpreferredencoding(False). При чтении и записи двоичных файлов указывать кодировку не следует. Список поддерживаемых кодировок можно найти в модуле codecs.

errors=None : Строка, обозначающая режим, в котором будут обрабатываться ошибки кодирования/декодирования. Следует использовать только для текстовых файлов. В модуле codecs предопределено несколько режимов, пользовательские могут быть зарегистрированы при помощи codecs.register_error().

newline=None : Строка, определяющая режим работы универсальных переводов строк. Следует использовать только для текстовых файлов. Варианты: None, пустая строка, \n, \r, и \r\n. None — при чтении потока будут использованы универсальные переводы строк (\n, \r и \r\n будут преобразованы в \n); при записи — \n преобразуются в разделитель, используемый в системе (os.linesep). Пустая строка — при чтении также используются универсальные переводы строк, однако символы не будут преобразованы в \n; при записи преобразование не происходит. Другие значения — при чтении разбивка на строки осуществляется при помощи значения, преобразование не производится; при записи \n преобразуются в указанное значение.

closefd=True: Флаг необходимости закрытия файлового дескриптора. Используется только, если в file указан дескриптор, иначе возбуждается исключение. Если False, то дескриптор будет оставлен открытым даже после закрытия файла.

opener=None: Пользовательский объект, поддерживающий вызов, который следует использовать для открытия файла. Этот объект получая на входе file и flags, должен возвращать открытый дескриптор файла (возврат os.open и None при этом функционально идентичны).Описание объектов типа file можно найти в одноимённом разделе — file.

Пример:

f = open('myfile.txt', 'r+') # Открываем на чтение и запись.
f.write('0123456789') # Пишем данные в файл.

f.close() # обязательно зарываем файл, чтобы не засорять память python

Если файл не может быть открыт, возбуждается исключение OSError.

Использование оператора with позволяет не вызывать явным образом метод close():

with open('myfile.txt', 'r+') as f: # Открываем на чтение и запись.
f.write('0123456789')
# Пишем данные в файл.

# файл закрывается автоматически

ord(c)

Возвращает числовое представление для указанного символа.

c: Символ, который следует представить в виде целого.

Пример:

ord('a') # 97
ord('\u2020')
# 8224

Возвращает для указанного Юникод-символа целое, представляющее его позицию кода.

pow(base, exp[, mod])

Возвращает результат возведения числа в степень, с опциональным делением по модулю.

base: Число, которое требуется возвести в степень.
exp: Число, являющееся степенью, в которую нужно возвести первый аргумент. Если число отрицательное, аргумент z не принимается.
mod: Число, на которое требуется произвести деление по модулю. Если число указано, ожидается, что x и y положительны и имеют тип int.Ожидаются аргументы численных типов.

Если переданы операнды разных типов, приведение производится по правилам двоичной арифметики.

Случай использования только первых двух аргументов pow(x, y) эквивалентен использованию оператора возведения в степень:
x ** y.

Пример:

pow(2, 3) # 8
pow(10, 2)
# 100

pow(10, -2)
# 0.01

pow(2, 3, 10)
# 8

Для операндов типа int результат тоже является int, исключение составляет случай возведения в отрицательную степень — в этом случае аргументы приводятся к float и возвращается float.

Отправляет указанные объекты текстовым потоком в файл.

*objects : Объекты, которые требуется отправить в файл.

sep="": Строка, которой следует разделить объекты. None — использовать значение по умолчанию. Ожидается, что аргумент будет передан по имени.

end='\n': Строка, которой следует поставить после всех объектов. None — использовать значение по умолчанию. Ожидается, что аргумент будет передан по имени.

file=sys.stdout: Ожидается объект, реализующий метод wrtite(string). Если значение не указано, либо None будет использован sys.stdout. Ожидается, что аргумент будет передан по имени.

flush=False: Если True поток будет сброшен в файл принудительно. Обычно же необходимость буферизации определяется типом файла.

Объекты будут преобразованы в строку по тем же правилам, по которым работает str().

Пример:

print('some')
print('other')

# some
# other

print('one', end='->')
print('two')
# one->two

print(1, 2, 3, sep='!')
# 1!2!3

В связи с тем, что объекты преобразуются в строки, функция не может быть использована с файловыми объектами, находящимися в двоичном режиме. Чтобы вести запись в такие файлы воспользуйтесь file.write().

repr(object)

Возвращает формальное строковое представление указанного объекта.

object: Объект для которого требуется получить формальное строковое представление.Для многих типов функция возвращает строку, которая при передаче в eval() может произвести объект с тем же значением, что и исходный.

В других случаях представление является строкой, обрамлённой угловыми скобками (< и >), содержащей название типа и некую дополнительную информацию, часто — название объекта и его адрес в памяти.

Пример:

class Animal(): pass

repr(Animal())
# <__main__.Animal object at 0x7f3e4c203cc0>
repr('cat-кот')
# 'cat-кот'

reversed(seq)

Возвращает обратный итератор по указанной последовательности.

seq: Объект, поддерживающий протокол последовательности.На вход ожидается объект, поддерживающий следующие методы протокола последовательности:

Пример:

x = [1, 2, 3, 4]
y = list(reversed(x))
# [4, 3, 2, 1]

round(number[, ndigits])

Возвращает число с плавающей запятой, округлённое до указанного количества цифр после запятой.

number: Число, которое требуется округлить.

ndigits: Количество знаков после запятой. Если не указано, то равно 0.

Пользовательский тип данных может определить метод __round__(), чтобы влиять на результат функции.

Для встроенных типов, поддерживающих функцию, значения округляются до ближайшего кратного 10 в степени минус
ndigits; если два кратных одинаково близки, округление производится в сторону чётного. Так, например, и round(0.5) и round(-0.5) равны *0*, но round(1.5) равно *2*.

Для чисел с плавающей запятой результат функции может обескуражить: например, round(2.675, 2) вернёт 2.67 вместо ожидаемого 2.68. Подобное поведение не является ошибкой: это результат того, что большинство десятичных дробей не могут быть точно представлены в виде чисел с плавающей запятой.

setattr(object, name, value)

Добавляет объекту указанный атрибут.

object: Объект, который следует дополнить атрибутом.

name: Строка с именем атрибута. Можно указывать как имя нового, так и существующего атрибута.

value: Произвольное значение атрибута.

Атрибут объекта (свойство, метод, элемент) будет добавлен в случае, если объект разрешает/поддерживает это действие.

Метод зачастую используется в случаях, когда имя атрибута и/или значение заранее неизвестно и содержится в переменной.

Для возвращения атрибута используется getattr().
Для удаления атрибута используется delattr().
Для проверки существования атрибута используется hasattr().

sorted(iterable, *, key=None, reverse=False)

Возвращает новый отсортированный список, составленный из элементов итерирующегося объекта.

iterable: Объект, поддерживающий итерирование, элементы которого требуется упорядочить.

key=None: Ожидается в форме именованного аргумента. Функция, принимающая аргументом элемент, используемая для получения из этого элемента значения для сравнения его с другими. None — сравнить элементы напрямую. Например: key=str.lower.

reverse=False: Ожидается в форме именованного аргумента. Флаг, указывающий следует ли производить сортировку в обратном порядке.

Пример:

my_dict = {'a': 3, 'c': 1, 'b': 2}

# Упорядочим элементы словаря по ключам.
sorted(my_dict.items(), key=
lambda item: item[0]) # [('a', 3), ('b', 2), ('c', 1)]

# Упорядочим элементы словаря по значениям.
sorted(my_dict.items(), key=
lambda item: item[1]) # [('c', 1), ('b', 2), ('a', 3)]

my_dict = {'a': 3, 'c': 1, 'b': 2, '0': 3}

# Упорядочим по значениям и ключам.
sorted(my_dict.items(), key=
lambda item: (item[1], item[0])) # [('c', 1), ('b', 2), ('0', 3), ('a', 3)]

# А теперь по значениям по убыванию и ключам.
sorted(my_dict.items(), key=
lambda item: (-item[1], item[0])) # [('0', 3), ('a', 3), ('b', 2), ('c', 1)]

Сортировка при помощи данной функции является стабильной — гарантирует неизменность расположения равных между собой элементов. Такое поведение полезно при сортировке в несколько проходов (например, сортировка по отделу и уровню заработной платы).

@staticmethod

Представляет указанную функцию статичным методом.

function: Функция, которую следует представить статичным методом. Может использоваться к качестве декоратора.

В статичные методы, в отличие, скажем, от обычных или от @classmethod, не передаётся первый аргумент неявным образом. Статичные методы в Питоне похожи на аналогичные в C++ или Java.

Для объявления статичного метода используйте staticmethod в качестве декоратора:

Пример:

class C:
@staticmethod
def f(arg1, arg2, ...):
pass

Вызывается как через класс — C.f() —, так и через экземпляр — C().f(), при этом данные экземпляра игнорируются, а принимаются во внимание только данные его класса.

Если требуется удобный инструмент для создания альтернативных конструкторов класса, используйте @classmethod.

sum(iterable, /, start=0)

Суммирует элементы указанного объекта и возвращает результат.

iterable: Объект, поддерживающий итерацию по его элементам. Ожидается, что элементы этого объекта являются числами, но не строками. Если объект пуст, функция вернёт начальное значение (start).

start=0: Число, с которого следует начать суммирование.

Пример:

sum([]) # 0
sum([1, 2, 3])
# 6

sum([], 3)
# 3
sum([1, 2], 3)
# 6

super([type[, object-or-type]])

Возвращает объект-посредник (прокси), делегирующий вызовы методов родителю или собрату класса указанного типа.

type: Тип, от которого следует начать поиск объекта-посредника.

obj-or-type: Если не указан, возвращается несвязанный объект-посредник. Если атрибут является объектом, то будет получен посредник для получения метода объекта, для которого isinstance(obj, type) возвращает True. Если атрибут является типом, то будет получен посредник для получения метод класса, для которого issubclass(subtype, type) возвращает True.

Используется для доступа к базовым реализациям наследуемых методов, перекрытых в классе-наследнике.

Порядок поиска метода тот же, что и при getattr(), только type пропускается: тип имеет атрибут __mro__, в котором задаётся порядок поиска методов, используемый как getattr(), так и super(). Атрибут динамический и может изменяться по мере обновления иерархии наследования.

Типичные случаи использования super()

  1. В иерархиях с единичным наследованием используется для обращения к родительским классам, чтобы явно не указывать их имена, это упрощает поддержку кода в дальнейшем. Данный тип использования имеет родственников в других языках программирования.
  2. Второй вариант используется для поддержки совместного множественного наследования в динамическом окружении. Вариант уникален для Питона и отсутствует в языках статически компилируемых или поддерживающих только единичное наследование. Он делает возможным обращение с ромбовидными иерархиями, при которых несколько базовых классов задают реализацию метода с одним и тем же именем. Правила хорошего проектирования требуют того, чтобы во всех случаях метод имел одну и ту же сигнатуру (в связи с тем, что порядок вызовов определяется во время исполнения, потому как он задаётся при изменении иерархии, и потому что в цепи могут присутствовать собратья, неизвестные до момента исполнения).

Пример:

class C(B):
def method(self, arg):
# Python 3
super().method(arg)
# То же, что и для Python 2
super(C, self).method(arg)

Функция реализована как часть процесса связывания в случаях явных разрешений атрибута через точку, таких как super().__getitem__(name). Делается это посредством реализации собственного __getattribute__(), используемого для поиска классов в предсказуемом порядке, принимающем во внимание совместное множественное наследование. Поэтому super() не поддерживает косвенное разрешение с использованием инструкций или операторов, например super()[name].
Заметьте, что использовать функцию с двумя аргументами можно не только в методах.

Без аргументов функция работает только внутри определения класса: необходимые для идентификации класса и доступа к методам его объекта детали заполняет компилятор.

vars([object])

Возвращает словарь из атрибута __dict__ указанного объекта.

object: Объект, для которого следует вернуть словарь атрибутов (__dict__).

Возвращает словарь атрибутов (__dict__) указанного объекта — модуля, класса, экземпляра, и любого другого объекта, имеющего атрибут __dict__.

Следует помнить, что атрибут __dict__ модулей и экземпляров поддерживает изменение, однако другие объекты могут налагать запрет его модификацию (так, например, классы используют прокси для предотвращения прямой модификации этого словаря).

Если функция vars вызвана без аргументов, результат подобен вызову locals().

zip(*iterables)

Возвращает итератор по кортежам, где i-тый кортеж содержит i-тый элемент каждой из указанных последовательностей.

iterables: Итерируемые объекты, элементы которых следует упаковать в кортежи. Если передана одна последовательность, вернётся итератор по кортежам, состоящим из единственного элемента. Если последовательности не переданы, возвращается пустой итератор.

Итератор останавливается, когда исчерпана кратчайшая из последовательностей.

Пример:

list(zip([1, 2, 4], [4, 5], [5, 7])) # [(1, 4, 5), (2, 5, 7)]

Гарантируется вычисление слева направо, что делает возможным следующую идиому кластеризации данных по группам n-длины — zip(*[iter(s)] * n):

seq = [1,2,3,4,5,6]
list(zip(*[iter(seq)] * 2))
# [(1, 2), (3, 4), (5, 6)]
list(zip(*[iter(seq)] * 3))
# [(1, 2, 3), (4, 5, 6)]

В сочетании с оператором * функция может быть использована для распаковки списка:

first, second = zip(*[(1, 4), (2, 5), (3, 6)]) # (1, 2, 3), (4, 5, 6)

Заключение

Пост создан для тг-канала @coolcoders