3. Типы данных, встроенные функции
Аннотация
В этом уроке мы познакомимся с типами данных, научимся работать с числами и узнаем о простейших функциях.
Типы данных
Пока единственным типом данных, с которым мы работали, были строки. Теперь нам предстоит рассмотреть целые и вещественные числа. У каждого элемента данных, который встречается в программе, есть свой тип. (В случае с Python более правильный термин — «класс объекта», но об этом мы будем говорить гораздо позже).
Например, «привет» — это строка, а вот 15.3 — это число (дробное). Даже если данные не записаны прямо в программе, а получаются откуда-то еще, у них есть совершенно определенный тип. Например, на место input() всегда подставляется строка, а 2 + 2 даст именно число 4, а не строку “4”.
Пользователь может ввести с клавиатуры какие-то цифры, но в результате input() вернет строку, состоящую из этих цифр. Если мы попытаемся, например, прибавить к этой строке 1, получим ошибку.
Давайте попробуем это сделать:
a = input()
print(a + 1)
Сохраните и запустите программу. Введите любое число и посмотрите, что получится.
Ошибка возникнет потому, что в переменную а у нас попадает строка, а в функции print мы пытаемся сложить эту строку из переменной а и число 1. Исправьте программу так, чтобы она работала.
А если нам надо работать с числами? Мы пока будем рассматривать целые и вещественные числа.
Когда речь идет о числовых данных, они записываются без кавычек.
А для вещественных чисел, чтобы отделить дробную часть от целой, используют точку.
На прошлом занятии мы складывали две строки:
print(’10’ + ’20’)
И получали результат — строку “1020”.
Давайте попробуем в этом примере убрать кавычки. В таком случае речь пойдет уже не о строках, а о двух целых числах.
И результатом функции print(10 + 20) будет целое число 30.
А если мы попробуем сложить два вещественных числа print(10.0 + 20.0), результатом будет вещественное число 30.0.
Попробуйте предположить, что будет, если сложить вещественное число и целое число print(10.0 + 20). Почему?
Операции над числами
Мы выполняли сложение двух чисел внутри функции print, но мы можем переменным давать нужные значения и выполнять действия над переменными.
Давайте напишем программу, которая задаст нужные значения двум переменным (10 и 20), потом вычислит их сумму, положит это значение в третью переменную и выведет на экран полученный результат. Допишите начальные строки, чтобы программа решала поставленную задачу:
…
print(summ)
Обратите внимание: если в качестве имени переменной для суммы взять sum, оно выделяется цветом. Это означает, что такое имя знакомо среде и принадлежит какой-то функции, в качестве имени переменной его лучше не использовать.
Как складывать два числа, мы научились. Еще числа можно вычитать, умножать, делить, возводить в степень, получать целую часть от деления и остаток от деления нацело. Давайте разберем эти операции на примерах.
print(30 – 10)
print(30.0 – 10)
print(3 * 3)
С вычитанием и умножением все понятно, они аналогичны сложению.
Возведение в степень обозначается двумя звездочками **, которые должны записываться без разделителей.
print(9 ** 2)
Обратите внимание: результат деления всегда вещественный, даже если мы делим два целых числа, которые делятся нацело.
print(10 / 2)
Попробуйте поделить на 0. Посмотрите, как будет выглядеть ошибка деления на 0.
Целочисленное деление
Для реализации целочисленного деления существуют два действия: деление нацело и остаток от деления нацело. Получение целой части от деления обозначается как удвоенный знак деления, а остатка от деления нацело — %.
Давайте подробнее разберем эти операции. Что будет выведено в результате этих действий?
print(10 // 3, 10 % 3)
print(10 // 5, 10 % 5)
print(10 // 11, 10 % 11)
Допустим, вам известны результаты a // b, a % b и число b, напишите формулу, как найти число a?
Давайте проверим вашу формулу:
a = 10
b = 3
print(…А сюда напишем формулу…)
Обратите внимание на порядок выполнения действий в вашей формуле. Целочисленное деление имеет тот же приоритет, что и обычное деление, значит, будет выполнятся раньше, чем вычитание и сложение. Для изменения приоритета выполнения операций используются скобки, все так же, как в математике.
А теперь, немного разобравшись с этими операциями, попробуйте предположить, что выведется на экран после выполнения следующего куска кода:
print(10 // 3, 10 % 3)
print(-10 // 3, -10 % 3)
Определите, что будет выведено на экран?
a = 4
b = 15
c = b / 5 * 3 – a
print(c)
Приоритет операций
Мы уже изучили несколько типов операций в языке Python:
- Операции присваивания (=, +=, -=, *= и т. д.)
- Операции сравнения (==, !=, >, <, >=, <=)
- Арифметические операции (+, -, *, /, %, //)
- Логические операции (and, or, not)
Есть и другие, с которыми познакомимся позднее. Все эти операции могут использоваться совместно в довольно сложных конструкциях, поэтому нужно помнить о приоритете операций и в случае необходимости менять его при помощи скобок.
Итак, приоритет выполнения операций в Python от высшего (выполняется первой) до низшего:
- Возведение в степень (**).
- Унарный минус (-). Используется для получения, например, противоположного числа.
- Умножение, деление (* / % //).
- Сложение и вычитание (+ -).
- Операции сравнения (<= < > >=).
- Операции равенства (== !=).
- Операции присваивания (=).
- Логические операции (not or and).
PEP 8
Если используются операции с разными приоритетами, попробуйте добавить пробелы вокруг операций с самым низким приоритетом. Руководствуйтесь своими собственными суждениями, но никогда не используйте более одного пробела и всегда используйте одинаковое количество пробелов по обе стороны бинарной операции.
Простейшие функции
С действиями над числами определились, осталось разобраться, как получать числа из ввода. Здесь нам поможет важное новое понятие — функция. В математике функция из одного числа (или даже нескольких) делает другое.
Функция
В программировании (и в Python, в частности) функция — это сущность, которая из одного (или даже нескольких) значений делает другое. При этом она может еще и выполнять какие-то действия.
Например, есть функция модуля у = |x|, аналогично в Python есть функция y = abs(x).
Но функции в Python необязательно принимают только числа.
Для того чтобы вводить числа с клавиатуры и потом работать с ними, необходимо найти функцию, которая из строки делает число.
Тип данных целых чисел в Python называется int, дробных чисел — float.
Одноименные функции принимают в качестве аргумента строку и возвращают число, если в этой строке было записано число (иначе выдают ошибку):
a = input()
b = int(a)
print(b + 1)
Или можно написать даже так:
a = int(input())
что будет означать — «получи строку из ввода, сделай из нее целое число и результат помести в переменную а».
И тогда предыдущая программа может быть записана в виде:
a = int(input())
print(a + 1)
Но можно сократить код еще, написав вот так:
print(int(input()) + 1)
Функция int может быть применена и для получения целого числа из вещественного, в таком случае дробная часть будет отброшена (без округления).
Например, print(int(20.5 + 34.1)) выдаст на экран число 54, хотя, если сложить эти числа и не отправлять их в фунцкию int, результат будет 54.6.
В Python cуществует огромное количество различных функций, мы будем знакомиться с ними постепенно. Так, например, для строки можно определить еще и ее длину.
Длина строки
Длина строки — это количество символов в строке.
Для определения длины строки используется стандартная функция Python len().
На примере функции len разберемся с основными понятиями, связанными с использованием функций. Изучите код:
word = input()
length = len(word)
print(‘Вы ввели слово длиной’, length, ‘букв.’)
Использование в программе функции называется «вызов функции». Он устроен так: пишем имя функции — len, а затем в скобках те данные, которые мы передаем этой функции, чтобы она что-то с ними сделала. Такие данные называются аргументами.
В нашем примере данные в скобках должны быть строкой. Мы выбрали в качестве данных значение переменной word, которое пользователь до этого ввел с клавиатуры. То есть значение переменной word выступает здесь в роли аргумента. А функция len выдает длину этой строки. Если пользователь ввел, например, «привет», word оказывается равно строке «привет», и на место len(word) подставляется длина строки «привет», то есть 6.
Обратите внимание: каждый раз, когда мы пишем имя переменной (кроме самого первого раза — в операции присваивания слева от знака равно), вместо этого имени интерпретатор подставляет значение переменной.
Точно так же на место вызова функции (то есть имени функции и ее аргументов в скобках) подставляется результат ее работы, это называется возвращаемое значение функции.
Таким образом, функция len возвращает длину своего аргумента. input — тоже функция (отсюда скобки), она может работать, не принимая никаких аргументов, а может в качестве аргумента принимать сообщение, которое надо вывести перед ожиданием пользовательского ввода. Но всегда считывает строку с клавиатуры и возвращает ее.
print — тоже функция, она не возвращает никакого осмысленного значения, зато выводит свои аргументы на экран. Эта функция может принимать не один аргумент, а сколько угодно. Несколько аргументов одной функции следует разделять запятыми.
На самом деле функция сама по себе — это фактически небольшая программа.
Функции безразлично происхождение значений, которые ей передали в качестве аргумента. Это может быть значение переменной, результат работы другой функции или записанное прямо в коде значение:
print(‘Это слово длиной’, len(‘абракадабра’), ‘букв.’)
Обратите внимание: в предыдущем примере значение переменной word вообще никак не изменилось от вызова функции len. C другой стороны, вызов функции может стоять где угодно, необязательно сразу класть возвращаемое значение в переменную.
Обмен значениями переменных
Давайте попробуем написать программу, которая поменяет местами содержимое переменных а и b. Пусть есть такой код:
a = 3
b = 5
…
…
print(a)
print(b)
Что надо вписать в пропущенные места, чтобы в а лежало 5, а в b лежало 3? При этом числами 3 и 5 пользоваться нельзя.
Как один из вариантов можно использовать дополнительную переменную:
a = 3
b = 5
с = a
a = b
b = c
print(a)
print(b)
А теперь попробуйте написать вариант без дополнительной переменной, через сумму двух чисел.
Но нам повезло, что мы изучаем язык Python, потому что он и поддерживает более простой вариант записи:
a = 3
b = 5
a, b = b, a
print(a)
print(b)
Значения переменных, которые расположены справа от знака «присвоить», в указанном порядке помещаются в переменные слева, в порядке их указания.
Так, используя множественное присваивание, можно задавать нескольким переменным одно значение:
a = b = c = 5