Я учусь программировать на Python: переменные и функции
В прошлый раз я рассказал, чем хорош язык Python. Те, кто с ним знаком, наверняка со мной согласны, но есть и те, кто учат другие языки программирования — или вообще не знают ни одного языка. Специально для них я посвящу ближайшие посты разбору основ, которые помогут нам не только с Python, но и с другими языками в будущем. Тем же, кто всё это хорошо знает (а я уверен, таких среди читателей много), никогда не помешает повторить основы.
Предупреждаю: этот пост ни в коем разе не претендует на первую главу учебника по программированию, но, чтобы он послужил хорошей мотивацией, я укажу в конце ссылки, где о тех же вещах рассказывают подробнее, а главное — точнее. Кроме того, учтите, что код приводится для версий 3.0 и старше и, вероятно, не будет работать на версии 2.7.
Вернёмся к двум строчкам кода, которыми я закончил предыдущий пост, и разберём каждую его составляющую в том порядке, в котором интерпретатор — программа, переводящая код на машинный уровень и запускающая его, — будет считывать код.
best_website = «Look At Me»
print(«Hello, <>!».format(best_website))
best_website — это название переменной. Переменная — это занятая нами область памяти, в которой мы храним данные. При желании переменной best_website можно присвоить другое значение. Допустим, вы считаете, что Look At Me — далеко не лучший сайт, и вам больше нравится «Метрополь». Тогда вы можете написать best_website = «Metropol», и у переменной best_website будет соответствующее значение.
В Python названия переменных могут содержать только латинские буквы и целые числа, при этом названия должны всегда начинаться с буквы. Для разделения слов внутри названия в Python принято использовать подчёркивания — так названия удобнее читать (помните, что пробелы запрещены). Сразу рекомендую по возможности не называть переменные одной или двумя буквами: из названия должно быть понятно, что хранит эта переменная.
Знак «равно» (=) — это оператор присваивания в Python и многих других языках. Иначе говоря, переменной, указанной слева от него, присваивается некое значение, указанное справа. Обычно этот оператор отделяют от названия переменной и присваиваемого ей значения одним пробелом.
«Look At Me» — значение, присваиваемое переменной. Кавычки указывают на то, что тип хранимых данных — string, содержащий последовательность букв и других символов. Кавычки могут быть и одинарными — ‘ ‘, но если вы хотите использовать кавычки внутри кавычек, то внешние придётся делать двойными.
Интерпретатор определяет конец строки, понимает, что наше утверждение (statement), то есть вся текущая строка, завершено, и переходит на следующую строку.
print() — стандартная функция вывода в Python, в её скобках задаются аргументы — значения, которые мы хотим ей дать. Функции повышают уровень абстракции языка и позволяют вам не задумываться над всеми сложными вещами, которые скрываются за каждой строчкой кода. В нашем случае функция принимает один аргумент, но некоторые функции могут и не принимать аргументов — в таком случае скобки будут пустыми, но указывать их у функции нужно обязательно.
«Hello, <>!» — аргумент функции. Кавычки указывают на то, что у него тип данных string. Надпись должна быть вам понятна, это классика, но, возможно, с толку собьёт символ <>. О нём чуть позже.
.format() — это метод, частный случай функции. Разницу между понятиями функции и метода я поясню в одном из следующих постов, пока лишь обращу внимание на то, что метод .format() используется в нашем случае строго на объекте типа string, с которым его разделяет точка.
(best_website) — аргумент метода format(), который выводится на месте символа <> из пункта 6. Следовательно, если вы задали своим любимым сайтом не Look At Me, а «Метрополь», то и выведется значение, хранимое в переменной, — «Metropol».
Интерпретатор видит, что дошёл до конца кода и прерывает работу программы.
Программистам нужно не только уметь пользоваться функциями, заложенными в язык, но и писать свои. Напишем простую функцию, которая будет возвращать квадрат заданного числа:
def square(number):
return number * number
Квадрат числа — это число, умноженное само на себя. Следовательно, чтобы возвести number в квадрат, нужно умножить number на number. Давайте разберём эти две строки.
def — ключевое слово, сообщающее интерпретатору, что следом дано определение (definition) функции.
square — название функции. Мы называем функции по тем же правилам, что и переменные.
(number) — название аргумента функции. В нашем случае мы ожидаем, что это будет целое число — тип данных integer.
: — двоеточие обозначает, что на следующей строке будет блок кода, относящийся к текущей строке. Всё содержимое функции находится внутри этого блока, при этом он отделяется от текущей строки четырьмя пробелами.
return — оператор, который говорит о том, что функция возвращает следующее за ним утверждение. В нашем случае это аргумент, умноженный сам на себя: int * int, где * — оператор умножения. Функция может и ничего не возвращать, если это не требуется.
Чтобы воспользоваться функцией, достаточно вызвать её после двух этих строк. Так, строка print(square(9)) приведёт к тому, что программа выведет квадрат девяти — 81.
Последнее, что мы добавим сегодня в скрипт, — стандартную для Python функцию input(), которая позволит нам после запуска программы ввести число, квадрат которого мы хотим получить. Так как введённое нами число будет типом данных string, нужно перевести его в тип данных integer — делается это с помощью функции int(). Вот полный код нашей программы:
def square(int):
return int * int
number = int(input(«Enter an integer: «))
print(«The square of <> is <>.».format(number, square(number)))
Внутри функции input() находится текст, который будет выводиться при вводе числа. Пробел после двоеточия стоит, чтобы вводимое число не следовало сразу за двоеточием. Функция input() помещается в int(), и результат присваивается переменной number, которая затем используется методом .format(), один из аргументов которого — вызов функции square().
У этого скрипта есть как минимум две проблемы. Во-первых, он перестаёт работать, если мы введём после запуска не целое число, а что-нибудь ещё — например, букву. Во-вторых, он перестаёт работать и сразу после того, как выведет ответ, — а что если мы хотим посчитать квадраты нескольких чисел? Всё это мы исправим в следующий раз, а пока постарайтесь переварить то, что мы с вами изучили (или повторили) сегодня.
Пожалуйста, если вам что-то непонятно, пишите комментарии под постом и в социальных сетях — буду рад и любым другим отзывам. Если вы более опытный в программировании человек, чем я, то с удовольствием выслушаю содержательную критику. Спасибо, и до следующего раза!
Кстати, о скрипте из первого домашнего задания, которое я дал себе в дебютном выпуске блога: он сидит и ждёт своего часа.
Полные курсы Python на Codeacademy и Treehouse*
* — платные курсы, но есть пробный период
Переменные в Python на Learnpython.org и Python Course
Функции в Python на Learnpython.org и Python Course
Python: Кавычки
В этом уроке мы разберемся, что такое строка и какую роль в коде играют кавычки.
Определить строку довольно просто — это некий набор символов. Представим, что у нас есть такие записи:
'Hello' 'Goodbye' 'G' ' ' ''
Какие из этих вариантов — строки? На самом деле, все пять вариантов подходят:
- С ‘Hello’ и ‘Goodbye’ все очевидно — мы уже работали с подобными конструкциями и называли их строками
- ‘G’ и ‘ ‘ — тоже строки, просто в них всего по одному символу
- » — это пустая строка, потому в ней ноль символов
Строкой мы считаем все, что находится внутри кавычек: даже если это пробел, один символ или вообще отсутствие символов.
Выше мы записывали строки в одинарных кавычках, но это не единственный способ. Можно использовать и двойные:
print("Dracarys!")
Теперь представьте, что вы хотите напечатать строчку Dragon’s mother. Апостроф перед буквой s — это такой же символ, как одинарная кавычка. Попробуем:
print('Dragon's mother') # SyntaxError: invalid syntax
Такая программа не будет работать. С точки зрения Python строчка началась с одинарной кавычки, а потом закончилась после слова dragon. Дальше были символы s mother без кавычек — значит, это не строка. А потом была одна открывающая строку кавычка, которая так и не закрылась: ‘) . Этот код содержит синтаксическую ошибку — это видно даже по тому, как подсвечен код.
Чтобы избежать этой ошибки, мы используем двойные кавычки. Такой вариант программы сработает верно:
print("Dragon's mother")
Теперь интерпретатор знает, что строка началась с двойной кавычки и закончиться должна тоже на двойной кавычке. А одинарная кавычка внутри стала частью строки.
Верно и обратное. Если внутри строки мы хотим использовать двойные кавычки, то саму строку надо делать в одинарных. Причем количество кавычек внутри самой строки неважно.
Теперь представим, что мы хотим создать такую строку:
Dragon's mother said "No"
В ней есть и одинарные, и двойные кавычки. Нам нужно каким-то образом указать интерпретатору, что кавычки — это один из символов внутри строки, а не начало или конец строки.
Для этого используют символ экранирования: \ — обратный слэш. Если мы поставим \ перед кавычкой (одинарной или двойной), то интерпретатор распознает кавычку как обычный символ внутри строки, а не начало или конец строки:
# Экранируем кавычки вокруг No, чтобы интерпретатор # распознал их как часть строки print("Dragon's mother said \"No\"") # => Dragon's mother said "No"
Обратите внимание, что в примере выше нам не пришлось экранировать одинарную кавычку (апостроф ‘s), потому что сама строка создана с двойными кавычками. Если бы строка создавалась с одинарными кавычками, то символ экранирования нужен был бы перед апострофом, но не перед двойными кавычками.
Если нужно вывести сам обратный слеш, то работает такое же правило. Как и любой другой специальный символ, его надо экранировать:
print("\\") # => \
Задание
Напишите программу, которая выведет на экран:
"Khal Drogo's favorite word is "athjahakar""
Программа должна вывести на экран эту фразу в точности. Обратите внимание на кавычки в начале и в конце фразы:
"Khal Drogo's favorite word is "athjahakar""
Упражнение не проходит проверку — что делать?
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя
Это нормально , в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Python: экранирование кавычек
В этой краткой статье рассматривается использование одинарных, двойных и тройных кавычек в Python.
Одинарные и двойные кавычки — базовое использование
Чаще всего одинарные и двойные кавычки в Python используются при создании строк. В них заключается последовательность символов.
>>> quotes_single = 'a_string' >>> quotes_double = "a_string" >>> quotes_single == quotes_double True
Строки, созданные с помощью одинарных и двойных кавычек, идентичны. Но нельзя их смешивать, так как это приведет к синтаксической ошибке.
>>> "mixed quotes' File "", line 1 "mixed quotes' ^ SyntaxError: EOL while scanning string literal >>> 'mixed quotes" File "", line 1 'mixed quotes" ^ SyntaxError: EOL while scanning string literal
Варианты экранирования
В Python если строка содержит специальные символы, такие как кавычки, мы должны экранировать их. Пример неправильного использования:
>>> 'It's a bad example.' File "", line 1 'It's a bad example.' ^ SyntaxError: invalid syntax
Чтобы не допустить эту ошибку, нужно экранировать одиночную кавычку, поставив перед ней обратную косую черту. Также можно использовать двойные кавычки вместо одинарных для обозначения строки:
>>> 'It's a good example.' "It's a good example." >>> "It's a good example." "It's a good example."
Если строка содержит двойные кавычки, можно использовать одинарные. Тогда не придется экранировать двойные кавычки. Пример:
>>> 'She said, "Thank you!"' 'She said, "Thank you!"'
Но если в строке есть одинарные и двойные кавычки, и вы не экранируете содержащие строку, это приведет к синтаксической ошибке.
>>> print('She said, "Thank you! It's mine."') File "", line 1 print('She said, "Thank you! It's mine."') ^ SyntaxError: invalid syntax >>> print('She said, "Thank you! It's mine."') She said, "Thank you! It's mine."
Тройные кавычки
Обозначение строк, содержащих одинарные и двойные кавычки
Мы можем использовать тройные кавычки (то есть три одинарные кавычки или три двойные кавычки) для представления строк с одинарными и двойными кавычками, чтобы исключить необходимость экранирования любых кавычек.
>>> print('''She said, "Thank you! It's mine."''') She said, "Thank you! It's mine."
К огда строка начинается или заканчивается одинарной (двойной) кавычкой, и мы хотим использовать тройные кавычки для обозначения строки, нужно применять те, которые отличаются от начальной или конечной .
Например, для строки в приведенном выше коде использование тройных двойных кавычек приведет к синтаксической ошибке. Поэтому необходимо использовать тройные одинарные кавычки.
>>> print("""She said, "Thank you! It's mine."""") File "", line 1 print("""She said, "Thank you! It's mine."""") ^ SyntaxError: EOL while scanning string literal
Многострочные строки
Также тройные кавычки используются для представления многострочной строки. Пример:
>>> print("""Hello . World . !""") Hello World !
Этого же можно добиться, используя символ n для создания многострочных строк. Но это затрудняет чтение строки. А использование тройных кавычек позволяет записать строку так, как она есть.
>>> def multiple_line_comment(a, b): . ''' . a is a string # other additional description . b is a list of integers # other additional description . ''' . pass . >>> print(multiple_line_comment.__doc__) a is a string # other additional description b is a list of integers # other additional description
Мы сразу видим, что является многострочным комментарием для функции.
Выводы
В этой статье мы рассмотрели применение одинарных, двойных и тройных кавычек в Python. Краткий обзор вариантов использования:
Одинарные и двойные кавычки
- Используются для определения строк.
- Применяйте одинарные кавычки для определения строк, чтобы избежать необходимости экранирования двойных кавычек в строке.
Тройные кавычки:
- Используются для определения строк, содержащих как одинарные, так и двойные кавычки. Поэтому экранирование не требуется.
- Используются для определения многострочных строк.
Сергей Бензенко автор-переводчик статьи « Single, Double, and Triple Quotes in Python »
2. Переменные, выражения и предложения¶
Значение — это одна из фундаментальных вещей, которыми манипулирует программа. Значения, которые мы уже видели в главе 1:
- 2 (результат сложения 1 + 1 ) и
- "Hello, World!" .
Эти значения относятся к разным типам: 2 — целое число, а "Hello, World!" — строка, представляющая собой последовательность символов. Строковые значения можно опознать по кавычкам, в которые они заключаются.
Предложение print работает не только со строками, но и с целыми числами.
>>> print 4 4
Если вы не уверены, какого типа то или иное значение, интерпретатор может подсказать вам.
>>> type(«Hello, World!») >>> type(17)
Строки (англ.: string) принадлежат типу str, а целые числа (англ.: integer) — типу int.
Не столь очевидно, что числа, имеющие целую и дробную части, относятся к типу float (англ.: плавать). Название типа данных объясняется тем, что такие числа в компьютере представляются в формате с плавающей точкой.
В России при записи чисел, имеющих целую и дробную части, принято отделять целую часть от дробной при помощи запятой, например: 3,2 . Тогда как во многих других странах, а также в языках программирования (и Python не является исключением), целую часть числа от дробной отделяют при помощи точки. В таких случаях точку называют десятичной точкой.
>>> type(3.2)
Что касается запятой, то она является допустимым символом в Python, но используется для других целей. Хотя 3,2 — неверная запись числа, это допустимая конструкция Python. Если попробовать вывести значение 3,2 , то получим:
>>> print 3,2 3 2
Python интерпретирует 3,2 как список из двух элементов: 3 и 2 . Поэтому не пользуйтесь запятыми для записи чисел с целой и дробной частью!
А что можно сказать о таких значениях, как "17" и "3.2" ? Они выглядят как числа, но они заключены в кавычки, как строки.
>>> type(«17») >>> type(«3.2»)
Строки в Python могут заключаться в одиночные (‘) или в двойные кавычки (”):
>>> type(‘This is a string.’) >>> type(«And so is this.»)
Строки, заключенные в двойные кавычки, могут содержать внутри одинарные кавычки, как в "Say 'Hello'" , а строки, заключенные в одинарные кавычки, могут содержать двойные кавычки, как в 'Say "Hi"' .
2.2. Переменные¶
Одна из сильнейших возможностей языков программирования — возможность работать с переменными. Переменная представляет собой имя, которое ссылается на значение.
Предложение присваивания создает новые переменные и присваивает им значения:
>>> message = "Say 'Hello'" >>> n = 17 >>> pi = 3.14159
В этом примере три предложения присваивания. Первое присваивает строку "Say 'Hello'" новой переменной с именем message . Второе присваивает целое значение 17 переменной n , а третье присваивает число с плавающей точкой 3.14159 переменной pi .
Оператор присваивания = не следует путать со знаком равенства, хотя он и обозначается тем же самым символом. Оператор присваивания связывает имя, стоящее слева от него, со значением, находящимся справа от него. Вот почему вы получите ошибку, если введете:
>>> 17 = n
Можно изобразить переменные в виде имен со стрелками, указывающими на значения. Следующий рисунок показывает результат выполнения предложений присваивания, приведенных выше:

Предложение print также работает с переменными.
>>> print message Say 'Hello' >>> print n 17 >>> print pi 3.14159
В каждом случае результатом выполнения предложения print является вывод значения переменной. Переменные также имеют типы, и интерпретатор сообщит нам о них:
>>> type(message) >>> type(n) >>> type(pi)
Тип переменной в Python есть тип присвоенного ей значения.
Замечание: Для работы со строковыми значениями на русском языке, или любом другом языке, в котором используются символы, отличные от латинских, нужно познакомиться с тем, что такое кодировка и кое-чему дополнительно научиться. Подробности можно найти в Приложении A. Как научить Python русскому языку.
2.3. Имена переменных и ключевые слова¶
Программисты обычно выбирают значимые имена для своих переменных; имя описывает, для чего именно используется переменная.
Имена переменных могут быть произвольной длины. Они могут содержать буквы и цифры, но обязаны начинаться с буквы. Хотя допустимо использовать буквы верхнего регистра, по существующему соглашению они не используются. Если вы захотите их использовать, помните, что регистр имеет значение. Bruce и bruce — это две разные переменные.
В имени можно использовать символ подчеркивания ( _ ). Он часто используется в именах, состоящих из нескольких слов, таких, как my_name или price_of_tea_in_china .
Если дать переменной недопустимое имя, это приведет к синтаксической ошибке:
>>> 76trombones = "big parade" SyntaxError: invalid syntax >>> more$ = 1000000 SyntaxError: invalid syntax >>> SyntaxError: invalid syntax
Имя 76trombones недопустимо потому, что начинается не с буквы. Имя more$ неправильно потому, что содержит недопустимый символ доллара. А что не так с class ?
Слово class является одним из ключевых слов Python. Ключевые слова определяют правила и структуру языка, и не могут использоваться как имена переменных.
В языке Python 31 ключевое слово:
| and | as | assert | break | class | continue |
| def | del | elif | else | except | exec |
| finally | for | from | global | if | import |
| in | is | lambda | not | or | pass |
| raise | return | try | while | with | |
| yield |
Можете держать этот список под рукой. Если интерпретатор пожалуется на одно из имен ваших переменных и вы не будете знать, почему, проверьте, нет ли его в этом списке.
2.4. Предложения¶
Предложение — это инструкция, которую интерпретатор Python может выполнить. До сих пор мы видели два вида предложений: print и присваивание.
Если ввести предложение в строке с приглашением, Python выполнит его и отобразит результат, если таковой имеется. Результатом выполнения предложения print является выведенное значение. Предложение присваивания не производит результата.
Скрипт обычно содержит последовательность предложений. Если имеется более одного предложения, результаты появляются по мере выполнения предложений.
print 1 x = 2 print x
Обратите внимание, что предложение присваивания ничего не выводит.
2.5. Вычисление выражений¶
Выражение есть комбинация значений, переменных и операторов. Если вы введете выражение в строке с приглашением, интерпретатор вычислит его и отобразит результат:
>>> 1 + 1 2
Вычисление выражения производит значение, вот почему выражения могут появляться в правой части предложения присваивания. Введенное значение само по себе является простым выражением, так же, как и имя переменной.
>>> 17 17 >>> x 2
Обратите внимание, что вычисление выражения и отображение результата — не то же самое, что печать значения выражения.
>>> message = "Say 'Hello'" >>> message "Say 'Hello'" >>> print message Say 'Hello'
Когда Python в интерактивном режиме отображает значение выражения, он использует тот же формат, который используется для ввода значения. В случае строк это означает, что кавычки также выводятся. А предложение print печатает значение выражения, которым в данном случае является содержание строки (без кавычек).
В скрипте выражение само по себе является допустимым предложением, но оно ничего не делает. Скрипт
17 3.2 "Hello, World!" 1 + 1
не выводит совсем ничего. Как изменить этот скрипт для того, чтобы отобразить значения всех четырех выражений?
2.6. Операторы и операнды¶
Операторы — это специальные символы, обозначающие операции, например, такие, как сложение и умножение. Значения, с которыми работает оператор, называются операндами.
Вот несколько допустимых выражений Python, смысл которых более или менее ясен:
20 + 32 hour - 1 hour * 60 + minute minute / 60 5 ** 2 (5 + 9) * (15 - 7)
Символы + , - и / , а также использование скобок для группировки операций, означают в Python то же, что и в математике. Звездочка * обозначает умножение, а две звездочки подряд ** обозначают возведение в степень. Пробелы вокруг операторов не обязательны, однако они облегчают чтение выражений.
Когда на месте операнда оказывается имя переменной, оно заменяется значением переменной, прежде чем выполняется операция.
Сложение, вычитание, умножение и возведение в степень ведут себя так, как вы и ожидаете, но вас может удивить деление. Следующая операция дает неожиданный результат:
>>> minute = 59 >>> minute / 60 0
Значением minute является 59, а 59, деленное на 60, дает 0.98333, а не 0. Полученный результат объясняется тем, что Python выполняет целочисленное деление.
Когда оба операнда целые, результат также должен быть целым. По существующему соглашению, результат целочисленного деления всегда округляется в меньшую сторону, даже когда большее целочисленное значение совсем рядом.
Поскольку нельзя получить дробный результат, пользуясь операцией / , то вычислим проценты:
>>> minute * 100 / 60 98
Вновь результат округлен в меньшую сторону, но, по крайней мере, теперь он приблизительно правильный.
Альтернативой является деление чисел с плавающей точкой. В главе 4 мы увидим, как преобразовывать целые числа в числа с плавающей точкой.
2.7. Порядок выполнения операций¶
Когда в выражении имеется более одного оператора, порядок вычислений зависит от приоритета операций. Python использует для математических вычислений тот же приоритет операций, что используется в математике:
- Скобки имеют наивысший приоритет. Поскольку выражение в скобках вычисляется первым, то 2 * (3 - 1) дает 4, а (1 + 1) ** (5 - 2) дает 8. Можно использовать скобки и для того, чтобы сделать выражения легче для чтения, например, (minute * 100) / 60 , хотя на результат это никак не влияет.
- Возведение в степень имеет следующий приоритет после скобок, так что 2 ** 1 + 1 дает 3, а не 4, и 3 * 1 ** 3 дает 3, а не 27.
- Умножение и деление имеют одинаковый приоритет, более высокий, чем сложение и вычитание, приоритет которых также одинаковый. Так, 2 * 3 - 1 дает 5, а не 4, и 2 / 3 - 1 даст -1, а не 1 (помните о целочисленном делении, 2 / 3 = 0).
- Операторы с одинаковым приоритетом вычисляются слева направо. Так, в выражении minute * 100 / 60 сначала выполняется умножение, что дает 5900 / 60, которое, в свою очередь, дает 98. Если бы операции выполнялись справа налево, результат бы был 59 * 1 , что дает 59, и в целом неверно.
2.8. Операции над строками¶
Нельзя выполнять математические операции над строками, даже если строки выглядят как числа. Следующие выражения недопустимы (предполагаем, что message имеет тип str ):
message - 1 "Hello" / 123 message * "Hello" "15" + 2
Интересно, что оператор + все же работает со строками, хотя и делает не то, чего можно было бы ожидать. Для строк оператор + выполняет конкатенацию, то есть соединение двух операндов вместе. Например:
>>> fruit = "banana" >>> baked_good = " nut bread" >>> print fruit + baked_good banana nut bread
Пробел перед словом nut является частью строки, присваиваемой переменной baked_good , и необходим для того, чтобы между словами banana и nut в выводе программы оказался пробел.
Оператор * также работает со строками. Он выполняет повторение строки. Например, 'Fun' * 3 дает 'FunFunFun' . Один из операндов обязан быть строкой, другой — целым числом.
С одной стороны, такая интерпретация символов + и * имеет смысл по аналогии со сложением и умножением. Так же, как 4 * 3 эквивалентно 4 + 4 + 4 , мы ожидаем, что "Fun" * 3 будет эквивалентно "Fun" + "Fun" + "Fun" , и так оно и есть. С другой стороны, есть существенный момент, который отличает конкатенацию и повторение строк от сложения и умножения чисел. Можете сами отыскать свойство, которым обладают сложение и умножение чисел, но не обладают конкатенация и повторение строк?
2.9. Ввод¶
В Python есть две встроенные функции для получения ввода с клавиатуры:
n = raw_input("Please enter your name: ") print n n = input("Enter a numerical expression: ") print n
Пример выполнения этого скрипта может выглядеть так:
$ python tryinput.py Please enter your name: Arthur, King of the Britons Arthur, King of the Britons Enter a numerical expression: 7 * 3 21
Каждая из этих функций позволяет внутри скобок указать приглашение для пользователя.
2.10. Композиция¶
До сих пор мы рассматривали элементы программ — переменные, выражения и предложения — по отдельности, не затрагивая вопроса о том, как их комбинировать.
Одним из полезнейших свойств языков программирования является возможность брать маленькие строительные блоки и комбинировать их, или, другими словами, создавать из них композиции. Например, мы знаем как складывать числа и знаем, как выводить на экран. Оказывается, мы можем сделать обе эти вещи сразу:
>>> print 17 + 3 20
В действительности, сложение должно быть выполнено до вывода, так что действия, на самом деле, выполняются не одновременно. Важно то, что любое выражение, включающее числа, строки и переменные, может использоваться в предложении print:
print "Number of minutes since midnight: ", hour * 60 + minute
Можно также поместить произвольные выражения в правую часть предложения присваивания:
percentage = (minute * 100) / 60
Как видите, композиция позволяет записывать сложные вычисления кратко и выразительно.
Предупреждение: Существуют ограничения на то, где можно использовать определенные выражения. Например, левая часть предложения присваивания должна быть именем переменной, а не выражением. Поэтому следующее предложение неверно: minute + 1 = hour .
2.11. Комментарии¶
По мере того, как программы становятся больше и сложнее, они становятся труднее для чтения. Формальные языки плотные в том смысле, что небольшой фрагмент текста может нести много смысла, и, посмотрев на часть кода, бывает непросто понять, что именно этот код делает и почему.
Поэтому хорошей идеей является добавление к вашим программам заметок, которые бы на естественном языке объясняли, что делает программа. Такие заметки называются комментариями, и помечаются символом # :
# calculate elapsed hour percent percentage = (minute * 100) / 60
В этом случае комментарий занимает целую строку. Можно также поместить комментарий в конец строки, содержащей предложение Python:
percentage = (minute * 100) / 60 # integer division!
Все, что следует за символом # до конца строки, игнорируется интерпретатором Python и не оказывает никакого действия на выполнение программы. Комментарии предназначены для самого программиста, или для тех программистов, которые будут читать этот код в будущем. В последнем примере комментарий напоминает читателю программы о том, что при вычислении выражения выполняется целочисленное деление.
Замечание: Для того, чтобы писать комментарии в скриптах на русском языке, необходимо специально позаботиться о кодировке, используемой для хранения текста вашей программы на Python. Подробности можно найти в Приложении A. Как научить Python русскому языку.
2.12. Глоссарий¶
int Тип данных Python, представляющий положительные и отрицательные целые числа. float Тип данных Python, представляющий числа с плавающей точкой. Числа с плавающей точкой имеют внутреннее представление, состоящее из двух частей: мантиссы и степени. При выводе в стандартном формате, они выглядят как десятичные числа с целой и дробной частями. Используя тип float , имейте в виду, что возможны ошибки округления, и всегда помните, что имеете дело с приблизительными значениями. str Тип данных Python, представляющий последовательности символов. выражение Комбинация переменных, операторов и значений, результатом вычисления которой является единственное значение. значение Число или строка (или что-то другое, о чем мы поговорим позднее), которые могут быть сохранены в переменной или использованы в выражении. имя переменной Имя, данное переменной. Имена переменных в Python есть последовательность букв ( a..z, A..Z ), цифр ( 0..9 ) и символа _ , начинающаяся с буквы или символа подчеркивания. Хорошей практикой программирования является выбор таких имен для переменных, которые описывают использование этих переменных в программе. ключевое слово Слово, зарезервированное для специального использования в языке программирования. На ключевые слова опирается компилятор при синтаксическом разборе программы; нельзя использовать ключевые слова, например, if , def и while , в качестве имен переменных. комментарий Информация в программе, предназначенная для программистов (или любого читателя исходного кода) и не оказывающая влияния на выполнение программы. композиция Комбинирование простых выражений и предложений в составные для того, чтобы представить сложные вычисления в удобной и краткой форме. конкатенация Соединение двух строк. операнд То, над чем выполняется операция. оператор Специальный символ, который обозначает операцию, например, сложение, умножение или конкатенацию строк. оператор присваивания Символ = есть оператор присваивания в Python. Его не следует путать со знаком равенства в математике, так как они семантически различны. переменная Имя, связанное со значением. предложение Инструкция, которую интерпретатор Python может выполнить. Примерами предложений языка программирования являются предложение присваивания и предложение print. предложение присваивания
Предложение, которое присваивает значение имени (переменной). Слева от оператора присваивания = находится имя, справа — выражение, которое вычисляется интерпретатором Python и затем присваивается имени. Разница между левой и правой частями предложения присваивания часто сбивает с толку начинающих программистов. В следующем предложении присваивания:
n = n + 1
n играет разные роли по разные стороны от = . На правой стороне n выступает как значение, являющееся частью выражения, которое будет вычислено и затем присвоено имени, находящемуся на левой стороне.
приоритет операций Набор правил, управляющий порядком вычисления выражений, включающих более одного оператора. тип данных Множество значений. Тип значения определяет, как это значение можно использовать в выражениях. Типы, которые мы встречали до сих пор: целые числа (тип int ), числа с плавающей точкой (тип float ) и строки (тип str ). целочисленное деление Операция деления целого на целое, результатом которой является целое. Целочисленное деление дает полное число раз, которое делитель умещается в делимое, и отбрасывает остаток.
2.13. Упражнения¶
- Выясните, что произойдет, если попробовать напечатать предложение присваивания:
>>> print n = 7
