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

Что такое Django ORM?

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

Базы данных являются одной из самых популярных технологий, используемых для сбора и организации данных, поскольку они позволяют легко получить доступ к данным, управлять ими и обновлять их. Однако этим базам данных требуется система управления для выполнения этих задач. В основном язык SQL используется для выполнения операций в базе данных, однако по мере того, как ваше приложение растет и становится более сложным, становится чрезвычайно трудно иметь представление о том, что именно делает каждая операция. Именно здесь на сцену выходит техника объектно-реляционного сопоставления (ORM). Это позволяет запрашивать данные и манипулировать ими с помощью любого объектно-ориентированного языка программирования по вашему выбору. ORM уменьшают сложность вашего кода и делают его более понятным, что, в свою очередь, упрощает обновление, поддержку и повторное использование кода.

В этой статье мы рассмотрим Django ORM, который представляет собой ORM на основе Python и, следовательно, является одной из самых популярных технологий, используемых в наши дни.

 

Что такое Django?

Прежде чем мы перейдем к рассмотрению ORM Django, давайте сначала посмотрим, что на самом деле представляет собой эта технология Pythonic под названием Django.

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

Давайте теперь наконец посмотрим на Django ORM и некоторые из его основных функций.

 

Доступ к Django ORM

После установки Django и настройки его проекта нам обычно предоставляются следующие исходные файлы:

Что такое Django ORM?

 

Здесь mysite относится к имени созданного вами проекта. Все эти файлы используются по-своему, и важно знать, какую роль играет каждый файл. Здесь мы сосредоточимся на файле manage.py, который будет контролировать для нас множество различных вещей, таких как настройка сервера, выполнение миграций, связь с базой данных, а также вход в режим ORM.

Чтобы открыть Django ORM, откройте командную строку из основного каталога вашего проекта Django и выполните следующую команду:

$ python manage.py shell

 

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

 

Управление базой данных с помощью запросов в Django ORM

Поскольку ORM позволяет нам взаимодействовать с базой данных, теперь мы можем писать различные запросы для извлечения и управления данными из базы данных. Однако, прежде чем мы сможем начать работу с базой данных в оболочке, мы сначала должны импортировать все связанные с ней модели. Это можно сделать, просто запустив команду в интерактивной оболочке, как показано ниже:

$ from appName.models import modelName

 

Здесь appName относится к имени вашего приложения, которое вы создали, и, следовательно, где в настоящее время хранятся ваши модели. ModelName относится к имени модели, которую вы хотите импортировать и использовать. Здесь вы можете импортировать несколько моделей.

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

$ Post.objects.all()

 

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

 

Моделирование базы данных

Одна из лучших вещей, которые Django ORM предоставляет своим пользователям, — это возможность автоматически связывать и устанавливать отношения между атрибутами объекта вашей модели и соответствующими полями таблицы. В базах данных существуют в основном три типа отношений. это отношения «один к одному», отношения «один ко многим» или «многие к одному» и отношения «многие ко многим».

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

class Parent(models.Model):

user = models.OneToOneField(

User,

on_delete=models.CASCADE,

primary_key=True,

)

name_of_father = models.CharField(max_length=100)

name_of_mother = models.CharField(max_length=100)

 

Здесь у каждого пользователя могут быть только одинокие биологические родители, и, следовательно, это отношения один-к-одному. Теперь, если мы удалим любого пользователя, имеющего доступ к этой модели, он также удалит модель 2-го пользователя, поскольку они зависят друг от друга.

Отношения «один ко многим» или «многие к одному» относятся к отношениям, при которых родительская запись может иметь несколько дочерних записей, однако у нее может быть только один дочерний элемент или ни одного дочернего. В Django ORM мы можем легко установить эту связь с помощью поля ForeignKey:

class Customer(models.Model):

name = models.CharField(max_length=255)

class Vehicle(models.Model):

customer = models.ForeignKey(

Customer,

on_delete=models.CASCADE

)

 

Как видно из приведенного выше кода, у клиента может быть несколько транспортных средств.

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

class User(models.Model):

post = models.ManyToManyField(Post, blank=True)

friends = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True)

class Post(models.Model):

post = models.TextField()

likes = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name='user_likes')

Вывод

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



2021-03-22T11:58:27
Python

Что такое случайные функции Python?

Python предоставляет несколько функций для генерации случайных чисел. Большинство этих функций доступны в модуле Python random. Вы можете использовать эти функции для генерации случайных чисел в ваших скриптах Python.

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

  1. random()
  2. randint()
  3. uniform()
  4. randrange()
  5. choice()

 

1. Функция random() в Python:

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

import random



# Выведите случайное число с плавающей запятой от 0 до 1

x = random.random()

print (x)



# Выведите случайное число с плавающей запятой от 0 до 10

x = random.random() * 10

print (x)



# Выведите случайное число с плавающей запятой между -5 и +5

x = random.random() * 10 – 5

print (x)

2. Функция randint() в Python:

Функция randint() принимает диапазон и выдает целое число между заданным диапазоном.

import random



# Выведите случайное целое число от 10 до 100

x = random.randint(10, 100)

print (x)

3. Функция uniform() в Python:

Так же, как функция randint() генерирует целое число в заданном диапазоне, uniform() делает то же самое для чисел с плавающей запятой. import random

# Выведите число с плавающей запятой от 10 до 50



x = random.uniform(10, 50) print (x)

4. Функция randrange() в Python:

Функция randrange() используется для выбора целочисленного значения в определенном диапазоне. Вы также можете указать выбор четного или нечетного числа в диапазоне.

import random



# Выведите целое число от 0 до 9

x = random.randrange(10)

print (x)



# Выведите целое число от 10 до 99

x = random.randrange(10, 100)

print (x)



# Выведите четное целое число от 10 до 99

x = random.randrange(10, 100, 2)

print (x)

5. Функция choice() в Python:

Функция Python choice() используется для выбора одного случайного элемента из последовательности.

import random



# Выберите случайный элемент из приведенной ниже последовательности

x = random.choice([‘red’, ‘geen’, ‘yellow’])

print (x)



2021-03-16T19:29:51
Python

Учебники по Python для начинающих, изданные в 2018 году

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

Мы уже публиковали подборки книг для начинающих питонистов.

Давайте теперь копнем глубже и рассмотрим книги 2018 года выпуска. Да, они не только из-под пресса, но вполне сохраняют актуальность. Читать

Как использовать Django Channel

Django — это популярная среда Python, используемая для разработки веб-приложений с использованием спецификаций сервера WGSI (интерфейс шлюза веб-сервера) и ASGI (интерфейс шлюза асинхронного сервера). WGSI используется для разработки синхронных приложений Python, а AGSI используется для разработки асинхронных и синхронных веб-приложений. Канал — это полезная функция Django, которая используется для обработки WebSocket, протокола чата и т. д. Наряду с протоколом HTTP. Канал построен по спецификации сервера ASGI. Сеанс двусторонней интерактивной связи между браузером пользователя и сервером можно открыть с помощью WebSocket. Клиент инициирует соединение WebSocket, и сервер отвечает согласием или закрыть сообщение. Сообщения WebSocket проталкиваются в канал с помощью производителей и отправляются потребителям, которые прослушивают канал. В этой статье показано, как использовать каналы для обработки сообщений WebSocket.

 

Предпосылки

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

  • Установите Django версии 3+ на Ubuntu 20+ (желательно)
  • Создайте проект Django
  • Запустите сервер Django, чтобы проверить, правильно ли он работает.

 

Настроить приложение Django

Выполните следующую команду, чтобы создать приложение Django с именем socketapp:

$ python3 manage.py startapp socketapp

 

Выполните следующую команду, чтобы установить канал:

$ pip install channels

 

Добавьте каналы и имя приложения в часть INSTALLED_APP файла settings.py :

INSTALLED_APPS = [

…..

'channels',

'socketapp'

]

 

Определите значение ASGI_APPLICATION в файле settings.py :

ASGI_APPLICATION = ‘channel_pro.asgi.application’

 

Создайте папку с именем templates внутри папки socketapp и установите расположение шаблона приложения в части TEMPLATES файла settings.py :

TEMPLATES = [

{

….

'DIRS': ['/home/fahmida/channel_pro/socketapp/templates'],

….

},

]

Следующий вывод появится в терминале после запуска сервера Django. Выходные данные показывают, что работает ASGI/Channels версии 3.0.3.

Создайте файл шаблона с именем index.html в определенном месте шаблона для отображения данных, отправленных WebSocket. Объект сокета, созданный с помощью JavaScript, будет считывать данные с помощью метода JSON.parse(), а затем передавать значение в содержимое тега <h1>, который содержит значение идентификатора, msg.

<!DOCTYPE html>

<html lang=»en»>

<head>

<meta charset=»UTF-8″>

<title>Учебники по каналу Django</title>

<script>

socket = new WebSocket(«ws://localhost:8000/msg/»);

socket.onmessage = function(e) {

var data = JSON.parse(e.data);

document.querySelector(‘#msg’).innerText = data.timeValue;

}

</script>

</head>

<body>

<center>

<h1 style=»color:blue» id =»msg»>{{ text }}</h1>

</center>

</body>

</html>

 

Измените views.py файл в socketapp со следующим содержанием. Index.html файл шаблона будет отображаться в браузере с текстом переменной, когда метод index() этого сценария вызывается из urls.py файла. Если сообщение не передается из сокета, в браузере будет отображаться текст «AndreyEx».

views.py

# Импортировать модуль рендеринга из Django

from django.shortcuts import render



# Создать функцию индекса для отображения HTML-файла в браузере

def index(request):

return render(request, "index.html", context={'text': 'AndreyEx'})

 

Измените urls.py файл в socketapp со следующим содержанием. В скрипте определены два пути: путь admin/ используется для открытия панели администрирования Django, а путь msg/ используется для чтения сообщения WebSocket.

urls.py

from django.contrib import admin

from django.urls import path



from socketapp import views



urlpatterns = [

path('admin/', admin.site.urls),

path('msg/', views.index)

]

Когда следующий URL-адрес выполняется без определения файлов-потребителей и файлов маршрутизации, протокол HTTP будет работать, и появится следующий вывод.

http://localhost:8000/msg/

 

Теперь создайте файл consumer.py внутри папки socketapp с помощью следующего скрипта. Метод connect() для ws_consumer будет использоваться для приема подключения к сокету, чтения текущего значения времени каждую секунду и отправки текущего времени в формате JSON через WebSocket, когда этот метод вызывается из файла маршрутизации.

consumers.py

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

import json

# Импортировать WebsocketConsumer

from channels.generic.websocket import WebsocketConsumer

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

from datetime import datetime

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

from time import sleep





# Определить класс потребителя для отправки данных через

class ws_consumer(WebsocketConsumer):

def connect(self):

self.accept()

while(True):

now = datetime.now()

self.send(json.dumps({'timeValue': now.strftime("%H:%M:%S")}))

sleep(1)

 

Создайте routing.py внутри папки socketapp с помощью следующего скрипта. Путь msg/ определен в сценарии для вызова потребителя для отправки данных в сокет.

routing.py

from django.urls import path

from.consumers import ws_consumer



# Задайте путь для вызова потребителя

ws_urlpatterns = [

path('msg/', ws_consumer.as_asgi())

]

 

Измените файл asgi.py с помощью следующего сценария. Модули, необходимые для обработки запросов HTTP и WebSocket, импортируются в сценарий.

asgi.py

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

import os

# Импортировать get_asgi_application для обработки протокола http

from django.core.asgi import get_asgi_application

# Import ProtocolTypeRouter и URLRouter для установки маршрутизации веб-сокетов

from channels.routing import ProtocolTypeRouter, URLRouter

# Import AuthMiddlewareStack для обработки веб-сокета

from channels.auth import  AuthMiddlewareStack

# Импортировать маршрутизацию веб-сокетов

from socketapp.routing import ws_urlpatterns



# Назначьте значение для DJANGO_SETTINGS_MODULE

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'channel_pro.settings')



# Определить переменные приложения для обработки HTTP и WebSocket

application = ProtocolTypeRouter({

'http': get_asgi_application(),

'websocket': AuthMiddlewareStack(URLRouter(ws_urlpatterns))



})

 

Теперь снова запустите следующий URL-адрес из браузера, чтобы прочитать данные из WebSocket.

http://localhost:8000/msg/

 

Если потребитель и маршрутизатор работают правильно, в браузере будут отображаться следующие цифровые часы. Здесь маршрутизатор отправил запрос WebSocket, используя путь msg/ к потребителю, который принял запрос и отправил данные в шаблон, чтобы показать цифровые часы в браузере, где второе значение текущего времени обновляется каждые второй.

 

Вывод

В этом руководстве показано, как реализовать приложение реального времени с использованием инфраструктуры и каналов Django, создав простые цифровые часы. Другие типы приложений реального времени также могут быть реализованы с использованием Django и каналов, таких как системы онлайн-чата. Скрипты, используемые в этой статье, работают только с Django версии 3+ и Channel версии 3+. Итак, если вы используете более раннюю версию Django или Channel, вам нужно будет обновить версию перед тестированием скрипта, представленного в этом руководстве.



2021-03-06T10:29:34
Python

Цикл for в Python

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

В Python есть две основные конструкции циклов, которые позволяют многократно повторять блок кода: циклы for и while

В этой статье мы рассмотрим основы for в Python. Мы также покажем вам, как использовать range для генерации последовательности чисел, а else break и continue для изменения потока цикла. Читать

Кортежи в Python

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

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

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

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

Создание кортежей

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

colors = ('orange', 'white', 'green')


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

my_tuple = (1, False, ["red", "blue"], ("foo", "bar"))


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

my_tuple = ()


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

my_tuple = (1)

type(my_tuple)

my_tuple = (1,)

type(my_tuple)


<class 'int'>

<class 'tuple'>


Кортежи также можно создавать с помощью конструктора tuple() :

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

colors_typle = tuple(colors_list)

print(type(colors_typle))


<class 'tuple'>


Другой способ создания кортежа — использовать функцию упаковки кортежа, которая позволяет вам создать кортеж из последовательности объектов, разделенных запятыми:

directions = "North", "South", "East", "West"

print(type(directions))


<class 'tuple'>


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

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

my_tuple = ["a", "b", "c", "d"]

             0    1    2    3


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

my_tuple[index]


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

directions = ("North", "South", "East", "West")directions[2]

'East'


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

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

IndexError: tuple index out of range


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

my_tuple = (1, False, ["red", "blue"], ("foo", "bar"))my_tuple[3][1]

'bar'


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

my_tuple = ("a", "b", "c", "d")

            -4   -3   -2   -1


directions = ("North", "South", "East", "West")directions[-2]

'East'


Нарезка кортежей

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

sequence[start:stop:step]


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

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

Следующие формы допустимы в Python:

T[:] # copy whole tuple

T[start:] # slice the tuple starting from the element with index "start" to the end of the tuple.

T[:stop] # slice the tuple starting from the begging up to but not including the element with index "stop".

T[start:stop] #  slice the tuple starting from the element with index "start" up to but not including the element with index "stop".

stop"

T[::step] # slice the tuple with a stride of "step"


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

vegetables = ('Potatoes', 'Garlic', 'Celery', 'Carrots', 'Broccoli')vegetables[1:4]

('Garlic', 'Celery', 'Carrots')


Распаковка кортежей

Распаковка последовательности в функции Python, которая позволяет вам назначать объекты последовательности переменным. Вот пример:

colors = ('orange', 'white', 'green')

a, b, c = colors

print(a)

print(b)

print(c)


Значения элементов кортежа в соответствии с их положением присваиваются переменным слева:

orange

white

green


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

colors = ('orange', 'white', 'green')

a, b = colors


ValueError: too many values to unpack (expected 2)


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

def square_area_circumference(side_lenght):

  return side_lenght * side_lenght, side_lenght * 4



area, circumference = square_area_circumference(5)



print(area)

print(circumference)


25

20


Изменение кортежа

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

Если вы попытаетесь изменить элемент кортежа, вы получите исключение TypeError

colors = ("orange", "white", "green")

colors[1] = "blue"


Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: 'tuple' object does not support item assignment


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

my_tuple = (1, 2, [5, 6, 7])

my_tuple[2][1] = 4

print(my_tuple)


(1, 2, [5, 4, 7])


Длина кортежа

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

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

len(L)


Вот пример:

colors = ("orange", "white", "green")

lenght = len(colors)

print(lenght)


3


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

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

directions = ("North", "South", "East", "West")

for direction in directions:

  print(direction)


North

South

East

West


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

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

directions = ("North", "South", "East", "West")

for i in range(len(directions)):

  print("Index {} : Value {}".format(i, directions[i]))


Index 0 : Value North

Index 1 : Value South

Index 2 : Value East

Index 3 : Value West


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

directions = ("North", "South", "East", "West")

for index, value in enumerate(directions): 

  print("Index {} : Value {}".format(index, value))


Index 0 : Value North

Index 1 : Value South

Index 2 : Value East

Index 3 : Value West


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

Чтобы проверить, существует ли элемент в кортеже, вы можете использовать операторы 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")


no


Кортежные методы

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

  • count(x) — возвращает количество раз, когда «x» встречается в кортеже.
  • index(x) — возвращает позицию первого вхождения элемента со значением ‘x’.

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

my_tuple = ("a", "s", "s", "q", "a", "n")

print(my_tuple.count('a'))

print(my_tuple.index('a'))


2

0


Вывод

В Python кортежи — это неизменяемые последовательности объектов, которые нельзя изменить после создания.

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



2021-03-04T12:13:15
Python