Готовый перевод How to Think Like a Computer Scientist: Learning with Python 2nd Edition. / Как стать программистом: учимся вместе с Python. Второе издание.: Chapter 2 Variables, expressions, and statements

Внимание! Этот перевод, возможно, ещё не готов, так как модераторы установили для него статус «идёт перевод»

2 Переменные, выражения и операции

2.1 Значения и типы данных

Значение является одним из основополагающих принципов языка, наподобие букв или чисел. Значением является число 2 (как результат вычисления 1 + 1) и строка "Hello, World!"

Эти значения принадлежат к разным типам: 2 - целое число, а "Hello, World!" - строка. Вы или интерпретатор можете легко распознать строку, так как она заключена в кавычки.

Выражение print так же работает и с целыми числами:

>>> print 4
4

Если вы не уверены, к какому типу принадлежит значение, интерпретатор подскажет.

>>> type("Hello, World!")
<type 'str'>
>>> type(17)
<type 'int'>

Не удивительно, что строка получила тип str, a целое число - тип int. Немного странным выглядит то, что дробное число получает тип float. На самом деле float - это сокращение от floating-point (плавающая точка).

>>> type(3.2)
<type 'float'>

А что насчет значений "17" и "3.2"? Они выглядят как числа, но заключены в кавычки как строки.

>>> type("17")
<type 'str'>
>>> type("3.2")
<type 'str'>

Это строки.

Строки в python могут быть заключены в одиночные или двойные кавычки.

>>> type('This is a string.')
<type 'str'>
>>> type("And so is this.")
<type 'str'>

Двойные кавычки могут содержать внутри текст с одинарными: "Она сказала: 'Да!' ", и наоборот, одинарные кавычки могут содержать текст с двойными: 'Она сказала: "Да!" '.

Когда вы вводите большое целое число, вы можете по привычке разделить разряды запятыми: 1,000,000. Python не поямет вас:

>>> print 1,000,000
1 0 0

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

2.2 Переменные

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

Присваивание создает новую переменную и назначает ей значение:

>>> message = "What's up, Doc?"
>>> n = 17
>>> pi = 3.14159

Этот пример иллюстрирует три присваивания. Первое присваивает строку "What's up, Doc?" переменной message. Второе назначает целое число 17 переменной n, и третье назначает дробное число 3.14159 переменной pi.

Оператор присваивания, =, здесь не является эквивалентным знаку равенства (хотя обычно он исползуется в этом качестве). Присваивание создает ссылку с именем слева от оператора на значение, расположенное справа справа от него. Вот почему вы получите ошибку, если напишите:

>>> 17 = n

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

Выражение print также работает с переменными:

>>> print message
What's up, Doc?
>>> print n
17
>>> print pi
3.14159

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

>>> type(message)
<type 'str'>
>>> type(n)
<type 'int'>
>>> type(pi)
<type 'float'>

Тип переменной - это тип значения, на которое она ссылается.

2.3 Имена переменных и ключевые слова

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

Имена переменных могут быть произвольной длины. Они могут включать как буквы, так числа, но с чисел начинаться не могут. Также можно использовать буквы в верхнем регистре, но не желательно. Если вы все же используете верхний регистр, помните, что синтаксически это имеет значение. Bruce и bruce - это две разные переменные.

Символ подчеркивания _ также может присутствовать в имени переменной. Он обычно используется в имени, состоящем из нескольких слов, например, my_name или price_of_tea_in_china.

Если вы назовете переменную не правильно, то получите ошибку:

>>> 76trombones = "big parade"
SyntaxError: invalid syntax
>>> more$ = 1000000
SyntaxError: invalid syntax
>>> class = "Computer Science 101"
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

print raise return try while with

yield

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

2.4 Операции

Операции - это инструкции, которые интерпретатор python должен выполнить. Мы уже сталкивались с двумя операциями - print и присваивание.

Когда вы пишите операцию в командной строке, python выполняет ее и выводит результат, если он есть. Результат операции print - это значение переменной. Операция присваивания не имеет результата.

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

Например, скрипт:

print 1
x = 2
print x

приведет к выводу:

1
2

Опять же, операция присваивания результат не возвращает.

2.5 Выражения

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

>>> 1 + 1
2

Решение выражения создает значение, вот почему выражение может находиться в правой части операции присваивания. Значения сами по себе являются простейшими выражениями, и переменные тоже.

>>> 17
17
>>> x
2

Однако, вычисление выражение - это не совсем то же самое что и печать значения.

>>> message = "What's up, Doc?"
>>> message
"What's up, Doc?"
>>> print message
What's up, Doc?

Когда оболочка 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. Причиной такого результата являтся то, что python применил целочисленное деление.

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

Возможным решением этой проблемы является вычисление процента или доли:

>>> minute*100/60
98

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

2.7 Порядок выполнения операций

Когда в выражении присутствует более одного оператора, порядок вычислений устанавливается правилами определения приоритетов. В python приоритеты операторов совпадают с математическими, если в математике такие операторы есть. Акроним PEMDAS - удобный способ запомнить порядок операций:

Скобки (P - parentheses) имеют наивысший приоритет и обычно используются для изменения порядка вычислений. Выражение в скобках вычисляется в первую очередь, 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, что неправильно.

2.8 Операторы и строки

В основном, вы не можете использовать математические операторы для обработки строк. Следующие выражения являются недопустимыми (переменная message имеет строковый тип):

message-1
"Hello"/123
message*"Hello"
"15"+2

Интересно, что оператор +, не предназначенный для работы со сторками, имеет на них определенное воздействие. Для строк, оператор + выполняет операцию конкатенации, что означает соединение двух операндов, например:

fruit = "banana"
baked_good = " nut bread"
print fruit + baked_good

Вывод программы будет: banana nut bread. Пробел до слова 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 "Number of minutes since midnight: ", hour*60+minute

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

percentage = (minute * 100) / 60

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

Будьте внимательны: существуют ограничения на использования составных выражений. Например, в левой части операции присваивания должна стоять переменная, но никак не выражение. Так, следующее неверно: minute+1 = hour.

2.11 Комментарии

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

Поэтому хорошей идеей является добавлять замечания к программе на естественном языке о том, что программа делает в тот или иной момент. Эти замечания называются комментариями, и обозначаются символом #:

# вычисляем долю прошедшего времени
percentage = (minute * 100) / 60

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

percentage = (minute * 100) / 60 # внимание: целочисленное деление

Везде, от символа # до конца строки, код игнорируется - он не имеет никакого влияния на программу. Сообщение предназначенно для программиста, или того, кто будет читать программу в будущем. В этом случае, мы предупредили, чтобы никто не удивлялся результату деления.

2.12 Словарь

Оператор присваивания = - это оператор присваивания в python; не путать со знаком математического равенства, который использует тот же символ.

Операция присваивания - присваивание значения имени (переменной). Слева от оператора присваивания находиться переменная. Справа - выражение, которое вычисляется интерпретатором python и присваивается имени. Разница между левой и правой частью операции присваивания иногда может удивить:

n = n + 1

n играет совершенно разные роли с разных сторон оператора =. Справа - это значение, являющееся частью выражения, которое вычисляется интерпретатором python до присваивания имени, стоящего слева.

Комментарий - информация в программе, оставленная для других программистов (для того, кто будет читать код позже), которая не влияет на выполнение программы.
Композиция - комбинация простых выражений и операций с определенным порядком вычислений.
Конкатенация - оъединение двух строк.
Тип данных - свойство значения, определяющее поведение в выражении или опреации. Мы уже рассмотрели такие типы, как целое число (int), дробные числа (float), строки (str).
Вычисление - операции над переменными для получения конечного результата.
Операция - комбинация значений, переменных и операторов, при вычислении которой получается результирующее значение.
float - тип данных в python для определения чисел с плавающей точкой, дробных чисел.
Число с плавающей точкой - число, сотоящее из двух частей, базовой и экспоненциальной. В стандартном выводе - дробное число с точкой.
int - тип данных в python для определения целых положительных и отрицательных чисел.
Целочисленное деление - операция деления одного целого числа на другое с получением целочисленного результата. Целочисленное деление дает количество делителей, которое может поместиться в делимом.
Ключевое (служебное) слово - зарезервированное слово, которое используется компилятором или парсером программы; нельзя использовать ключевые слова для именования переменных.
Операнд - одно из значений, над которым совершается операция.
Оператор - специальный символ, представляющий простую операцию: сложение, умножение, конкатенацию.
Приоритет операция - набор правил, который определяет порядок выполнения операций в составном сложном выражении.
Диаграмма состояний - графическое представление связи переменной со своим значением.
Операция - инструкция интерпретатору python выполнить вычисление. Примерами являются операции присваивания и вывода на экран.
str - тип данных в python для определения строк.
Значение - число или строка (или ещё что-нибудь, с чем мы столкнемся позже), котоорые можно связать с переменной или поставить в выражение для вычислений.
Переменная - имя, связанное со значением. Имя переменной может содержать буквы (a..z, A..Z) и числа (0..9), но начинаться должно только с буквы. Хорошей практикой является название переменной по ей роли в программе, чтобы по имени было понятно, что она делает, зачем нужна.

2.13 Упражнения

Что получиться, если ввесли следующие выражения:

>>> print n = 7

Или так:

>>> print 7 + 5

Или так:

>>> print 5.2, "this", 4 - 2, "that", 5/2.0

Можете ли вы сформулировать основное правило, которым руководствуется операция print при выводе результата на экран? Что она возвращает?

Сохраните каждое слово предложения "All work and no play makes Jack a dull boy" в отдельной переменной, затем выведите предложение полностью, использую операцию print.

Добавьте скобки в выражение 6 * 1 - 2, чтобы изменить результат с 4 на -6.

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

Разница между функциями input и raw_input заключается в том, что input обрабатывает строки, а raw_input - нет. Попробуйте следующие примеры и посмотрите, что получится:

>>> x = input()
3.14
>>> type(x)

>>> x = raw_input()
3.14
>>> type(x)

>>> x = input()
'The knights who say "ni!"'
>>> x

Что произойдет, если в предыдущем примере опустить кавычки?

>>> x = input()
The knights who say "ni!"
>>> x

>>> x = raw_input()
'The knights who say "ni!"'
>>> x

Попробуйте объяснить, что получилось.

Запустите интерпретатор python и введите bruce + 4. Должно появится сообщение об ошибке:

NameError: имя 'bruce' не определено

Присвойте переменной значение так, чтобы bruce + 4 выдало 10.

Напишите программу (скрипт python) madlib.py, которая будет просить пользователя ввести серии существительных, глаголов, наречий, падежей, глаголов прошедшего времени, и пр., и формировать из них синтаксически верные, но семантически абсурдные сочетания (посмотрите, как это реализовано на http://madlibs.org)

Внимание! Этот перевод, возможно, ещё не готов.
Его статус: идёт перевод

Переведено на Нотабеноиде
http://notabenoid.org/book/9398/28914

Переводчики: czech

Настройки

Готово:

100.00% КП = 1.0