Как использовать и исправить named tuple в Python?
Напишите Python-код с помощью named tuple
Создание классов Tuple-подобных с помощью named tuple()
Named tuple - это класс, предоставляемый модулем collections в Python, который позволяет создавать неизменяемые типы последовательностей с возможностью обращаться к их значениям с использованием понятных имен полей и с помощью точечной нотации вместо неясных целочисленных индексов.
{% highlight python %} from collections import namedtuple
Создайте класс Person с полями name и age
Person = namedtuple(“Person”, [“name”, “age”])
Создайте экземпляр класса Person
person = Person(“John”, 30)
Обратитесь к значениям полей экземпляра класса с помощью точечной нотации
print(person.name) # Вывод: John print(person.age) # Вывод: 30 {% endhighlight %}
В приведенном выше примере мы создали класс Person с полями name и age. Затем мы создали экземпляр класса Person и обратились к значениям полей с помощью точечной нотации. Выводом на экран будет имя “John” и возраст “30”.
Использование дополнительных функций классов named tuple
Named tuple предоставляет несколько полезных функций, которые могут быть полезны при работе с классами. Рассмотрим некоторые из них.
Создание экземпляров классов named tuple из итерируемых объектов
{% highlight python %} from collections import namedtuple
Создайте класс Point с полями x и y
Point = namedtuple(“Point”, [“x”, “y”])
Создайте список итерируемых объектов
data = [(1, 2), (3, 4), (5, 6)]
Создайте список экземпляров класса Point из списка итерируемых объектов
points = [Point(*d) for d in data]
Выведите созданные экземпляры класса Point
for point in points: print(point) {% endhighlight %}
В этом примере мы создали класс Point с полями x и y. Затем мы создали список итерируемых объектов, содержащих координаты точек. С помощью спискового включения мы создали список экземпляров класса Point из списка итерируемых объектов. Затем мы вывели на экран созданные экземпляры класса Point.
Выходные данные на экране будут следующими:
Преобразование экземпляров классов named tuple в словари
{% highlight python %} from collections import namedtuple
Создайте класс Point с полями x и y
Point = namedtuple(“Point”, [“x”, “y”])
Создайте экземпляр класса Point
point = Point(1, 2)
Преобразуйте экземпляр класса Point в словарь
point_dict = point._asdict()
Выведите преобразованный словарь
print(point_dict) {% endhighlight %}
В этом примере мы создали класс Point с полями x и y. Затем мы создали экземпляр класса Point с координатами (1, 2). Затем мы преобразовали экземпляр класса Point в словарь с помощью метода _asdict()
. Затем мы вывели на экран преобразованный словарь.
Выходные данные на экране будут следующими:
Замена полей в существующих экземплярах классов named tuple
{% highlight python %} from collections import namedtuple
Создайте класс Point с полями x и y
Point = namedtuple(“Point”, [“x”, “y”])
Создайте экземпляр класса Point
point = Point(1, 2)
Замените поле x на новое значение
point = point._replace(x=3)
Выведите замененный экземпляр класса Point
print(point) {% endhighlight %}
В этом примере мы создали класс Point с полями x и y. Затем мы создали экземпляр класса Point с координатами (1, 2). Затем мы заменили значение поля x на новое значение, используя метод _replace()
. Затем мы вывели на экран замененный экземпляр класса Point.
Выходные данные на экране будут следующими:
Написание Pythonic-кода с помощью named tuple
Named tuple позволяет создавать Pythonic-код, который делает ваш код более читаемым и понятным. Рассмотрим некоторые примеры.
Использование имен полей вместо индексов
{% highlight python %} from collections import namedtuple
Создайте класс Point с полями x и y
Point = namedtuple(“Point”, [“x”, “y”])
Создайте экземпляр класса Point
point = Point(1, 2)
Обратитесь к полям с использованием имен вместо индексов
print(point.x) # Вывод: 1 print(point.y) # Вывод: 2 {% endhighlight %}
В этом примере мы создали класс Point с полями x и y. Затем мы создали экземпляр класса Point и обратились к значениям полей с использованием имен полей вместо индексов. Выводом на экран будет значение x “1” и значение y “2”.
Возврат нескольких именованных значений из функций
{% highlight python %} from collections import namedtuple
Создайте класс Person с полями name и age
Person = namedtuple(“Person”, [“name”, “age”])
Определите функцию, которая возвращает экземпляр класса Person
def get_person(): return Person(“John”, 30)
Вызовите функцию и получите именованные значения name и age
person = get_person() print(person.name) # Вывод: John print(person.age) # Вывод: 30 {% endhighlight %}
В этом примере мы создали класс Person с полями name и age. Затем мы определили функцию get_person()
, которая возвращает экземпляр класса Person. Затем мы вызываем функцию get_person()
и получаем именованные значения name и age. Выводом на экран будет имя “John” и возраст “30”.
Уменьшение количества аргументов функций
{% highlight python %} from collections import namedtuple
Создайте класс Point с полями x и y
Point = namedtuple(“Point”, [“x”, “y”])
Определите функцию, которая принимает экземпляр класса Point в качестве аргумента
def calculate_distance(point): return (point.x ** 2 + point.y ** 2) ** 0.5
Создайте экземпляр класса Point
point = Point(3, 4)
Вызовите функцию и передайте экземпляр класса Point в качестве аргумента
distance = calculate_distance(point) print(distance) # Вывод: 5.0 {% endhighlight %}
В этом примере мы создали класс Point с полями x и y. Затем мы определили функцию calculate_distance()
, которая принимает экземпляр класса Point в качестве аргумента и вычисляет расстояние от начала координат до точки. Затем мы создаем экземпляр класса Point со значениями x = 3 и y = 4. После этого мы вызываем функцию calculate_distance()
и передаем экземпляр класса Point в качестве аргумента. Выводом на экран будет расстояние “5.0”.
Чтение табличных данных из файлов и баз данных
{% highlight python %} from collections import namedtuple
Создайте класс Person с полями name и age
Person = namedtuple(“Person”, [“name”, “age”])
Определите функцию, которая читает данные из файла
def read_data_from_file(filename): data = [] with open(filename, “r”) as file: for line in file: name, age = line.strip().split(”,”) person = Person(name, int(age)) data.append(person) return data
Вызовите функцию и передайте имя файла в качестве аргумента
filename = “data.csv” data = read_data_from_file(filename) for person in data: print(f”Name: {person.name}, Age: {person.age}”) {% endhighlight %}
В этом примере мы создали класс Person с полями name и age. Затем мы определили функцию read_data_from_file()
, которая считывает данные из файла data.csv
. Файл содержит строки с именем и возрастом, разделенными запятыми. Мы используем метод split(",")
для разделения строк на имена и возраст. Затем мы создаем экземпляр класса Person для каждой строки и добавляем его в список данных. После этого мы выводим каждого человека в списке данных.
Выходные данные на экране будут такими:
Использование named tuple по сравнению с другими структурами данных
Named tuple предоставляет удобные возможности для работы с данными, но иногда вам может потребоваться использовать другие структуры данных. Рассмотрим некоторые особенности использования named tuple по сравнению с другими структурами данных.
named tuple по сравнению с словарем
Named tuple предоставляет удобный и компактный способ хранения и доступа к данным, но его значения не могут быть изменены, так как named tuple является неизменяемой структурой данных. Если вам нужно изменить значения полей, вы должны создать новый экземпляр класса с новыми значениями. С другой стороны, словари позволяют динамически изменять значения ключей.
Named tuple преимущественно используется для хранения данных, которые не должны изменяться, например, координаты точек или результаты выполнения функции.
named tuple по сравнению с Data Class
Data Class - это класс, предоставляемый модулем dataclasses, который предоставляет удобные возможности для работы с данными. Data Class имеет сходную функциональность с named tuple, но Data Class более гибок и дает возможность определять различные атрибуты, методы и декораторы класса.
Если у вас есть сложные данные, которым требуется больше функциональности и поведения, то Data Class может быть лучшим вариантом. Однако, если у вас есть простые данные, которые нужно хранить и обрабатывать, named tuple может быть простым и эффективным решением.
named tuple по сравнению с typing.NamedTuple
Модуль typing предоставляет класс NamedTuple, который позволяет определять аннотированные типы для named tuple. По сравнению с обычными named tuple, класс NamedTuple предоставляет статическую типизацию и возможность определения типов для полей.
Если вам нужна статическая типизация или возможность определения типов для полей, класс NamedTuple может быть полезным. Однако, если вам нужно простое и легкое решение без статической типизации, обычный named tuple может быть предпочтительным вариантом.
Подклассирование классов named tuple
Помимо использования обычных named tuple, вы также можете подклассировать их для предоставления новых функций и возможностей. Подклассирование named tuple дает вам возможность настройки классов для конкретных случаев использования.
{% highlight python %} from collections import namedtuple
Создайте класс Point с полями x и y, подклассированный от named tuple
class Point(namedtuple(“Point”, [“x”, “y”])): def new(cls, x, y): # Добавьте пользовательскую логику при создании экземпляра класса # …
Создайте экземпляр класса Point и вызовите пользовательский метод
point = Point(3, 4) distance = point.distance_to_origin() print(distance) {% endhighlight %}
В этом примере мы создали класс Point, который подклассирован от named tuple. Мы переопределили метод __new__()
для добавления пользовательской логики при создании экземпляра класса. У нас есть также пользовательский метод distance_to_origin()
, который выполняет свою логику.
Вы можете подклассировать named tuple и добавлять любую пользовательскую логику или методы, которые вам нужны для конкретного случая использования. Это дает максимальную гибкость при работе с данными.
Сравнение времени создания: tuple vs named tuple
Named tuple - это более гибкая и удобная альтернатива обычным кортежам, но создание named tuple может занять больше времени по сравнению с созданием обычного кортежа. Время создания named tuple зависит от сложности класса и числа полей.
Однако, разница во времени создания между обычными кортежами и named tuple обычно незначительная и не должна быть проблемой, если вы используете named tuple для хранения данных и доступа к ним.
Заключение
В этом руководстве вы узнали, как использовать named tuple для написания Python-кода с использованием именованных значений полей вместо неясных индексов. Вы также изучили некоторые полезные функции named tuple и способы использования named tuple для написания Pythonic-кода. Вы сравнили named tuple с другими структурами данных и узнали, как подклассифицировать named tuple для предоставления новых возможностей. Вы также рассмотрели вопрос времени создания для named tuple и обычных кортежей.
Надеемся, что эта статья поможет вам лучше понять и использовать named tuple в ваших проектах на Python.