Архив метки: Python

Использование функций super в Python

Хотя Python не является строго объектно-ориентированным языком программирования, он достаточно силен и гибок, чтобы позволить вам использовать объектно-ориентированную модель для создания ваших программ. Python частично выполняет это, разрешая наследование, которое он обеспечивает через super(). Встроенный super() создает суррогатный объект (временный объект суперкласса), который мы можем использовать для доступа к функциям базового класса. Кроме того, метод super() предоставляет право на использование функций и атрибутов родительского или родственного класса. Работа с одновременным наследованием помогает нам избежать прямого использования имени родительского класса. В этой статье вы узнаете, как вторгнуться в суперкласс с помощью метода super().

 

Синтаксис:

super()

 

Установка Python:

Перед реализацией примеров Python у нас должен быть установлен пакет Python в нашей системе Ubuntu 20.04 Linux. Итак, войдите в систему из системы Linux и быстро откройте оболочку терминала с помощью «Ctrl + Alt + T». Но сначала мы должны проверить, какая версия Python уже установлена ​​в нашей системе. И для этого попробуйте запрос ниже. Как видите, теперь отображается последняя версия Python.

$ python3 --version

 

Узнав об этом, нам нужно сначала обновить наш репозиторий apt. Следовательно, попробуйте следующий запрос для обновления системы Linux:

$ sudo apt update

 

Через пакет PPA добавьте несколько дополнительных пакетов для Python:

$ sudo add-apt-repository ppa:deadsnakes/ppa

 

Нажмите клавишу Enter, чтобы продолжить.

Пришло время установить последнюю версию Python в нашу систему Linux. Итак, попробуйте следующую инструкцию в консольной оболочке и нажмите клавишу Enter :

$ sudo apt install python3.9

 

Нажмите «Y», чтобы продолжить процесс установки, в противном случае нажмите клавишу «n», чтобы остановить его.

После установки обновленной версии Python пришло время установить репозиторий pip для использования Python в нашей системе. Прежде всего, нам нужно проверить, установлен он уже или нет. Для этого давайте проверим версию пакета pip с помощью инструкции, показанной ниже. Вывод показывает, что в нашей системе не установлен pip.

$ pip --version

 

Чтобы установить последнюю версию pip, нам понадобится пакет curl в нашей системе Linux. Итак, установите его с помощью следующего запроса:

$ sudo apt install curl

 

Загрузите пакет pip с помощью curl в консоли следующим образом:

$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py

 

Проверьте список всех пакетов, начиная с ключевого слова «get».

$ ls get*

 

Теперь запустите пакет «get-pip.py», только что загруженный в систему с помощью запроса sudo. Установка может занять некоторое время.

$ sudo python3.9 get-pip.py

 

Приведенный ниже вывод показывает, что последняя версия пакета была установлена ​​эффективно.

Теперь вы можете проверить версию репозитория pip с помощью инструкции ниже:

$ pip3.9 --version

 

Супер пример 01:

Наконец, мы рассмотрим мини-пример суперфункции в Python. Итак, прежде всего, нам нужно создать файл расширения «py» из оболочки командной строки. Поэтому мы будем использовать следующий сенсорный запрос в оболочке вместе с именем файла как «one.py»:

$ touch one.py

 

Теперь откройте домашний каталог вашей системы из проводника. Вы найдете там файл «one.py». Откройте этот файл и добавьте к нему скрипт Python. Давайте сначала познакомимся с этим кодом. В самом начале мы создали родительский класс с именем «Animal» с конструктором в нем. Этот конструктор печатает имя любого животного и текст строки, который будет передан ему в параметре в ближайшем будущем. После этого мы создали два дочерних класса: «Bird» и «Other». Оба дочерних класса имеют в своем теле конструкторы, которые печатают некоторые операторы. Эти конструкторы вызывают инструктор суперкласса, передавая ему свое дочернее имя в качестве значения параметра. Из-за этого конструктор родительского класса будет запускаться и печатать инструкцию в своем теле вместе с именем дочернего класса. Объекты b1 и c1 использовались для вызова дочерних классов соответственно.

#!/usr/bin/env python3

class Animal(object):

def

init__(self, name):

print(name, 'это может быть любое животное. ')class Birds(Animal):

def init__(self):

print('У птиц есть перья. )

super().__init__('Birds')



class Other(Animal):

def __init__(self):

print('У животных четыре ноги.')

super().__init__('Other')



b1 = Birds()

o1 = Other()




Давайте выполним файл сценария Python, чтобы увидеть вывод кода. Для выполнения напишите в оболочке следующую инструкцию, перед которой стоит ключевое слово python3 вместе с именем файла «one.py». Приведенные ниже выходные данные указывают на первую строку из дочернего класса «Birds» и вторую строку из суперкласса «Animal». Третья строка указывает инструкцию из дочернего класса «Other», а четвертая строка — из суперкласса «Animal». И вторая, и четвертая строки содержат первое слово из значений параметров, переданных из дочерних классов.

$ python3 one.py

 

Супер пример 02:

Откройте тот же файл one.py и обновите код , добавив в него следующий код. Этот код содержит один родительский класс как «Human» и один дочерний класс как «Child». У родительского класса «Human» есть конструктор, устанавливающий прямые значения возраста, роста и цвета. Хотя у дочернего класса есть конструктор с одним дополнительным параметром, «name», он вызывает конструктор суперкласса для установки значений. Этот конструктор дочернего класса устанавливал переменную «name». Объект c1 используется для передачи значений в параметре конструктора дочернего класса. После этого четыре оператора печати использовались для печати значений всех параметров.

#!/usr/bin/env python3

class Human():

  def __init__(self, age, height, color):

    self. age = age

    self. height = height

    self. color = color





class Child(Human):

  def init__(self, age, height, color, name):

    super().__init__(age, height, color)

    self. name = name





c1 = Child(40, '70', 'white', 'AndreyEx')

print('Ребенку: ', c1. age, years')

print('Этот ребенок имеет рост: ', c1. height, inches.

print('Цвет ребенка: ', c1. color)

print('Это имя ребенка: ', c1. name)

 

Выполним файл с ключевым словом «python3» и именем файла «one.py». Попробуйте запрос ниже и нажмите кнопку «Enter». Вывод показывает четыре оператора печати, определенных вне обоих классов, например, child и parent. Нет проблем, если вы объявляете переменную в родительском или дочернем классе.

 

Заключение:

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



2021-06-19T20:41:23
Python

Как поймать все исключения в Python

Программисты часто классифицируют исключения как ошибки кода, которые приводят к ошибкам при каждом выполнении программы. Исключения представляют собой ошибки, возникающие в результате выполнения сценария. Некоторые программисты до сих пор не видят разницы между ошибками и исключениями. Большинство таких ошибок кажутся логичными. В Python исключения перехватываются с использованием простой логики. Каждый раз, когда интерпретатор Python обнаруживает исключение, он завершает рабочий процесс. Это решается путем выполнения процедуры вызова. Если этого не сделать, программа выйдет из строя. Чтобы различать ошибки и исключения, необходимо рассмотреть две категории ошибок:

  • Синтаксические ошибки
  • Логические ошибки (исключения)

 

Синтаксическая ошибка

Чтобы увидеть, как работают логические ошибки, мы должны сначала рассмотреть пример синтаксической ошибки. Откройте терминал оболочки, используя «Ctrl + Alt + T» на клавиатуре. После открытия оболочки мы создадим новый файл python. Чтобы создать файл, напишите нижеприведенный запрос, показанный на изображении, как есть.

$ touch test.py

 

Давайте откроем файл «test.py» из вашего локального домашнего каталога, дважды нажав на него. После того, как файл был открыт, напишите в нем приведенный ниже код как есть. Сначала вы должны понять этот код. Мы добавили в него поддержку Python. После этого мы инициализировали словарную переменную «age», чтобы добавить два ключа с двумя значениями. Мы не добавляли запятую между обоими ключами. Это будет наша синтаксическая ошибка во время выполнения. После этого мы распечатали ключ «Акса» и его значение из словаря. Сохраните файл с помощью Ctrl + S и нажмите кнопку с крестиком, чтобы выйти из него.

#!/usr/bin/python

ages = {'andreyex':2 'destr':4}

print(f' andreyex is {ages["andreyex"]} years old)

Давайте запустим наш файл по версии python3, как показано ниже. Выходное изображение показывает синтаксическую ошибку, говорящую: недопустимый синтаксис, поскольку в инструкции отсутствует запятая. Как видите, логической ошибки нет.

$ python3 test.py

 

Давайте просто быстро обновим код, добавив в оператор запятую, чтобы предотвратить синтаксические ошибки. Сохраните этот код и закройте его крестиком в правой части окна.

#!/usr/bin/python

ages = { andreyex':2, 'destr':43 }

print(f'andreyex is {ages["andreyex"]} years old')

 

Давайте снова запустим наш файл, чтобы увидеть результат по версии python3. Вывод снимка ниже показывает правильный вывод без синтаксических или логических ошибок.

$ python3 test.py

 

Логические ошибки

Логические ошибки — это те исключения, которые возникают во время выполнения из-за некоторой логической ошибки в нашем коде. В начале этого руководства мы упомянули одновременный захват всех исключений. Но чтобы понять эту концепцию, нам нужно сначала быстро взглянуть на перехват одного исключения за раз. Следовательно, откройте терминал оболочки и преобразуйте его в формат кода python3, чтобы использовать на нем python, используя запрос ниже, как показано на изображении.

$ python3

 

Теперь терминал готов к кодированию. Добавьте какое-нибудь утверждение, которое показывает в нем некоторую логическую ошибку. Допустим, мы добавили «2/0», что невозможно в математике. Таким образом, это должно вызвать некоторую логическую ошибку. Введите его в оболочку и нажмите Enter. Вывод показывает «ZeroDivisionError», потому что все, что делится на ноль, не может вернуть ответ.

>>> 2/0

 

Возьмем еще один пример перехвата единственного исключения на терминале. Откройте файл, который даже не создан или не найден в текущем локальном каталоге Linux, как показано ниже. Он вызовет исключение FileNotFoundError во время выполнения, потому что в нашей системе нет такого файла.

>>> open ( «two.txt» )

 

Пример: Catch-All Exceptions

Ну наконец то! Пришло время собрать все исключения в одном месте. Следовательно, откройте файл python test.py из текущего домашнего каталога системы Linux. Теперь напишите показанный ниже код. Этот код содержит список «l» с разными типами элементов. Мы использовали цикл for, чтобы получить каждое значение из списка и применить к нему оператор try. Оператор try сначала распечатает этот элемент из списка. Следующая строка сначала преобразует этот элемент в целочисленный тип, а затем разделит 1 на этот преобразованный элемент. После этого мы использовали оператор except, который распечатает имя исключения, возникшего из-за оператора try, используя метод sys.esc_info (). Будет напечатана еще одна строка, а затем после оператора «кроме» тело, мы инициализировали оператор печати, чтобы напечатать результат деления, которое было выполнено для проверки оператора. Нажмите Ctrl + S, чтобы сохранить файл, и нажмите кнопку с крестиком, чтобы быстро закрыть его. Теперь откройте терминал, чтобы увидеть, как работает наш код.

#!/usr/bin/python

import sys

l = ['z' , 1e-15, 8]

for result in l:

   try:

      print("В результате получается ", result)

      x = 1/int(result)

      break

   except:

      print("Вао!", sys. exc_info()[0], "occurred.")

      print("Следующее значение, пожалуйста.)

      print()

print("The result of"  result, "is", x)

 

Выполните запрос ниже, чтобы запустить этот файл. Выходные данные показывают результат использования оператора print «Результат» в операторе «try» для каждого элемента списка. Поскольку первые два элемента списка являются строковыми и многотипными переменными, деление не происходит. Это приводит к разным ошибкам. Первый оператор значения «except» был выполнен и показывает имена ошибок с использованием метода sys.exc_info (). В связи с исключением, третий оператор печати из предложения «except» будет выполнен для обоих первых двух элементов списка. Но вы можете видеть в выводе, что результат для третьего значения не вызывает никаких исключений. Это потому, что третий элемент списка является целым числом, и его можно идеально разделить на 1. В этом случае оператор except не выполнялся; таким образом, управление было передано самому внешнему оператору печати.

 

Заключение

В этой статье мы рассмотрели синтаксические и логические ошибки. Наиболее важно то, что в нашей статье мы обсудили метод перехвата всех исключений с помощью метода «sys.exc_info()».



2021-06-19T12:29:46
Python

Программирование сокетов Python

Программирование сокетов — это метод, позволяющий двум узлам в сети взаимодействовать друг с другом. Один сокет (узел) читает с определенного порта по IP-адресу. Между тем, первое с ним связано. Клиент подключается к серверу, и сервер создает сокет аудитора. Это настоящие основы онлайн-серфинга.

Проще говоря, сервер действительно существует, а также клиент. Интеграция пакета сокетов и создание базового сокета — это первые шаги в программировании сокетов. На момент написания этой статьи мы использовали систему Ubuntu 20.04 Linux. Вот несколько примеров программирования сокетов в Python.

 

Пример 01: подключение Socket к Google

В нашем первом примере будет использоваться сокет для подключения к Google. Поэтому перейдите в область приложения и найдите «terminal» в строке поиска, чтобы открыть. Если вам трудно открыть, просто нажмите клавишу «Ctrl + Alt + T», и терминал откроется.

Теперь после открытия терминала нам нужно создать новый файл с поддержкой Python, чтобы добавить в него скрипт Python для программирования сокетов. Следовательно, мы создали файл « test.py » с помощью следующей команды touch:

$ touch test.py

 

Давайте перейдем к домашнему каталогу нашей системы, чтобы открыть только что созданный файл. После того, как вы открыли файл, добавьте в него приведенный ниже скрипт python для подключения сокета к Google. Сначала мы добавили поддержку Python в этот файл. Затем мы импортировали в нее системную библиотеку «sys» и библиотеку «socket». После этого мы использовали оператор try для создания сокета. В 5-й строке мы создали объект для класса сокета, который используется для создания сокета с потоком. Если созданный сокет завершится, он выведет сообщение об успешном завершении. В противном случае будет выполнен оператор except, показывающий сообщение об ошибке создания сокета.

После этого мы создали переменную «port», чтобы присвоить ей значение «80». Другой оператор try использовался для получения IP-адреса хоста, с которым мы подключаем наш сокет, например Google, в нашем случае. Оператор try получает IP-адрес через функцию класса сокета «gethostbyname». Если получение IP-адреса прошло успешно, управление будет передано оператору печати, расположенному за пределами тела try-except, и сообщение об успешном завершении будет отображаться на терминале. С другой стороны, если получение IP-адреса окажется неудачным, он напечатает сообщение об ошибке и завершит процесс. Сохраните файл и оставьте его, чтобы перейти к терминалу.

test.

#!/usr/bin/python3

import socket

import sys

try:

s = socket.socket(socket.AF_INET, socket. SOCK_STREAM) 

print("Сокет успешно создан")

except socket.error as err:

print("создание сокета не удалось с ошибкой %s" %(err))

port = 80

try:

host_ip = socket.gethostbyname('www.google.com')

except socket.gaierror:

print("произошла ошибка при разрешении хоста")

sys.exit()

s.connect((host_ip, port))

print("Сокет успешно подключился к Google")

Давайте запустим этот файл через поддержку python3 в оболочке, как показано ниже. Вы можете видеть, что сокет был успешно подключен к Google, поскольку отображаются сообщения об успешном завершении.

$ python3 test.py

Пример 02: Простое соединение сервер-клиент

Давайте рассмотрим еще один простой пример соединения сервера и клиента друг с другом через программирование сокетов. Давайте сначала создадим новый файл « Server.py » с расширением python в вашем домашнем каталоге с помощью представленной ниже команды.

$ touch Server.py

 

Откройте файл и вставьте в него приведенный ниже код. Этот код сначала импортирует библиотеку сокетов, а затем создает сокет с помощью объекта « s », за которым следует сообщение об успешном завершении. Затем мы упомянули переменную « порт », чтобы добавить номер порта и связать этот номер порта с нашим объектом сокета « s », за которым следует сообщение об успешном связывании. Мы перевели наш сокет в режим прослушивания методом listen . Затем мы создали вечный цикл while, чтобы установить соединение с клиентом с помощью метода accept (), пока мы не прервем его или не произойдет какая-либо ошибка.

Переменная « addr » представляет адрес клиента. Мы объявили переменную « var » с некоторым сообщением для отправки клиенту. Но перед этим мы должны закодировать байтовые символы. Следовательно, мы использовали для этого метод encode (). Мы использовали метод send (), чтобы отправить сообщение клиенту и закрыть соединение. Сохраните файл и нажмите крестик, чтобы выйти из него.

*Server.py

#!/usr/bin/python3

import sockets = socket. socket()

print("Сокет успешно создан")

port = 12345

s.bind(('', port))

print("гнездо, привязанное к %s" %(port))

s. listen(5)

print("сокет слушает")

while True:

c.addr = s.accept()

print('Получил связь от", addr )

var = "Спасибо за подключение"

new = var.encode("ascii")

c.send(new)

c.close()




Проверьте, правильно ли работает и активен наш сервер. Для этого вы запустите файл «Server.py» в терминале командной оболочки следующим образом:

$ python3 Server.py

 

Он успешно создал сокет и правильно его слушает. Теперь, чтобы проверить, работает он или нет, нам нужно подключить его к другому хосту. Следовательно, мы собираемся использовать для этого «telnet».

Откройте другое окно терминала и напишите в нем запрос ниже. Вы увидите, что он подключится к телнету, одновременно показывая вам сообщение «Спасибо за подключение». Это означает, что наш сервер исправен.

$ telnet localhost 12345

 

Вернитесь к серверному терминалу. Вы можете видеть, что это показывает, что ваш сервер получил соединение с какого-то IP-адреса.

Создадим еще один файл для программирования сокетов на стороне клиента, например Client.py, следующим образом:

$ touch Client.py

 

Быстро откройте файл из домашнего каталога и напишите в нем приведенный ниже код без каких-либо различий. Мы импортировали библиотеку сокетов и создали сокет с помощью метода «socket». Порт был упомянут в переменной «порт», и соединение было установлено через объект «s» и метод «connect с указанным портом». Метод recv использовался для получения данных с сервера и их печати с последующим закрытием соединения.

*Client.py

#!/usr/bin/python3

import sockets = socket.socket()

port = 12345

s.connect(('127.0.0.1', port))

print(s.recv(1024))

s.close()




Давайте сначала создадим серверный сокет, и он откроет режим прослушивания сервера следующим образом:

$ python Sevrer.py

 

Теперь запустите файл Client.py, используя запрос ниже. Вы можете видеть, что он выведет сообщение с хоста сервера «Спасибо за подключение».

$ python3 Client.py

 

Вернемся к серверной части. Вы можете видеть, что это показывает, что сервер имеет соединение от клиента.

 

Заключение:

В этой статье мы завершили все важные и необходимые аспекты программирования сокетов. Примеры содержат соединение сокета с Google и другими клиентами.



2021-06-15T12:06:17
Python

Как использовать модуль Counter в Python

В этой статье объясняется, как использовать модуль «Counter», который по умолчанию поставляется с языком программирования Python. Все примеры кода в этой статье протестированы на Python версии 3.9.5 в Ubuntu 21.04.

 

О модуле счетчика

Модуль Counter, как следует из названия, может использоваться для подсчета элементов итерируемого или хешируемого объекта в Python. Counter сохраняет каждый элемент итерируемого объекта (например, объект списка Python) как ключ словаря Python. Поскольку словари в Python допускают только уникальные ключи, повторения нет. Соответствующие значения для ключей этих словарей — это количество или количество раз, когда элемент появляется в итерируемом объекте.

 

Основное использование и синтаксис

Чтобы понять базовое использование и синтаксис класса Counter, взгляните на пример кода ниже:

from collections import Counter



list1 = ["a", "a", "b", "b", "b", "c", "d", "d", "d", "d", "e", "e"]

counts = Counter(list1)

print (counts)

Первый оператор импортирует модуль Counter, чтобы в коде можно было использовать класс Counter. Затем определяется новый объект списка Python с некоторыми данными. Затем создается новый экземпляр объекта Counter путем передачи «list1» в качестве аргумента. Последний оператор печатает вывод объекта «counts».

После выполнения приведенного выше примера кода вы должны получить следующий результат:

Counter({'d': 4, 'b': 3, 'a': 2, 'e': 2, 'c': 1})

Обратите внимание, что выходные данные возвращают объект типа Counter, а не словарь Python. Хотя он ведет себя как словарь Python с одним незначительным отличием, которое объясняется ниже.

 

Объект счетчика ведет себя как объект словаря Python

Словарь в Python — это объект, который хранит элементы в парах «ключ: значение». Ниже приведен пример словаря Python:

dict1 = {"a" : 1, "b" : 2}

Часть перед символом «:» (двоеточие) называется «ключом», а часть после символа двоеточия называется «значением». Вы можете получить доступ к значению любого ключа в словаре Python, используя следующий синтаксис:

dict1 = {"a" : 1, "b" : 2}

print (dict1["a"])

Вам просто нужно указать имя ключа в квадратных скобках «[]». Если ключ не существует в словаре, выдается ошибка KeyError.

Выходные данные приведенного выше примера Counter показывают, что при создании нового экземпляра класса Counter возвращается новый объект типа Counter. Этот объект типа Counter представляет собой не что иное, как словарь Python, за исключением того, что он не генерирует ошибку «KeyError», когда значение ключа отсутствует. Вместо этого он присваивает ему значение «0» (ноль). Вы также можете получить доступ к значениям элементов в объекте Counter, указав имена ключей в квадратных скобках, как и в объекте словаря. Взгляните на пример кода ниже:

from collections import Counter



list1 = ["a", "a", "b", "b", "b", "c", "d", "d", "d", "d", "e", "e"]

counts = Counter(list1)

print (counts["f"])



dict1 = {"a" : 1, "b" : 2}

print (dict1["c"])

После выполнения приведенного выше примера кода вы должны получить следующий результат:

0

Traceback (most recent call last):

File "main.py", line 11, in

print (dict1["c"])

KeyError: 'c'

Как вы можете видеть в выходных данных, когда вы обращаетесь к ключу, которого нет в объекте Counter, возвращается «0» (ноль). С другой стороны, объект словаря Python выдает ошибку «KeyError» при отсутствии ключа.

 

Создание объекта счетчика вручную

Может быть случай, когда вы захотите вручную определить объект Counter вместо анализа итерации, такой как список Python. Чтобы создать объект счетчика, вы можете использовать следующий синтаксис:

from collections import Counter



counter1 = Counter(a=4, b=3)

counter2 = Counter({"a" : 4, "b" : 3})

print (counter1)

print (counter2)

Вы можете использовать синтаксис стиля аргумента, показанный в первом операторе, или использовать синтаксис стиля словаря Python, показанный во втором операторе, для создания новых экземпляров объекта Counter. Оба метода имеют одинаковый эффект и дают одинаковый результат.

После выполнения приведенного выше примера кода вы должны получить следующий результат:

Counter({'a': 4, 'b': 3})

Counter({'a': 4, 'b': 3})

Получение наиболее распространенных элементов из объекта счетчика

Вы можете использовать метод most_common для сортировки элементов и их количества в порядке убывания от объекта типа Counter. Взгляните на пример кода ниже:

from collections import Counter



list1 = ["a", "a", "b", "b", "b", "c", "d", "d", "d", "d", "e", "e"]

counts = Counter(list1)

print (counts.most_common())

Вывод возвращает список кортежей, а не объект словаря Counter или Python.

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

from collections import Counter



list1 = ["a", "a", "b", "b", "b", "c", "d", "d", "d", "d", "e", "e"]

counts = Counter(list1)

print (counts.most_common(2))

После выполнения приведенного выше примера кода вы должны получить следующий результат:

[('d', 4), ('b', 3)]

Другие полезные методы счетчика

Вы можете получить доступ ко всем ключам и значениям объекта Counter, используя методы «keys» и «values» соответственно.

from collections import Counter



list1 = ["a", "a", "b", "b", "b", "c", "d", "d", "d", "d", "e", "e"]

counts = Counter(list1)

print (counts.keys())

print (counts.values())

После выполнения приведенного выше примера кода вы должны получить следующий результат:

dict_keys(['a', 'b', 'c', 'd', 'e'])

dict_values([2, 3, 1, 4, 2])

Эти методы создают итерируемые объекты, чтобы вы могли их перебирать.

Вы можете получить как ключи, так и значения, используя метод «items».

from collections import Counter



list1 = ["a", "a", "b", "b", "b", "c", "d", "d", "d", "d", "e", "e"]

counts = Counter(list1)

print (counts.items())

После выполнения приведенного выше примера кода вы должны получить следующий результат:

dict_items([('a', 2), ('b', 3), ('c', 1), ('d', 4), ('e', 2)])

Вы также можете просмотреть результат, полученный методом «item».

Вы можете преобразовать объект Counter в словарь Python с помощью функции «dict».

from collections import Counter



list1 = ["a", "a", "b", "b", "b", "c", "d", "d", "d", "d", "e", "e"]

counts = Counter(list1)

print (dict(counts))

После выполнения приведенного выше примера кода вы должны получить следующий результат:

{'a': 2, 'b': 3, 'c': 1, 'd': 4, 'e': 2}

Цикл по ключам и значениям объекта счетчика

Вы можете легко просмотреть пары ключ-значение объекта Counter, используя метод «items», описанный выше. Взгляните на пример кода ниже:

from collections import Counter



list1 = ["a", "a", "b", "b", "b", "c", "d", "d", "d", "d", "e", "e"]

counts = Counter(list1)

for key, value in counts.items():

print (key, value)


 

В коде к переменной пары ключей можно получить доступ с помощью переменных «ключ» и «значение» соответственно в цикле «for».

После выполнения приведенного выше примера кода вы должны получить следующий результат:

a 2

b 3

c 1

d 4

e 2

Заключение

Встроенный в Python модуль «Счетчик» обеспечивает быстрый и эффективный способ подсчета количества элементов, хранящихся в объекте итеративного типа. Вы можете использовать метод «most_common» для получения самых верхних пар с наибольшим счетчиком, указав желаемое число в качестве аргумента.



2021-06-12T22:53:03
Python

Использование Namedtuple в Python

Python поставляется со встроенным модулем, называемым коллекциями , который предоставляет различные классы и функции в качестве альтернативы встроенным в Python структурам данных, таким как dict, list, set и tuple.

В этой статье по Python будет обсуждаться namedtuple, одна из фабричных функций модуля collections. Мы рассмотрим все важные концепции Python namedtuple с примерами и синтаксисом.

 

Что такое Namedtuple в Python?

Namedtuple — это функция модуля collections в Python, расширения контейнера данных кортежа Python, которая позволяет нам получать доступ к элементам в кортеже, используя имена или метки. Мы можем определить новый класс кортежа, импортировав namedtuple из модуля коллекций Python и используя фабричную функцию namedtuple(). Короче говоря, именованный кортеж представляет собой комбинацию кортежа Python и типа данных dict.

 

Синтаксис Python Namedtuple

from collections import namedtuple



tuple_name = namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)

Среди 6 атрибутов namedtuple() только два являются обязательными, typename и fields_name, остальные — необязательными.

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

Feild_names атрибут представляет имя метки для элементов кортежа. Это может быть строка, разделенная пробелами «fname lname dept salary» или список строк [‘fname’, ‘lname’, ‘dept’, ‘salary’].

 

Объявление Namedtuple в Python

Теперь давайте начнем с объявления именованного кортежа.

from collections import namedtuple



#Объявление в namedtuple

Employee = namedtuple("Employee", ['fname', 'lname', 'dept', 'salary'])



#Добавление значения в указанном наборе

e1 = Employee('Andrey', 'Ex', 'Marketing', 20000)



#значение доступа с меткой

print("Имя сотрудника e1 is:", e1.fname +" "+ e1.lname) # доступ к значению с использованием значения индекса print("Отдел сотрудника e1 is:", e1[2])

Вывод:

Имя сотрудника e1 is: AndreyEx

Отдел сотрудника e1 is: Marketing

Доступ к элементам из Namedtuple в Python

Есть три способа получить доступ к элементам из именованного кортежа, используя:

  • индекс (как кортеж)
  • имя поля/имя метки (например, словарь)
  • метод getattr()

from collections import namedtuple



#Объявление в namedtuple:

Employee = namedtuple("Employee", ['fname', 'lname', 'dept', 'salary'])



#добавление значения именованного кортежа:

e1 = Employee('Andrey', 'Ex', 'Marketing', 20000) # доступ к значению с использованием значения индекса: 

print("Employee (using index)", e1[0], e1[1], e1[2], e1[3]) 

# Доступ значения с меткой: 

print("Employee (using label)", e1.fname, e1.lname, e1.dept, e1.salary)

 

# Доступ значения используя getattr (): 

print("Employee (using getattr())", getattr(e1,'fname'), getattr(e1,'lname'), getattr(e1,'dept'), getattr(e1,'salary'))

Вывод:

Employee (using index) AndreyEx Marketing 20000

Employee (using label) AndreyEx Marketing 20000

Employee (using getattr()) AndreyEx Marketing 20000

Работа с Python Namedtuple

Именованные кортежи в Python неизменяемы.

Как и обычный кортеж, именованные кортежи также неизменяемы. Это вызовет ошибку, если мы присвоим новое значение существующему номеру индекса или метке.

Пример:

from collections import namedtuple



#Объявление в namedtuple

Employee = namedtuple("Employee", ['fname', 'lname', 'dept', 'salary'])



#add значения в указанном наборе

e1 = Employee('Andrey', 'Ex', 'Marketing', 20000)



e1.fname ="John"   #  ошибка

Вывод:

AttributeError: невозможно установить атрибут

Преобразование именованного кортежа Python в словарь Python Именованный кортеж рассматривается как словарь, потому что каждый элемент именованного кортежа связан с меткой, как в словаре Python.

Чтобы преобразовать именованный кортеж в словарь, мы можем использовать метод ._asdict().

Пример:

From collections import namedtuple



#Объявление в namedtuple

Employee = namedtuple("Employee", ['fname', 'lname', 'dept', 'salary'])



# добавление значения в указанном наборе

e1 = Employee('Andrey', 'Ex', 'Marketing', 20000)



print(e1._asdict())

Вывод:

{'fname': 'Andrey', 'lname': 'Ex', 'dept': 'Marketing', 'salary': 20000}

Создание Namedtuple из объекта Python Iterable

Чтобы преобразовать итеративный объект, такой как кортеж, список, набор и словарь, в namedtuple, мы можем использовать метод namedtuple ._make () .

Пример:

From collections import namedtuple



#Объявление the namedtuple

Employee = namedtuple("Employee", ['fname', 'lname', 'dept', 'salary'])



# список

e1 = ['Alex', 'Terminat', 'Marketing', 20000]

# кортеж

e2 = ('Max', 'Bobikov', 'Marketing', 20000)





print(Employee._make(e1))

print(Employee._make(e2))

Вывод:

Employee(fname='Alex', lname='Terminat', dept='Marketing', salary=20000)

Employee(fname='Max', lname='Bobikov', dept='Marketing', salary=20000)

Преобразование словаря Python в именованный кортеж

Есть два способа преобразовать словарь Python в именованный кортеж.

Мы можем использовать оператор ** или метод словарных значений().

Пример:

From collections import namedtuple



#Объявление the namedtuple

Employee = namedtuple("Employee", ['fname', 'lname', 'dept', 'salary'])



# словарь

e1 ={'fname':'Sonia', 'lname':'Jenner', 'dept':'Management', 'salary':20000}



# с помощью ** operator

print(Employee(**e1))



# с помощью метода ._make()

print(Employee._make(e1.values()))

 

Вывод:

Employee(fname='Sonia', lname='Jenner', dept='Management', salary=20000) Employee(fname='Sonia', lname='Jenner', dept='Management', salary=20000)

Проверить все поля именованного кортежа Python Используя свойство _fields, мы можем все поля именованного кортежа

Пример:

From collections import namedtuple



#Объявление namedtuple

Employee = namedtuple("Employee", ['fname', 'lname', 'dept', 'salary'])



print(Employee._fields)

Вывод:

('fname', 'lname', 'dept', 'salary')

Как изменить значение Namedtuple

Именованный набор неизменяем, и мы не можем изменить значения его атрибутов после объявления. Однако namedtuple предоставляет метод .replace (), который возвращает копию namedtuple с измененным значением атрибута.

Пример:

From collections import namedtuple



#Объявление в namedtuple

Employee = namedtuple("Employee", ['fname', 'lname', 'dept', 'salary'])



# добавьте значения в именованный кортеж

e1 = Employee('Andrey', 'Ex', 'Marketing', 20000)



print(e1._replace(fname='John'))

Вывод:

Employee(fname='John', lname='Ex', dept='Marketing', salary=20000)

Заключение

В заключение этой статьи по Python мы узнали, что называется кортежем в Python и как его объявить. Namedtuple — это комбинация кортежа Python и словаря Python, в котором доступ к элементам осуществляется с помощью как метки (ключа), так и номера индекса. Мы можем использовать namedtuple как обычный контейнер кортежей Python, и они пригодятся, когда мы хотим выполнить хеширование, используя только кортеж.



2021-06-12T18:25:35
Python

Что такое двоичный поиск?

Бинарный поиск — это алгоритм поиска, используемый для поиска целевых элементов в контейнере, где элементы должны быть расположены в порядке возрастания. Обычно двоичный поиск используется для поиска порядкового номера целевого элемента в отсортированном массиве.

В бинарном поиске используется подход «разделяй и властвуй», при котором массив делится на равные части до тех пор, пока не будет найден целевой элемент.

Алгоритм двоичного поиска реализуется как итеративным, так и рекурсивным оператором. Двоичный поиск более эффективен и быстрее по сравнению с линейным поиском.

 

Алгоритм двоичного поиска

  1. Отсортируйте и расположите элементы в массиве arr в порядке возрастания.
  2. Алгоритмы сравнивают средний элемент n с целевым элементом target .
  3. Алгоритм возвращает индекс позиции среднего элемента, если целевой элемент оказывается равным среднему элементу,
  4. Алгоритм ищет нижнюю половину массива, если целевой элемент меньше среднего элемента.
  5. Алгоритм ищет верхнюю половину массива, если целевой элемент больше среднего элемента.
  6. Алгоритм повторяет 4-й и 5-й шаги до тех пор, пока длина массива не станет равной единице или меньше 1.

В конце либо возвращается значение индекса элемента, либо элемент не существует в массиве.

 

Псевдокод двоичного поиска

Итеративный

function Binary_Search(arr, n, target) is

left := 0

right:= n − 1

while left ≤ right do

middle := floor((left + right) / 2)

if arr[middle]  target then

   right := middle − 1

else:

   return middle

return unsuccessful

 

Рекурсивный

function Binary_Search(arr, left, right, target) is



if right >= left

middle = (left+right)//2



if arr[middle] == target

   return middle

else if arr[middle] > tarrget

   return Binary_Search(arr, low, mid-1, target)

else

   return Binary_Search(arr, mid+1, right, target)

else

   return unsuccessful

 

Реализация двоичного поиска в Python

Итеративный

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

def Binary_Search(arr,n, target):

left = 0

right = n-1

middle=0



while left<=right:

middle = (right+left)//2



если средний элемент равен целевому элементу

if arr[middle]==target:

   return middle



#если целевой элемент больше среднего

elif arr[middle]< target:



left = middle+1



# если целевой элемент меньше среднего 



else: right =middle-1 



# если целевой элемент отсутствует в массиве 



return -1 



if __name__ == '__main__': 



# отсортированный массив 



sorted_arr = [0,4,7,10,14,23,45,47,53]



# длина массива 



n = len(sorted_arr) 



# элемент для поиска 



target = 47 



position = Binary_Search(sorted_arr, n,target) 



if position != -1: 

     print(f"Элемент {target} присутствует в индексе {position}") 

else: 

     print(f"Элемент {target} отсутствует в массиве")


 

Вывод

Элемент 47 присутствует в индексе 7

Рекурсивный

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

def Binary_Search(arr,left,right ,target):

  # базовое условие

if righttarget:

   return Binary_Search(arr, left, middle-1, target)

  # если  целевой элемент меньше среднего элемента

else:

   return Binary_Search(arr, middle+1, right, target)







if __name__ == '__main__':

# отсортированный массив

sorted_arr = [0,4,7,10,14,23,45,47,53]



left=0

right = len(sorted_arr)-1



#  элемент для поиска

target = 47



position = Binary_Search(sorted_arr, left, right,target)



if position != -1:

   print(f"Элемент {target} присутствует в индексе {position}")

else :

   print(f"Элемент {target} отсутствует в массиве")

 

Вывод

Элемент 90 отсутствует в массиве

Сложность

Бинарный поиск имеет временную сложность O(log n), где n — количество элементов, присутствующих в массиве.

Бинарный поиск имеет пространственную сложность O(1), потому что в алгоритме мы выполняем поиск на месте.

 

Заключение

Двоичный поиск — один из лучших и эффективных алгоритмов поиска. Временная и пространственная сложность двоичного поиска также очень низкая; единственное предварительное условие для двоичного поиска — входной массив должен быть отсортирован в порядке возрастания.



2021-06-03T16:04:06
Python