Архив метки: 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

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

Значения даты и времени зависят от зоны. Эти значения необходимо изменить для тех приложений Python, которые требуют работы с международными пользователями. Согласно зоне, модуль dateTime Python не может преобразовывать значения даты и времени. Эту проблему можно решить, используя модуль pytz Python. Этот модуль не установлен в Python. Итак, вам необходимо установить этот модуль, прежде чем использовать его в скрипте. В этой статье показано, как модуль pyzt можно установить и использовать в Python.

 

Установите модуль PYZT:

Выполните следующую команду, чтобы установить модуль pyzt, прежде чем практиковаться в примерах этой статьи.

$ pip install pytz

Пример 1: Распечатать все поддерживаемые и часто используемые часовые пояса

Следующий скрипт распечатает все поддерживаемые часовые пояса и широко используемые часовые пояса с помощью модуля pyzy . Модуль pyzt импортируется в начале скрипта. Атрибут pytz.all_timezones возвращает список всех поддерживаемых часовых поясов в виде объекта списка. Атрибут pytz.common_timezones возвращает список всех часто используемых часовых поясов в виде объекта списка. После выполнения этого скрипта будут напечатаны два списка.

# Импортировать модуль pytz

import pytz 



# Распечатать все поддерживаемые часовые пояса

print('Часовые пояса, поддерживаемые модулем pytz: n', pytz.All_timezones, 'n ')



# Распечатать часто используемые часовые пояса

print('Обычно используемые часовые пояса: n', pytz.common_timezones, 'n ')

 

Пример 2: напечатать названия стран

Следующий скрипт распечатает список названий стран с кодами стран и название страны с конкретным кодом страны. Метод pytz.country_names.items() возвращает объект словаря названий стран с кодом страны. Коды стран назначаются в ключах объекта словаря, а названия стран назначаются в значениях объекта словаря. Цикл for используется в сценарии для печати названий стран с кодом страны в каждой строке путем повторения объекта словаря, возвращаемого функцией pytz.country_names.items(). Затем будет напечатано название страны с кодом страны «RU».

# Импортировать модуль pytz

import pytz

'' '

Вывести название страны с кодом страны в каждой строке,

используя цикл for

' ''

print('country_names:')

for key, val in pytz.country_names.items():

print(val, '(', key, ')')



# Распечатать название страны с конкретным кодом страны

print('n Название страны на основе кода страны (RU):', pytz.country_names ['RU'])

 

Пример-3: Распечатать дату и время в зависимости от часового пояса

Значения даты и времени зависят от часового пояса. Следующий скрипт сначала напечатает дату и время текущего часового пояса. Затем часовой пояс будет изменен на US/Eastern с помощью метода pytz.timezone(), а дата и время будут напечатаны на основе US/Eastern часового пояса. Затем часовой пояс будет изменен на часовой пояс Europe/Moscow, а дата и время будут напечатаны в соответствии с часовым поясом Europe/Moscow. Дата и время часовых поясов UTC и IST будут напечатаны позже.

# Импортировать модуль datetime

import datetime as dt



# Импортировать модуль pyzt

import pytz



# Получить текущую дату

source_date = dt.datetime.now()



# Распечатать текущие данные и время

print('Текущая дата и время: n', source_date)



# Установить часовой пояс на US/Eastern

currentTimeZone = pytz.timezone('US/Eastern')



# Вывести текущий часовой пояс Europe/Moscow

print('nЧасовой пояс установлен на: n', currentTimeZone)



# Прочитать и распечатать текущую дату и время часового пояса

currentDateWithTimeZone = currentTimeZone.localize(source_date)

print('Дата и время этого часового пояса: n', currentDateWithTimeZone)



# Установите целевой часовой пояс

newTimeZone = pytz.timezone('Europe/Moscow')

print('n Часовой пояс установлен на: n',newTimeZone)



# Прочитать и распечатать текущую дату и время нового часового пояса

newDateWithTimezone = currentDateWithTimeZone.astimezone(newTimeZone)

print('Дата и время этого часового пояса: n', newDateWithTimezone)



# Прочитать дату и время указанного часового пояса

print('n Datetime of UTC Time-zone:', dt.datetime.now(tz = currentTimeZone))

print('Datetime часового пояса IST:', dt.datetime.now(tz = newTimeZone))



 

Пример-4: Распечатать отформатированные дату и время

В предыдущих примерах значения даты и времени печатаются в формате по умолчанию. Следующий скрипт распечатает отформатированные данные и время в соответствии с выбранным часовым поясом. Формат даты и времени определен в начале скрипта. В соответствии с форматом дата будет напечатана в формате дд-мм-гггг, а время будет напечатано в формате чч: мм: сс. Затем часовой пояс будет назначен Europe/Moscow, а дата и время будут напечатаны с использованием функции strftime() в указанном выше формате. Затем часовой пояс будет присвоен Азии/Дакке и напечатан, как и раньше.

# Импортировать модуль DateTime

from datetime import datetime



# Импортировать модуль часового пояса

from pytz import timezone



# Установить формат даты и времени

dt_format = "%d-%m-%Y %H:%M:%S"



# Установить текущее время в зоне Europe/Moscow

moscowZone = datetime.now(timezone('Europe/Moscow'))

print('Дата и время зоны Moscow: n', moscowZone.strftime(dt_format))



# Измените часовой пояс на Asia/Dhaka

dhakaZone = moscowZone.astimezone(timezone('Asia/Dhaka'))

print('Дата и время зоны Дакки: n', dhakaZone.strftime(dt_format))



 

Заключение:

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



2021-04-10T13:04:12
Python

Как получить доступ к SQLite из Python

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

Данные повсюду, и широкий спектр программных приложений взаимодействует с данными с помощью системы управления базами данных. SQLite — одна из самых популярных систем управления базами данных в Python.

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

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

Начнем с установки SQLite:

 

Установка SQLite и Python

В зависимости от вашего дистрибутива Linux вы можете загрузить архив SQLite с https://www.sqlite.org/download.html или использовать диспетчер пакетов.

Чтобы установить его в Debian:

sudo apt-get update



sudo apt-get install sqlite -y

Затем у вас должна быть установлена ​​последняя версия Python3. По умолчанию Python должен быть предварительно установлен в вашем дистрибутиве.

 

Оболочка SQLite

Методом по умолчанию для взаимодействия с базами данных SQLite является использование оболочки. Оболочка позволяет выполнять встроенные команды SQL или набор для выполнения функций в базах данных.

Для запуска оболочки SQLite используйте команду:

$ sqlite

SQLite версии 2.8.17 Введите «.help» для получения инструкций.

sqlite >

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

sqlite> .help

.databases             List names and files of attached databases

.dump ?TABLE? ...      Dump the database in a text format

.echo ON|OFF           Turn command echo on or off

.exit                  Exit this program

.explain ON|OFF        Turn output mode suitable for EXPLAIN on or off.

.header(s) ON|OFF      Turn display of headers on or off

.help                  Show this message

.indices TABLE         Show names of all indices on TABLE

.mode MODE             Set mode to one of "line(s)", "column(s)",

"insert", "list", or "html"



----------------------------------------------------------------------

Для выхода из оболочки SQLite используйте команду .quit.

sqlite > .quit

Внутри оболочки SQLite можно использовать и другие функции и операции. Например, чтобы просмотреть все базы данных, вы можете использовать команду database.

Мы настоятельно рекомендуем вам поэкспериментировать с оболочкой SQLite и ознакомиться с ней, поскольку она позволит вам понять, как использовать модуль SQLite3 в Python.

 

Подключение к базе данных

Давайте теперь будем использовать модули Python и SQLite3 для взаимодействия с базами данных SQLite. Стоит отметить, что есть и другие модули Python, которые вы можете использовать для взаимодействия с SQLite. Однако SQLite3 прост и поставляется в комплекте с Python.

Рассмотрим приведенный ниже сценарий для подключения к базе данных SQLite.

import sqlite3 from sqlite3 import Error



def connect_db(db_path):

connection = None     try:

connection = sqlite3.connect(db_path)

print("База данных успешно подключена")

except Error as e:

print(f"Произошла ошибка: {e}")

return connection



connect_db("/home/user/Desktop/demo.sqlite")

Начнем с импорта модулей SQLite и Error.

В строке 3 мы создаем функцию connect_db(), которая принимает в качестве аргумента путь к базе данных.

Следующая часть включает блок попытки/ошибки. Первая часть принимает в качестве аргумента путь к базе данных и устанавливает соединение. Обратите внимание: в SQLite, если указанная база данных не существует, она создается автоматически.

Блок ошибок пытается перехватить исключения и распечатать их пользователю.

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

Примечание
Если вы хотите создать базу данных памяти вместо диска, вы можете указать: memory в объекте подключения.

sqlite3.connect(“:memory”)

SQLite создать таблицу

В SQLite мы можем использовать оболочку SQL для создания таблиц с помощью запроса CREATE TABLE. Общий синтаксис такой:

CREATE TABLE database_name.table_name (

column_name datatype PRIMARY KEY(column(s),

column2_name datatype,

…         columnN_name datatype,

);

Мы не будем углубляться в создание таблиц с использованием оболочки SQLite, поскольку наша основная задача — Python. Чтобы узнать больше, ознакомьтесь с документацией по SQL из приведенного ниже ресурса:

https://docs.microsoft.com/en-us/sql/?view=sql-server-ver15

 

Сейчас :

Чтобы использовать модули Python и sqlite3 для создания таблиц базы данных, нам нужно использовать объект курсора и выполнять функции SQL-запросов.

Рассмотрим код ниже:

import sqlite3 from sqlite3 import Error



def connect_db(db_path):

connection = None



try:

connection = sqlite3.connect(db_path)

print("База данных успешно подключена")

except Error as e:

print(f"Произошла ошибка: {e}")

return connection def run_query(connection, sql_query):

cursor = connection.cursor()

try:

cursor.execute(sql_query)

connection.commit()

print("SQL - Запрос успешно выполнился………………[OK]")

except Error as e:

print(f" Ошибка запроса……{e}")

query = """

CREATE TABLE IF NOT EXISTS users (

id INTEGER PRIMARY KEY AUTOINCREMENT,

name TEXT NOT NULL,

year INTGER,

genre TEXT,

country TEXT

);

"""



run_query(connection=connect_db("/home/user/Desktop/sql.sqlite"), sql_query=query)





Давайте теперь обсудим, что делает приведенный выше код — найдите первую функцию, описанную выше (см.).

Во второй функции create мы передаем соединение и запрос для выполнения в качестве параметров.

Следующие строки создают объект курсора, который мы будем использовать для вызова метода execute.

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

После успешного выполнения запроса мы говорим SQLite использовать метод фиксации для сохранения изменений в базе данных.

Блок except перехватывает исключения и выводит пользователю сообщение об ошибке.

Наконец, мы создаем запрос для выполнения с использованием простого синтаксиса SQLite.

 

Вставка записей в SQLite

Чтобы добавить данные в базу данных SQLite, мы можем погрузиться в функцию run_query(), которую мы использовали для создания, поскольку она может выполнять любой запрос SQLite, который мы ей передаем. Однако мы используем запрос INSERT INTO для добавления данных в таблицу.

Рассмотрим блок ниже:

add_users = """

INSERT INTO

users (id, name, year, genre, country)

VALUES

("101", "AndreyEx", "2021", "IT", "Russia"),

("201", "Destroyer", "2017", "IT", "Russia"),

("301", "Annihilator", "2016", "IT", "Russia");

""" run_query(connection=connect_db("/home/user/Desktop/sql.sqlite"), sql_query=add_users)

Теперь нам нужно вызвать функцию run_query и добавить передачу запроса add_users для вставки данных в таблицу users. Убедитесь, что таблица, в которую вы вставляете данные, существует, чтобы избежать ошибки.

 

SQLite Удалить записи

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

Рассмотрим следующий подзапрос:

remove = "DELETE FROM users WHERE name = 'AndreyEx'" run_query(connection=connect_db("/home/user/Deskop/sql.sqlite"), sql_query=remove)

Вышеупомянутый запрос удаляет «AndreyEx» из таблицы users.

 

Заключение

В этой статье вы научились использовать Python для доступа к базам данных SQLite и взаимодействия с ними.

Из того, что вы узнали из этой статьи, теперь вы можете создавать функции, подключаться к базам данных SQLite, создавать таблицы, вставлять данные и удалять их. Хотя это руководство для начинающих по работе с SQLite в Python, оно должно помочь вам начать изучение других технологий, таких как SQLAlchemy и т. д.



2021-04-08T13:10:40
Python

Как использовать функцию enumerate в Python для создания циклов со счетчиками

В этой статье будет объяснено использование функции «enumerate», доступной в стандартной библиотеке модулей Python. Функция Enumerate позволяет вам присваивать «index» или «count» элементам в любом итерируемом объекте. Затем вы можете реализовать для них дополнительную логику, поскольку у вас будет доступ как к значениям, так и к сопоставленному с ними счетчику.

 

Синтаксис и базовый пример

Если вы использовали цикл «for» в других языках программирования, особенно в языке «C» и других языках, имеющих синтаксис стиля «C», вы могли указать начальный индекс в цикле. Для справки, вот как выглядит цикл for в «C» и других языках с аналогичным синтаксисом:

for (int i = 0; i < 10; i++)

{

printf(«%dn», i);

}

Оператор цикла инициализирует переменную, имеющую нулевое значение, проверяет, что оно меньше порогового значения, и увеличивает его на один счет после оценки логики внутри блока цикла (если выполняется условие остановки). Таким образом, вы можете использовать индекс и назначать его любым объектам, указанным в вашем блоке цикла. Для сравнения, вот как выглядит цикл for с таким же результатом в Python:

for i in range(0, 10):



print (i)



 

Функция «range» в Python позволяет вам указать последовательность диапазонов номеров, которая имеет шаг по умолчанию 1. Вы можете изменить значение шага, указав третий аргумент. Второй аргумент в функции «range» используется для установки порога для условия остановки. Оба образца кода дают следующий результат:

0



1



2



3



4



5



6



7



8



9



Эти циклы работают нормально, если вы просто хотите сгенерировать некоторую числовую последовательность и связать их с некоторой логикой внутри оператора цикла. Однако вам, возможно, придется использовать другой вложенный цикл или функцию yield для любого итеративного типа, чтобы присвоить им какое-то отслеживаемое количество. Метод «enumerate» позволяет легко назначать индексы для итераций в одном операторе, тем самым устраняя необходимость в выполнении нескольких вложенных циклов. Взгляните на этот пример кода:

numbers = ["zero", "one", "two", "three", "four", "five"]



enumerated_numbers = enumerate(numbers)



for index, item in enumerated_numbers:



print (index, item)



 

Первый оператор определяет новую переменную с именем «numbers» и назначает ей итерацию (тип списка). Второй оператор показывает использование функции «enumerate», в которой вы предоставляете ей итерацию в качестве обязательного аргумента. Третий оператор преобразует переменную enumerated_numbers в объект типа списка. По умолчанию функция enumerate генерирует объект типа enumerate, а не итеративный тип, поэтому вам необходимо преобразовать его. После выполнения примера кода, упомянутого выше, вы должны получить следующий результат:

[(0, 'zero'), (1, 'one'), (2, 'two'), (3, 'three'), (4, 'four'), (5, 'five')]

 

Функция enumerate присваивает счет каждому элементу итеративного типа и создает кортежи, имеющие парные значения. По умолчанию счет начинается с нуля.

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

numbers = ["zero", "one", "two", "three", "four", "five"]



enumerated_numbers = enumerate(numbers)



for index, item in enumerated_numbers:



print (index, item)



 

Указанный выше пример кода даст следующий результат:

0 zero



1 one



2 two



3 three



4 four



5 five



 

Вы можете сделать код короче, используя встроенную функцию «enumerate», как показано в примере ниже:

numbers = ["zero", "one", "two", "three", "four", "five"]



for index, item in enumerate(numbers):



print (index, item)



Использование Enumerate с другим начальным индексом

Функция enumerate принимает необязательный аргумент, в котором вы можете указать начальный индекс. По умолчанию он равен нулю, но вы можете изменить его, используя аргумент «start»:

numbers = ["one", "two", "three", "four", "five"]



for index, item in enumerate(numbers, start=1):



print (index, item)



 

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

1 one



2 two



3 three



4 four



5 five



Назначение индекса с шагами

В первом разделе этой статьи показан синтаксис цикла for на языке C, где вы можете определить шаги между каждым последующим счетчиком или индексом. Функция enumerate в Python не имеет такого аргумента, поэтому вы не можете указать шаг между счетчиками. Вы действительно можете написать свою собственную логику для реализации шагов внутри пронумерованного блока цикла «for». Однако есть способ реализовать пользовательские шаги, написав минимальный код. В следующем примере показана реализация шагов с использованием функций «zip» и «range»:

numbers = ["zero", "two", "four", "six"]



for index, item in zip(range(0, 7, 2), numbers):



print (index, item)



 

Функция «zip» позволяет создавать пары, выбирая элементы с одинаковым индексом из двух или более итераций. Таким образом, здесь функция «zip» выбирает элемент из итерации, возвращаемой функцией «range(0, 7, 2)», и другой элемент из списка «numbers», а затем объединяет их в кортеж. Конечным результатом является реализация, идентичная реализации функции «перечисление», но с пользовательскими шагами, указанными в качестве третьего аргумента в функции «range(0, 7, 2)» (в данном случае 2). После выполнения указанного выше примера кода вы должны получить следующий результат:

0 zero



2 two



4 four



6 six

Заключение

Функция «перечислить» в Python позволяет писать краткий код, присваивая числовую последовательность элементам в повторяемом объекте. Это действительно полезно, если вы хотите отслеживать индекс элементов внутри итеративного типа. Если вы хотите «перечислить» итерационные типы с помощью настраиваемых шагов, используйте функцию «zip», описанную в последнем примере.



2021-04-06T18:50:20
Python