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

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

В этом коротком, но полном руководстве я научу вас, как использовать TOR и Python вместе.

 

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

 

Читать

Создавайте свои собственные модули Python

Python — это многоцелевой язык динамического программирования высокого уровня. Он предоставляет множество встроенных модулей и функций для выполнения различных типов задач. Помимо этого, мы также можем создавать наши собственные модули, используя Python. Модуль похож на библиотеку на Java, C, C ++ и C #. Модуль обычно представляет собой файл, содержащий функции и операторы. Функции и операторы модулей обеспечивают определенные функции. Модуль Python сохраняется с расширением .py. В этой статье мы научимся создавать собственные модули Python.

 

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

 

Создание модулей Python

Чтобы создать модуль Python, откройте скрипт Python, напишите несколько операторов и функций и сохраните его с расширением .py. Позже мы можем вызывать и использовать эти модули где угодно в нашей программе.

Давайте создадим новый модуль с именем «MathOperation». Этот модуль содержит функции для выполнения сложения, вычитания, умножения и деления.

#Создание модуля MathOperation



#модуль обеспечивает функции сложения, вычитания, умножения и деления



#все функции принимают в качестве аргумента два числа



#создание функции добавления



def addition(num1,num2):



return num1+num2



#создание функции вычитания



def subtraction(num1,num2):



return num1-num2



#создание функции умножения



def multiplication(num1,num2):



return num1*num2



#создание функции деления



def division(num1,num2):



return num1/num2




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

 

Вызовите свой модуль

Давайте вызовем этот модуль в нашем другом скрипте Python с помощью команды import.

import MathOperation



#вызов функции сложения из модуля MathOperation



#функция вызывается с помощью имени модуля



print("Результат суммы: ",MathOperation.addition(10,4))



#вызов функции вычитания



print("Результат вычитания: ",MathOperation.subtraction(100,34))



#вызов функции умножения



print("Результат умножения: ",MathOperation.multiplication(4,3))



#вызов функции деления



print("Результат деления: ",MathOperation.division(200,5))




Вызов переменных модуля

Мы также можем объявить переменные в наших самостоятельно созданных модулях Python, присвоить значения этим переменным и вызвать их в нашем скрипте Python. Модули также могут содержать словари, списки и т. д.

#создание переменных



num1 = 10



num2 = 20



#создание списка учащихся



student = ['AndreyEx','Max','Alex','Term']



#создание студенческого словаря



std_dict = {'name':'AndreyEx','age':40,'email':'andr@andreyex.ru'}


 

Теперь давайте вызовем переменные и объекты в другом скрипте Python.

#импорт модуля



import MathOperation



#вызов переменной num1



print("Значение num1 равно:",MathOperation.num1)



#вызов переменной num2



print("Значение num1 равно:",MathOperation.num2)



#вызов списка студентов



print("Значение num1 равно:",MathOperation.student)



#список студентов



print(MathOperation.student[0])



print(MathOperation.student[1])



print(MathOperation.student[2])



print(MathOperation.student[3])



#печать студенческого словаря



print(MathOperation.std_dict)



#вызов элемента студенческого словаря



print(MathOperation.std_dict['name'])



print(MathOperation.std_dict['age'])



print(MathOperation.std_dict['email'])




Результат показывает, что мы успешно получили доступ к переменным и функциям из модуля «MathOperation».

 

Список всех функций и переменных модуля

Python предоставляет встроенную функцию dir (), которая перечисляет имена всех функций и переменных, присутствующих в конкретном модуле. Давайте воспользуемся функцией dir (), чтобы перечислить имена функций и переменных модуля «MathOperation».

Это наши функции и переменные, созданные в нашем модуле «MathOperation».

#создание модуля MathOperation



#модуль обеспечивает функции сложения, вычитания, умножения и деления



#все функции принимают в качестве аргумента два числа



#создание функции добавления



def addition(num1,num2):



return num1+num2



#создание функции вычитания



def subtraction(num1,num2):



return num1-num2



#создание функции умножения



def multiplication(num1,num2):



return num1*num2



#создание функции деления



def division(num1,num2):



return num1/num2



#создание переменных 



num1 = 10 num2 = 20 



#создание списка учащихся 



student = ['AndreyEx','Max','Alex','Term'] 



#создание студенческого словаря 



std_dict = {'name':'AndreyEx','age':40,'email':'andr@andreyex.ru'}


 

Теперь давайте вызовем функцию dir () в нашем скрипте Python.

#импорт модуля



import MathOperation



#использование функции dir()



print(dir(MathOperation))


 

Вывод

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



2020-11-02T12:00:17
Python

Функция Python map ()

map() — это встроенная функция в Python, которая применяет функцию ко всем элементам в данной итерации. Это позволяет писать простой и чистый код без использования циклов.

Функция Python map()

Функция map() принимает следующий вид:

map(function, iterable, ...)

Он принимает два обязательных аргумента:

  • function — функция, которая вызывается для каждого элемента iterable .
  • iterable — один или несколько объектов, поддерживающих итерацию. Большинство встроенных объектов в Python, таких как списки, словари и кортежи, являются повторяемыми.

В Python 3 map() возвращает объект карты с размером, равным переданному итерируемому объекту. В python 2 функция возвращает список.

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

Один из способов сделать это — использовать традиционный цикл for :

directions = ["north", "east", "south", "west"]
directions_upper = []

for direction in directions:
    d = direction.upper()
    directions_upper.append(d)

print(directions_upper)

['NORTH', 'EAST', 'SOUTH', 'WEST']

С функцией map() код будет намного проще и гибче.

def to_upper_case(s):
    return s.upper()

directions = ["north", "east", "south", "west"]

directions_upper = map(to_upper_case, directions)

print(list(directions_upper))

Мы используем конструктор list() для преобразования возвращенного объекта карты в список :

['NORTH', 'EAST', 'SOUTH', 'WEST']

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

directions = ["north", "east", "south", "west"]

directions_upper = map(lambda s: s.upper(), directions)

print(list(directions_upper))

Лямбда-функция — это небольшая анонимная функция.

Вот еще один пример, показывающий, как создать список квадратных чисел от 1 до 10:

squares = map(lambda n: n*n , range(1, 11))
print(list(squares))

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

Функция range() генерирует последовательность целых чисел.

Использование map() с несколькими итерациями

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

В следующем примере показано, как выполнить поэлементное умножение двух списков:

def multiply(x, y):
  return x * y

a = [1, 4, 6]
b = [2, 3, 5]

result = map(multiply, a, b)

print(list(result))

[2, 12, 30]

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

a = [1, 4, 6]
b = [2, 3, 5]

result = map(lambda x, y: x*y, a, b)

print(list(result))

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

Давайте посмотрим на пример, когда итерируемые объекты имеют разную длину:

a = [1, 4, 6]
b = [2, 3, 5, 7, 8]

result = map(lambda x, y: x*y, a, b)

print(list(result))

Лишние элементы (7 и 8) игнорируются:

[2, 12, 30]

Выводы

Функция Python map() принимает итерируемый объект вместе с функцией и применяет эту функцию к каждому элементу в итерируемом объекте.

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



2020-10-18T16:23:42
Python

Как получить и изменить текущий рабочий каталог в Python

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

Когда вы запускаете сценарий Python, в качестве текущего рабочего каталога устанавливается каталог, из которого выполняется сценарий.

Модуль os python обеспечивает переносимый способ взаимодействия с операционной системой. Модуль является частью стандартной библиотеки Python и включает методы поиска и изменения текущего рабочего каталога.

Получение текущего рабочего каталога в Python

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

os.getcwd()

Чтобы использовать методы модуля os, вы должны импортировать модуль в верхней части файла.

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

# Import the os module
import os

# Get the current working directory
cwd = os.getcwd()

# Print the current working directory
print("Current working directory: {0}".format(cwd))

# Print the type of the returned object
print("os.getcwd() returns an object of type: {0}".format(type(cwd)))

Результат будет выглядеть примерно так:

Current working directory: /home/linuxize/Desktop
os.getcwd() returns an object of type: <class 'str'>

Если вы хотите найти каталог, в котором находится скрипт, используйте os.path.realpath(__file__) . Он вернет строку, содержащую абсолютный путь к запущенному скрипту.

Изменение текущего рабочего каталога в Python

Чтобы изменить текущий рабочий каталог в Python, используйте метод chdir() .

os.getcwd(path)

Метод принимает один аргумент — путь к каталогу, в который вы хотите перейти. Аргумент path может быть абсолютным или относительным.

Вот пример:

# Import the os module
import os

# Print the current working directory
print("Current working directory: {0}".format(os.getcwd()))

# Change the current working directory
os.chdir('/tmp')

# Print the current working directory
print("Current working directory: {0}".format(os.getcwd()))

Результат будет выглядеть примерно так:

Current working directory: /home/linuxize/Desktop
Current working directory: /tmp

Аргумент, передаваемый методу chdir() должен быть каталогом, в противном случае NotADirectoryError исключение NotADirectoryError . Если указанный каталог не существует, возникает исключение FileNotFoundError . Если у пользователя, от имени которого выполняется сценарий, нет необходимых разрешений, возникает исключение PermissionError .

# Import the os module
import os

path = '/var/www'

try:
    os.chdir(path)
    print("Current working directory: {0}".format(os.getcwd()))
except FileNotFoundError:
    print("Directory: {0} does not exist".format(path))
except NotADirectoryError:
    print("{0} is not a directory".format(path))
except PermissionError:
    print("You do not have permissions to change to {0}".format(path))

Выводы

Чтобы найти текущий рабочий каталог в Python, используйте os.getcwd() , а для изменения текущего рабочего каталога используйте os.chdir(path) .

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



2020-10-16T08:24:27
Python

Как получить и изменить текущий рабочий каталог в Python

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

Когда вы запускаете сценарий Python, в качестве текущего рабочего каталога устанавливается каталог, из которого выполняется сценарий.

Модуль os python обеспечивает переносимый способ взаимодействия с операционной системой. Модуль является частью стандартной библиотеки Python и включает методы поиска и изменения текущего рабочего каталога.

 

Получение текущего рабочего каталога в Python

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

os.getcwd()


Чтобы использовать методы модуля os, вы должны импортировать модуль в верхней части файла.

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

# Импорт модуля os

import os



# Получить текущий рабочий каталог

cwd = os.getcwd()



# Печать текущего рабочего каталога

print("Текущий рабочий каталог: {0}".format(cwd))



# Выведите тип возвращаемого объекта

print("os.getcwd() возвращает объект типа: {0}".format(type(cwd)))


Результат будет выглядеть примерно так:

Текущий рабочий каталог: /home/AndreyEx/Desktop

os.getcwd() возвращает объект типа: <class 'str'>


Если вы хотите найти каталог, в котором находится сценарий, используйте os.path.realpath(__file__). Он вернет строку, содержащую абсолютный путь к запущенному скрипту.

Изменение текущего рабочего каталога в Python

Чтобы изменить текущий рабочий каталог в Python, используйте метод chdir().

os.getcwd(path)


Метод принимает один аргумент — путь к каталогу, в который вы хотите перейти. Аргумент path может быть абсолютным или относительным.

Вот пример:

# Импорт модуля os

import os



# Печать текущего рабочего каталога

print("Текущий рабочий каталог: {0}".format(os.getcwd()))



# Изменение текущего рабочего каталога

os.chdir('/tmp')



# Печать текущего рабочего каталога

print("Текущий рабочий каталог: {0}".format(os.getcwd()))


Результат будет выглядеть примерно так:

Текущий рабочий каталог: /home/Andreyex/Desktop

Текущий рабочий каталог: /tmp


 

Аргумент, предоставленный методу chdir(), должен быть каталогом, в противном случае возникает исключение NotADirectoryError. Если указанный каталог не существует, возникает исключение FileNotFoundError. Если у пользователя, под которым выполняется сценарий, нет необходимых разрешений, возникает исключение PermissionError.

# Импорт модуля os

import os



path = '/var/www'



try:

    os.chdir(path)

    print("Текущий рабочий каталог: {0}".format(os.getcwd()))

except FileNotFoundError:

    print("Каталог: {0} не существует".format(path))

except NotADirectoryError:

    print("{0} не каталог".format(path))

except PermissionError:

    print("У вас нет прав на изменение {0}".format(path))


Вывод

Чтобы найти текущий рабочий каталог в Python, используйте os.getcwd(), а для изменения текущего рабочего каталога используйте os.chdir(path).

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



2020-10-14T12:11:50
Python

Списки Python

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

В этой статье рассматриваются списки Python. Мы покажем вам, как создать список, разрезать и отсортировать список, добавить или удалить элементы из списка и т. Д.

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

Создание списка

Списки обычно создаются путем помещения элементов в квадратные скобки [] , разделенных запятыми. В них может быть любое количество предметов, которые могут быть разных типов. Вот пример:

L = ['orange', 'white', 'green']

Квадратные скобки без элементов между ними обозначают пустой список:

L = []

Хотя списки Python обычно однородны, у вас могут быть элементы со смешанными типами данных:

L = [1, 'white', 6.5]

Вы также можете объявить вложенные списки, в которых один или несколько элементов также являются списками:

L = [1, 2, ['red', 'blue']]

Несколько элементов могут иметь одно и то же значение:

L = [1, 2, 3, 2, 2, 1]

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

Доступ к элементам списка

На элемент списка можно ссылаться по его индексу. Индексы являются целыми числами и начинаются от 0 до n-1 где n — количество элементов:

L = ["a", "b", "c", "d"]
      0    1    2    3

В Python индексы заключаются в квадратные скобки:

L[index]

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

colors = ['orange', 'white', 'green']colors[1]

'white'

Если вы ссылаетесь на несуществующий индекс, IndexError исключение IndexError :

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

Для доступа к элементам во вложенном списке используйте несколько индексов:

L = [1, 2, ["red", "blue"]]L[2][1]

'blue'

Python также позволяет вам получать доступ к элементам списка, используя отрицательные индексы. Последний элемент обозначается как -1 , второй последний элемент — как -2 и так далее:

L = ["a", "b", "c", "d"]
     -4   -3   -2   -1

Например, чтобы получить доступ ко второму элементу с конца, вы должны использовать:

colors = ['orange', 'white', 'green']colors[-2]

'white'

Нарезка списка

В Python вы можете разрезать список, используя следующую форму:

L[start:stop:step]

  • Первый аргумент указывает индекс, с которого начинается извлечение. Когда используется отрицательный индекс, он указывает смещение от конца списка. Если этот аргумент опущен, нарезка начинается с индекса 0.
  • Второй аргумент указывает индекс, до которого следует завершить извлечение; результат не включает элемент «стоп». Когда используется отрицательный индекс, он указывает смещение от конца списка. Если этот аргумент опущен или превышает длину списка, нарезка переходит в конец списка.
  • Третий аргумент является необязательным и указывает шаг нарезки. Когда аргумент «шаг» не используется, по умолчанию он равен 1. Когда используется отрицательное значение, срез принимает элементы в обратном порядке.

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

Все следующее является допустимым синтаксисом Python:

L[:] # copy whole list
L[start:] # slice the list starting from the element with index "start" to the end of the list.
L[:stop] # slice the list starting from the begging up to but not including the element with index "stop".
L[start:stop] #  slice the list starting from the element with index "start" up to but not including the element with index "stop".
stop"
L[::step] #  slice the list with a stride of "step"

Ниже приведен базовый пример того, как разрезать список, начиная с элемента с индексом 1 и заканчивая элементом с индексом 4, но не включая его:

fruits = ['Apple', 'Peach', 'Lemon', 'Strawberry', 'Grape']fruits[1:4]

['Peach', 'Lemon', 'Strawberry']

Обновление значения элемента

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

L[index] = value

Вот пример, показывающий, как обновить значение последнего элемента списка:

colors = ['orange', 'white', 'green']colors[-1] = "blue"print(colors)

['orange', 'white', 'blue']

Если элемент с данным индексом существует, значение обновляется. В противном случае IndexError исключение IndexError :

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range

Вы также можете обновить часть списка новыми значениями:

colors = ['orange', 'white', 'green']colors[1:3] = ['red']print(colors)

['orange', 'red']

Замещающий блок может иметь меньшее, большее или такое же количество элементов, как и список. Это позволяет расширять или сжимать список.

Добавление элементов в список

Тип данных списка имеет два метода, которые позволяют добавлять элементы в список : append() и insert() .

Метод append() добавляет элемент в конец списка. Синтаксис метода append() следующий:

L.append(element)

«Element» — это элемент, который нужно добавить в список. Это может быть любой тип данных, включая список. Вот пример:

colors = ['orange', 'white', 'green']colors.append('red')print(colors)

['orange', 'white', 'green', 'red']

Метод insert() рекламирует элемент в определенной позиции в списке и имеет следующий синтаксис:

L.insert(index, element)

«Index» — это позиция, в которую вы хотите вставить элемент, а «element» — это элемент, который нужно добавить в список. В следующем примере показано, как добавить элемент в список на первой позиции:

colors = ['orange', 'white', 'green']colors.insert(0, 'red')print(colors)

['red', 'orange', 'white', 'green']

Метод extend() позволяет расширить список несколькими элементами. Он принимает единственный аргумент и имеет следующий синтаксис:

L.extend(list)

Элементы «списка» добавляются в конец «L». Вот пример:

colors = ['orange', 'white', 'green']colors.extend(['blue', 'black'])print(colors)

['orange', 'white', 'green', 'blue', 'black']

Удаление элементов из списка

Метод remove() принимает один аргумент и удаляет из списка первый элемент со значением, соответствующим аргументу:

L.remove(element)

colors = ['orange', 'white', 'orange', 'green']colors.remove('orange')print(colors)

['white', 'orange', 'green']

Если элемент с данным значением не существует, возникает исключение ValueError :

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list

Метод pop() принимает один аргумент и удаляет элемент с индексом, соответствующим аргументу, из списка:

L.pop(element)

Аргумент является необязательным. По умолчанию используется значение «-1», которое является последним элементом списка. Возвращаемое значение метода — удаленный элемент. Вот пример:

colors = ['orange', 'white', 'green']colors.pop(1)print(colors)

'white'
['orange', 'green']

Ключевое слово del в сочетании с обозначением среза позволяет удалить более одного элемента. Например, чтобы удалить первые два элемента из списка, вы должны использовать следующее:

colors = ['orange', 'white', 'orange', 'green']del colors[0:2]print(colors)

['orange', 'green']

Чтобы удалить все элементы, используйте метод clear() , который очищает список и не принимает никаких аргументов:

colors = ['orange', 'white', 'green']colors.clear()print(colors)

[]

Найдите длину списка

Встроенная функция len() возвращает общее количество элементов объекта.

Чтобы узнать длину списка, передайте его в качестве аргумента функции len() :

len(L)

Вот пример:

colors = ['orange', 'white', 'green']num = len(colors)print(num)

3

Итерация по списку

Чтобы перебрать все элементы в списке, используйте цикл for :

colors = ['orange', 'white', 'green']for color in colors:    print(color)

orange
white
green

Если вам нужны индексы, в вашем распоряжении несколько методов. Наиболее распространенные способы — комбинировать функции range() и len() или использовать встроенную функцию enumerate() .

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

colors = ['orange', 'white', 'green']for i in range(len(colors)):  print("Index {} : Value {}".format(i, colors[i]))

Index 0 : Value orange
Index 1 : Value white
Index 2 : Value green

Вместо использования шаблона range(len(...)) вы можете использовать функцию enumerate() для enumerate() списка более питоническим способом:

colors = ['orange', 'white', 'green']for index, value in enumerate(colors):   print("Index {} : Value {}".format(index, value))

Index 0 : Value orange
Index 1 : Value white
Index 2 : Value green

Проверить, существует ли элемент

Чтобы проверить, существует ли элемент в списке, вы можете использовать операторы in и not in :

colors = ['orange', 'white', 'green']print('orange' in colors)

Результатом будет True или False :

True

Вот еще один пример с использованием оператора if :

colors = ['orange', 'white', 'green']if 'blue' not in colors:    print('no')else:    print('yes')

Результатом будет True или False :

no

Списки Python

Объекты списка принимают следующие методы:

  • append(x) — добавляет элемент в конец списка.
  • clear() — удаляет все элементы из списка.
  • copy() — возвращает частичную копию списка.
  • count(x) — возвращает количество раз, когда «x» появляется в списке.
  • extend(iterable) — добавляет «итерабельность» в конец списка.
  • index(x) — возвращает позицию первого вхождения элемента со значением ‘x’.
  • insert(i, x) — добавляет элемент в заданную позицию.
  • pop(i) — удаляет элемент из заданной позиции.
  • remove() — удаляет элемент с заданным значением.
  • reverse()переворачивает элементы списка .
  • sort()sort() элементы списка.

Выводы

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

Тип данных списка включает ряд полезных методов.

Если у вас есть вопросы или отзывы, не стесняйтесь оставлять комментарии



2020-10-13T18:22:42
Python