Добро пожаловать в серию «Питон с нуля». На предыдущем уроке мы узнали, как использовать переменные и управляющие структуры для хранения данных и управления ими. Обязательно просмотрите его, если вам нужно освежиться!
Видеоурок
расшифровка
В сегодняшнем уроке мы рассмотрим функции — каковы они, как они работают и как создавать свои собственные. Мы также собираемся рассмотреть некоторые из встроенных функций и способы их эффективного использования. Наконец, мы собираемся взглянуть на создание и импорт модулей.
Функции — написание своего
Функции — важный шаг, который нужно охватить при внесении дополнительной сложности в ваше программирование. Если переменная является именованным контейнером для данных, то функция является именованным контейнером для блока кода, который может быть выполнен по требованию. Это полезно, если у вас есть программа, которая выполняет определенную операцию много раз. Вместо того, чтобы копировать и вставлять код для выполнения этой операции в каждом разделе, где это необходимо, вы можете просто написать одну функцию, которая сделает это за вас.
Функция — это именованный контейнер для блока кода.
Существует два типа функций: те, которые вы пишете сами и включаете в свой код, и те, которые изначально включены в Python, которые выполняют общие процедуры, такие как преобразование целого числа в строку или определение длины строка.
Сейчас мы рассмотрим написание простой функции и продемонстрируем, как она может быть полезна в реальном коде. Затем мы рассмотрим некоторые из наиболее важных встроенных функций.
Простой пример
Давайте представим, что мы хотим создать сценарий для корзины покупок, который берет стоимость всех товаров в вашей корзине, а затем складывает их вместе, чтобы получить общую стоимость. Чтобы написать функцию, которая потребует двух затрат, сложит их, а затем распечатает вывод, мы могли бы сделать что-то вроде:
01
02
03
04
05
06
07
08
09
10
|
#our two costs to add up
cost1 = 15
cost2 = 20
def sumCart():
totalCost = cost1 + cost2
print totalCost
sumCart()
|
Чтобы определить функцию, нам нужно использовать ключевое слово « def
», а затем имя функции. Затем мы вводим две скобки (мы вернемся к ним позже), а затем двоеточие. После этого весь код, который мы хотим заключить в функцию, должен иметь отступ, как с циклами if
, while
и for
.
Чтобы запустить код в функции, мы вводим имя функции, а затем снова две скобки. Если вы запустите этот код, вы увидите, что он выводит «35», что является правильным выводом.
аргументы
Это здорово, но на данный момент наши функции немного жесткие — все в функции жестко запрограммировано в них. Например, предположим, что мы хотим использовать функцию sumCart
где-то еще, в другой части программы, но вместо того, чтобы сложить вместе cost1 и cost2, мы хотим добавить вместе две другие затраты, которые содержались в разных переменных. Нам пришлось бы написать совершенно новую функцию, даже если эта новая функция будет точно такой же, как текущая, с заменой имен переменных, что вряд ли является эффективным решением.
Чтобы решить эту проблему, мы используем «аргументы», и это то, для чего нужны скобки. Аргумент — это способ передачи данных в функцию, когда мы не знаем, в какую переменную или переменные будут эти данные. Если это не так, давайте рассмотрим пример, на который я только что ссылался. Мы добавим еще две стоимости: cost3 и cost4.
Теперь мы собираемся добавить два аргумента для двух элементов, которые мы хотим добавить. Аргументы определены внутри скобок, и каждому аргументу присваивается имя с запятой, разделяющей каждый. Аргумент действует как временная ссылка на данные, которые вы передали во время работы функции.
01
02
03
04
05
06
07
08
09
10
|
cost1 = 15
cost2 = 20
cost3 = 5
cost4 = 10
def sumCart(item1, item2):
totalCost = item1 + item2
print totalCost
sumCart(cost1, cost2)
|
Когда мы вызываем функцию sumCart
, две переменные, которые мы передали (cost1 и cost2), помещаются в аргументы item1 и item2. Это всегда происходит в том же порядке, в котором вы определяете аргументы — другими словами, первая передаваемая переменная присваивается первому аргументу, вторая — второму аргументу и т. Д. Для столько аргументов, сколько принимает ваша функция.
Что в действительности происходит при запуске функции, так это то, что эти два аргумента преобразуются в локальные переменные и им присваиваются значения переменных, которые вы передаете в функцию при ее вызове — в этом случае значение cost1
помещается в локальную переменную item1
, а значение cost2
помещается в локальную переменную item2
. Это означает, что вы можете легко использовать их внутри функции.
Другой способ, которым вы могли бы посмотреть на это, когда вы передаете переменную в качестве аргумента везде, где имя этого аргумента появляется в функции, оно заменяется переменной, в которую вы передали. Таким образом, в этом примере везде, где item1
записан внутри функция, она заменяется на cost1
, и то же самое на item2
и cost2
.
Чтобы доказать, что вы можете передавать любые числа, которые вы хотите, если вы запустите этот код, вы должны получить сумму cost3
и cost4
:
01
02
03
04
05
06
07
08
09
10
|
cost1 = 15
cost2 = 20
cost3 = 5
cost4 = 10
def sumCart(item1, item2):
totalCost = item1 + item2
print totalCost
sumCart(cost3, cost4)
|
Аргумент по умолчанию
Обратите внимание, что функция может принимать любое количество аргументов, но помните: когда вы вызываете функцию, вы должны передать ей то же количество аргументов, которое вы определили, в противном случае вы получите ошибку. Есть один способ обойти это: вы можете определить значение по умолчанию для любого аргумента, который используется в тех случаях, когда вы не предоставляете значение.
Рассматривая наш текущий код, давайте представим, что мы хотим, чтобы второй элемент стоил 5, если мы не присвоим функции другое значение. Это не вероятный сценарий, но он продемонстрирует концепцию.
01
02
03
04
05
06
07
08
09
10
11
|
cost1 = 15
cost2 = 20
cost3 = 5
cost4 = 10
def sumCart(item1, item2 = 5):
totalCost = item1 + item2
print totalCost
sumCart(cost1)
sumCart(cost3, cost4)
|
Если мы запустим этот код, вы увидите, что при первом вызове результат будет 20, что действительно (cost1 + 5). Это, однако, не влияет на поведение, когда предоставляются оба аргумента.
Возвращаемые значения
Есть одна последняя особенность функций, которую мы собираемся рассмотреть сегодня: возвращение значений. Мы узнали, как создать функцию, которая не обращает внимания на то, какие входные данные она принимает, но что, если мы хотим сохранить ответ на ‘totalCost’ в переменной, а не распечатать его? Возможно, мы хотим рассчитать стоимость первых двух элементов и сохранить ее в одной переменной, затем сделать то же самое со вторыми двумя элементами и сохранить ответ во второй переменной. С текущим расположением нашей функции мы не могли сделать это в удобочитаемом и легком для понимания виде.
Точно так же, как мы можем передавать аргументы в функцию, чтобы нам не приходилось жестко кодировать, откуда поступают данные, мы можем сделать то же самое с выводом. Я покажу вам пример — в нашей предыдущей функции я собираюсь заменить слово «печать» словом «возврат»:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
cost1 = 15
cost2 = 20
cost3 = 5
cost4 = 10
def sumCart(item1, item2):
totalCost = item1 + item2
return totalCost
cart1 = sumCart(cost1, cost2)
cart2 = sumCart(cost3, cost4)
print cart1
print cart2
|
Очевидно, что функция больше не собирается выводить ответ за нас — вместо этого она возвращает значение переменной totalCost туда, откуда мы вызвали функцию. Таким образом, мы можем использовать ответ в любом контексте, который нам нужен. Теперь, в нашей предыдущей программе, это не было бы особенно полезно, потому что мы не указали, где его хранить, поэтому я также изменил способ вызова функции.
Нам нужно предоставить Python переменную, в которой будет храниться ответ, а затем мы просто установим эту переменную равной нашему выражению, вызывающему функцию. Когда функция возвращает значение, оно будет сохранено в указанной нами переменной.
Функции — Встроенные
Мы узнали, как создавать свои собственные функции и как их использовать, но есть некоторые операции, которые выполняются достаточно часто, чтобы Python включал их для использования в любой программе. То, как вы их называете, точно так же, как и ваши собственные, но вам не нужно сначала их определять. Сейчас мы кратко рассмотрим наиболее важные из них, но обязательно ознакомьтесь с документацией по Python, потому что есть множество полезных функций, доступных для использования, которые у нас нет времени на то, чтобы разобраться сейчас.
Обратитесь к документации по Python для получения списка всех встроенных функций.
ул ()
Во-первых, давайте рассмотрим одну из самых полезных функций в Python: функцию преобразования строк. В сценариях много раз, когда у вас есть переменная, которая содержит число или какой-либо другой тип данных, но вам нужно преобразовать это значение в строку, чтобы что-то с ней сделать — обычно вывести его на экран.
Допустим, у нас есть число в переменной, и мы хотим его распечатать, с сообщением «Число есть», а затем число. Если мы напишем:
1
2
|
number = 10
print ‘The number is ‘ + number
|
… тогда мы столкнемся с ошибкой, потому что вы просите Python добавить число и строку вместе — что на самом деле не имеет большого смысла. Нам нужно преобразовать число 10 в строку 10. Если мы сделаем это, Python поймет, что мы пытаемся не найти сумму, а вместо этого объединить две строки в одну.
Вот где приходит функция str
. Она принимает значение и возвращает строку для его представления. Если вы передадите ему число, оно просто вернет число, но в строковом формате.
1
2
|
number = 10
print ‘The number is ‘ + str(number)
|
Теперь, когда мы заключили число в функцию преобразования строк, код работает отлично. Функция str
не обязательно должна принимать число — она также может принимать другие значения, такие как Boolean
:
1
2
|
bool = True
print ‘The value is ‘ + str(bool)
|
Функция str()
находит самое близкое совпадение строки, которое она может найти для значения « true
», и возвращает его, что означает, что мы можем красиво ее вывести.
LEN ()
Другая распространенная задача для строк — уметь определять их длину, и, опять же, в Python есть встроенная функция для этого. Давайте возьмем строку «Hello World» и попробуем найти ее длину. Для этого нам понадобится встроенная функция len()
, которая обозначает длину. Все, что нам нужно сделать, это передать ей строку, которую мы хотим использовать, и она вернет количество символов в ней:
1
2
|
string = ‘Hello World’
print len(string)
|
Однако функция len()
способна на большее. На самом деле он подсчитывает количество элементов в объекте, который вы ему даете — если вы даете ему строку, то это количество символов, но вы также можете указать ему список или кортеж, например, и он вернет количество предметов в этом конкретном объекте.
Int ()
Двигаясь дальше, часто вам дают число, например 10,6 или 3,896, которое не является целым числом, но вам нужно целое число из них. Встроенная функция для преобразования в целое число называется int()
и работает довольно предсказуемо. Функция вернет целочисленное преобразование этого числа. Обратите внимание, что эта функция НЕ округляет ввод до ближайшего целого числа — она очень просто отбрасывает что-либо после десятичной точки и возвращает вам число. Таким образом, ввод 10.6 вернет 10, а не 11. Аналогично, 3.25 вернет 3.
1
2
|
number = 10.6
print int(number)
|
Функция int
также может преобразовывать строку в тип данных int
. Например, учитывая это, результат все равно будет 10:
1
2
|
number = ’10’
print int(number)
|
Однако, будьте осторожны, потому что, когда он преобразует строку в целое число, int()
НЕ будет иметь дело с десятичными разрядами. Если вы предоставите это:
1
2
|
number = ‘10.6’
print int(number)
|
Тогда он выдаст ошибку, потому что ввод не был целым числом, поэтому он не знал, как с этим справиться.
ассортимент()
Наконец, мы собираемся быстро взглянуть на функцию range()
; это неожиданно часто возникает, когда вы начинаете выполнять более сложные задачи в Python, и, хотя в данный момент это может показаться не очень полезным, стоит взглянуть и узнать, как это работает. Диапазон — это функция, которую вы используете для создания списка чисел по определенному шаблону. Простейшим примером является то, что, возможно, вам нужен список, содержащий все числа от 0 до 10. Вместо того, чтобы вводить их вручную, вы можете использовать функцию range
чтобы сделать это в одной строке.
Range принимает целое число в качестве параметра, и, в этом случае, мы передадим его 11. Затем функция начинается с нуля и составляет список, считая вверх, пока не достигнет значения, которое на единицу меньше, чем введенное вами число. Так что здесь, если мы введем 11, он будет хранить цифры 0 — 10 в списке номеров:
1
2
|
numbers = range(11)
print(numbers)
|
Что если мы хотим напечатать цифры от пяти до десяти вместо этого? Ну, по желанию, мы можем включить другой аргумент для начального номера, так что это будет печатать числа от пяти до десяти:
1
2
|
numbers = range(5, 11)
print(numbers)
|
И наконец, что если мы хотим напечатать только нечетные числа до 10? Ну, диапазон принимает третье значение, которое является количеством, чтобы идти на каждый шаг вверх. Поэтому, если мы начнем с 1, установим шаг в два и верхний предел в 11, мы должны получить все нечетные числа меньше десяти:
1
2
|
numbers = range(1, 11, 2)
print(numbers)
|
И, наконец, любое из этих чисел также может быть отрицательным, поэтому, если мы хотим считать ВНИЗ от 10 до 1, а не вверх, мы можем установить шаг равным 1, начальное значение — 10, а ограничение — 0. , вот так:
1
2
|
numbers = range(10, 0, -1)
print(numbers)
|
Обратите внимание, что диапазон будет иметь дело только с целыми числами, поэтому убедитесь, что вы не передаете ему значений, которые не являются целыми числами, иначе вы выдадите ошибку.
Модули — Создание собственного
Хорошо, теперь мы рассмотрели функции; давайте перейдем ко второй теме сегодняшнего урока: модули. Если функции являются группами кода, то модули являются группами функций. Для них есть еще кое-что, но сейчас это хороший способ думать о них.
Как мы обсуждали ранее, вы не можете сделать сложную программу без сортировки кода по функциям, и, поскольку ваша программа продолжает расти, даже они становятся громоздкими. Вы должны отсортировать их на другой иерархический уровень. Это модули. Таким образом, мы можем обобщить их как структурный и организационный инструмент для нашего кода.
Модули довольно легко создавать. Это просто файлы Python, как ваши обычные скрипты. Чтобы создать модуль, напишите одну или несколько функций в текстовом файле, а затем сохраните его с расширением .py
. Давайте сделаем это сейчас с примером. Откройте новый файл вашего текстового редактора или IDE и создайте функцию. Я собираюсь продолжить на примере корзины покупок из предыдущей и сделаю функцию для расчета налога на продукты.
Создайте новый файл в вашей IDE или текстовом редакторе, и давайте создадим функцию для расчета налога на продукт.
1
2
3
|
def addTax(price, tax):
newPrice = price / 100 * (100 + tax)
return newPrice
|
Если мы сохраним этот файл с расширением .py
в том же каталоге, что и наш другой скрипт, мы сможем использовать его как модуль! Важно дать ему описательное имя, чтобы вы знали, что он делает, когда вы вернетесь позже, так что назовите это finance.py
Импорт модулей
Чтобы использовать модули, мы можем использовать ключевое слово import
или from
. import
является самым простым и наиболее распространенным, поэтому давайте сначала попробуем. Затем вы указываете имя модуля, которое является просто именем файла, без расширения .py
. Например, с нашим finance
модулем в той же папке, что и наш скрипт, мы могли бы написать:
1
|
import finance
|
… и у нас будет доступ ко всем функциям в сценарии. Затем мы можем позвонить им так же, как и раньше. Вы также можете использовать ключевое слово from
, которое позволяет вам выбирать конкретные функции из библиотеки, если вы знаете, какие из них вам требуются заранее. Для модуля с сотнями функций это рекомендуется — это экономит время загрузки функций, которые даже не используются.
1
|
from finance import addTax
|
Вы можете импортировать несколько, разделяя их имена запятыми.
1
|
from finance import addTax, calculateDiscount
|
И вы даже можете использовать символ звездочки для импорта всего.
1
|
from finance import *
|
После импорта модуля, чтобы использовать функции, содержащиеся в нем, вы используете имя модуля, затем точку, а затем имя функции.
1
2
|
import finance
print finance.addTax(100, 5)
|
Это должно привести к 105 при запуске сценария. Простой результат, но это означает, что у вас есть рабочая функция!
Встроенные модули
Существует множество встроенных модулей, как и со встроенными функциями. Вот где Python действительно превосходен! Требуется так называемый подход «включенные батареи».
Поскольку в Python имеется такой обширный набор встроенных модулей, нет способа охватить их все за один урок. Некоторые из них довольно неясны, и нет смысла учить кучу информации, которую вы никогда не сможете использовать. Вместо этого давайте рассмотрим несколько наиболее полезных.
-
random
-
math
-
os
-
datetime
-
urllib2
random
Хороший вариант для начала — random
, потому что он прост для понимания и полезен в большинстве написанных вами сценариев. Как и следовало ожидать, этот модуль позволяет генерировать случайные числа. Например, при использовании Python для создания веб-сайта их можно использовать для повышения безопасности вашей базы паролей или включения функции случайной страницы. Если нам нужно случайное целое число, мы можем использовать функцию randint
, например, так:
1
2
|
import random
print random.randint(0, 5)
|
Это выведет либо 1, 2, 3, 4 или 5. Randint принимает ровно два параметра: наименьшее и наибольшее число. Как видите, он включает в себя наибольшее число, но идет от 1 выше самого низкого числа. Если вы хотите случайное число с плавающей запятой, вы можете использовать random
функцию:
1
2
|
import random
random.random()
|
… который выводит случайное число в диапазоне от 0 до 1 до десятичных разрядов. Если вы хотите большее число, вы можете умножить его. Например, случайное число от 0 до 100:
1
2
|
import random
random.random() * 100
|
random
модуль также имеет функцию для выбора случайного элемента из набора, такого как список, называемый choice
.
1
2
3
|
import random
myList = [1, 8, True, 77, «Lorem», 482, «Ipsum»]
random.choice(myList)
|
math
math
модуль обеспечивает доступ к математическим константам и функциям.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
import math
math.pi #Pi, 3.14…
math.e #Euler’s number, 2.71…
math.degrees(2) #2 radians = 114.59 degreees
math.radians(60) #60 degrees = 1.04 radians
math.sin(2) #Sine of 2 radians
math.cos(0.5) #Cosine of 0.5 radians
math.tan(0.23) #Tangent of 0.23 radians
math.factorial(5) #1 * 2 * 3 * 4 * 5 = 120
math.sqrt(49) #Square root of 49 = 7
|
В модуле намного больше функций, но это одни из самых полезных. Вы можете найти полный список здесь .
datetime
Если вам нужно работать с датами и временем, то модуль datetime
— ваш друг. Это очень полезно знать для веб-разработки. Если вы создаете веб-сайт с комментариями или блог, вы, вероятно, будете отображать их возраст или время их создания.
Давайте импортируем модуль как обычно:
1
|
import datetime
|
Для удобства вы также можете импортировать компоненты даты и времени по отдельности, чтобы вам не приходилось печатать так много позже.
1
2
3
|
import datetime
from datetime import date
import time
|
Давайте посмотрим на некоторые из функций, которые он предоставляет:
1
2
3
4
5
6
|
time.time() #Returns the number of seconds since the Unix Epoch, January 1st 1970
date.fromtimestamp(123456789) #Converts a number of seconds to a date object
date.fromtimestamp(time.time()) #We can combine the two to get an object representing the current time
date.fromordinal(10000) #Returns the date a given number of days since January 1st in the Year 1 — 28th of May 0018 in this case
|
Есть несколько полезных функций для преобразования дат в пригодные для использования строки. strftime
позволяет форматировать строку на основе специальных символов, перед которыми стоит символ процента. %d
представляет день, например.
1
2
3
4
|
currentDate = date.fromtimestamp(time.time()) #Create a variable representing the time now
currentDate.strftime(«%d/%m/%y») #Format the date like DD/MM/YY — in this case 09/07/11
currentDate.isoformat() #Format as an ISO standard date — in this case 2011-07-09
|
os
Следующий модуль, который мы рассмотрим, это os
, который предоставляет функции, которые позволяют вам взаимодействовать с базовой операционной системой, на которой работает Python — будь то Windows, Mac или Linux. Мы сосредоточимся на подмодуле path
. Он позволяет вам манипулировать и находить свойства файлов и папок в системе, поэтому он наиболее полезен для веб-разработки. Вам часто нужно управлять файлами, например, пользовательскими загрузками.
1
2
3
4
|
from os import path
path.exists(«/Users/Giles») #Checks if the directory exists, in my case it’s True
path.exists(«/Users/Bob») #False this time
|
1
2
3
|
from os import path
path.getatime(«/Users») #Get the last time the given directory was accessed as a timestamp
path.getmtime(«/Users») #Get the last time the given directory was modified as a timestamp
|
Эти временные метки могут быть преобразованы в пригодные для использования строки с помощью модуля datetime
— вы можете увидеть, как можно объединять модули.
1
2
|
from os import path
path.getsize(«/Users/Giles/Desktop/boot») #Returns the size of a file in bytes — for this file it was 314400 bytes, or 314kb
|
Последняя функция в модуле os, которую мы рассмотрим, это join
. Он объединяет два пути в один. Вы можете подумать: «Почему я не могу просто объединить строки?», Но это не так просто. В Windows разделитель пути — это обратная косая черта, в Mac и Linux — косая черта. Этот модуль устраняет подобные проблемы и обеспечивает работу ваших скриптов Pythons в любой системе.
1
|
path.join(«C:», «Users») #Returns «C:/Users»
|
urllib2
Чтобы завершить наш тур по стандартной библиотеке Python, мы кратко рассмотрим urllib2
. Этот модуль позволяет вам взаимодействовать с сетью, поэтому он, очевидно, весьма актуален для нас. Самая полезная функция, которую он предоставляет, — это urlopen
, который загружает страницу.
Вы используете его следующим образом:
1
2
|
import urllib2
urllib2.urlopen(«http://net.tutsplus.com»)
|
Очевидно, что вы можете поменять строку URL для любого сайта. Это загрузит HTML-содержимое страницы. Это не вернет строку, поэтому нам нужно прочитать данные, чтобы получить это:
1
2
|
import urllib2
urllib2.urlopen(«http://net.tutsplus.com»).read(100)
|
Это вернет первые 100 символов HTML-источника Nettuts +. Получив эти данные, вы можете отсортировать их и извлечь необходимые биты.
Заключительные советы
Если ваш модуль находится в другом каталоге, чем ваш скрипт, импортировать его немного сложнее. Вы должны создать файл, который сообщает Python, что папка является пакетом. Например, если у вас есть папка с именем subdirectory в той же папке, что и ваш скрипт, а затем ваш модуль в этом подкаталоге, вам придется создать файл с именем __init__.py
в той же папке, что и модуль. Этот файл может быть пустым. Затем из вашего скрипта вы импортируете его:
% обзор, если вам нужно освежить!
Видеоурок
расшифровка
В сегодняшнем уроке мы рассмотрим функции — каковы они, как они работают и как создавать свои собственные. Мы также собираемся рассмотреть некоторые из встроенных функций и способы их эффективного использования. Наконец, мы собираемся взглянуть на создание и импорт модулей.
Функции — написание своего
Функции — важный шаг, который нужно охватить при внесении дополнительной сложности в ваше программирование. Если переменная является именованным контейнером для данных, то функция является именованным контейнером для блока кода, который может быть выполнен по требованию. Это полезно, если у вас есть программа, которая выполняет определенную операцию много раз. Вместо того, чтобы копировать и вставлять код для выполнения этой операции в каждом разделе, где это необходимо, вы можете просто написать одну функцию, которая сделает это за вас.
Функция — это именованный контейнер для блока кода.
Существует два типа функций: те, которые вы пишете сами и включаете в свой код, и те, которые изначально включены в Python, которые выполняют общие процедуры, такие как преобразование целого числа в строку или определение длины строка.
Сейчас мы рассмотрим написание простой функции и продемонстрируем, как она может быть полезна в реальном коде. Затем мы рассмотрим некоторые из наиболее важных встроенных функций.
Простой пример
Давайте представим, что мы хотим создать сценарий для корзины покупок, который берет стоимость всех товаров в вашей корзине, а затем складывает их вместе, чтобы получить общую стоимость. Чтобы написать функцию, которая потребует двух затрат, сложит их, а затем распечатает вывод, мы могли бы сделать что-то вроде:
01
02
03
04
05
06
07
08
09
10
|
#our two costs to add up
cost1 = 15
cost2 = 20
def sumCart():
totalCost = cost1 + cost2
print totalCost
sumCart()
|
Чтобы определить функцию, нам нужно использовать ключевое слово « def
», а затем имя функции. Затем мы вводим две скобки (мы вернемся к ним позже), а затем двоеточие. После этого весь код, который мы