ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 05.12.2023
Просмотров: 832
Скачиваний: 3
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
30
Часть I. Основы языка Python
Листинг 1.5. Выделение инструкций внутри блока i = 1 while i < 11: print(i) i += 1 print("Конец программы")
Обратите внимание, что перед всеми инструкциями внутри блока расположено одинаковое количество пробелов. Именно так в языке Python выделяются блоки. Инструкции, перед которыми расположено одинаковое количество пробелов, являются телом блока. В нашем примере две инструкции выполняются десять раз. Концом блока является инструкция, пе- ред которой расположено меньшее количество пробелов. В нашем случае это функция print()
, которая выводит строку "Конец программы"
. Если количество пробелов внутри бло- ка окажется разным, то интерпретатор выведет сообщение о фатальной ошибке, и програм- ма будет остановлена. Так язык Python приучает программистов писать красивый и понят- ный код.
П
РИМЕЧАНИЕ
В языке Python принято использовать четыре пробела для выделения инструкций внутри блока.
Если блок состоит из одной инструкции, то допустимо разместить ее на одной строке с ос- новной инструкцией. Например, код: for i in range(1, 11): print(i) print("Конец программы") можно записать так: for i in range(1, 11): print(i) print("Конец программы")
Если инструкция является слишком длинной, то ее можно перенести на следующую строку, например, так:
в конце строки поставить символ
\
, после которого должен следовать перевод строки.
Другие символы (в том числе и комментарии) недопустимы. Пример: x = 15 + 20 \
+ 30 print(x)
поместить выражение внутри круглых скобок. Этот способ лучше, т. к. внутри круглых скобок можно разместить любое выражение. Пример: x = (15 + 20 # Это комментарий
+ 30) print(x)
определение списка и словаря можно разместить на нескольких строках, т. к. при этом используются квадратные и фигурные скобки соответственно. Пример определения списка: arr = [15, 20, # Это комментарий
30] print(arr)
Глава 1. Первые шаги
31
Пример определения словаря: arr = {"x": 15, "y": 20, # Это комментарий "z": 30} print(arr)
1.4. Комментарии
Комментарии предназначены для вставки пояснений в текст программы, интерпретатор полностью их игнорирует. Внутри комментария может располагаться любой текст, включая инструкции, которые выполнять не следует.
С
ОВЕТ
Помните — комментарии нужны программисту, а не интерпретатору Python. Вставка ком- ментариев в код позволит через некоторое время быстро вспомнить предназначение фрагмента кода.
В языке Python присутствует только однострочный комментарий. Он начинается с символа
#
:
# Это комментарий
Однострочный комментарий может начинаться не только с начала строки, но и распола- гаться после инструкции. Например, в следующем примере комментарий расположен после инструкции, предписывающей вывести надпись "Привет, мир!"
: print("Привет, мир!") # Выводим надпись с помощью функции print()
Если же символ комментария разместить перед инструкцией, то она не будет выполнена:
# print("Привет, мир!") Эта инструкция выполнена не будет
Если символ
#
расположен внутри кавычек или апострофов, то он не является символом комментария: print("# Это НЕ комментарий")
Так как в языке Python нет многострочного комментария, то комментируемый фрагмент часто размещают внутри утроенных кавычек (или утроенных апострофов):
"""
Эта инструкция выполнена не будет print("Привет, мир!")
"""
Следует заметить, что этот фрагмент кода не игнорируется интерпретатором, т. к. он не яв- ляется комментарием. В результате выполнения фрагмента будет создан объект строкового типа. Тем не менее, инструкции внутри утроенных кавычек выполнены не будут, поскольку интерпретатор сочтет их простым текстом. Такие строки являются строками документиро- вания, а не комментариями.
1.5. Дополнительные возможности IDLE
Поскольку в процессе изучения материала этой книги в качестве редактора мы будем ис- пользовать IDLE, рассмотрим дополнительные возможности этой среды разработки.
Как вы уже знаете, в окне Python Shell символы
>>>
означают приглашение ввести команду.
Введя команду, нажимаем клавишу
32
Часть I. Основы языка Python зультат (при условии, что инструкция возвращает значение), а далее — приглашение для ввода новой команды. При вводе многострочной команды после нажатия клавиши
1 2 3 4 5 6 7 8 9 ... 83
:
>>> for n in range(1, 3): print(n)
1 2
>>>
В предыдущем разделе мы выводили строку "Привет, мир!"
с помощью функции print()
В окне Python Shell это делать не обязательно — мы можем просто ввести строку и нажать клавишу
>>> "Привет, мир!"
'Привет, мир!'
>>>
Обратите внимание на то, что строки выводятся в апострофах. Этого не произойдет, если выводить строку с помощью функции print()
:
>>> print("Привет, мир!")
Привет, мир!
>>>
Учитывая возможность получить результат сразу после ввода команды, окно Python Shell можно использовать для изучения команд, а также в качестве многофункционального каль- кулятора:
>>> 12 * 32 + 54 438
>>>
Результат вычисления последней инструкции сохраняется в переменной
_
(одно подчерки- вание). Это позволяет производить дальнейшие расчеты без ввода предыдущего результата.
Вместо него достаточно ввести символ подчеркивания:
>>> 125 * 3 # Умножение
375
>>> _ + 50 # Сложение. Эквивалентно 375 + 50 425
>>> _ / 5 # Деление. Эквивалентно 425 / 5 85.0
>>>
При вводе команды можно воспользоваться комбинацией клавиш
Если при открытом списке вводить буквы, то показываться будут идентификаторы, начи- нающиеся с этих букв. Выбирать идентификатор необходимо с помощью клавиш <↑> и
<↓>. После выбора не следует нажимать клавишу
Глава 1. Первые шаги
33 после ввода первых букв можно воспользоваться комбинацией клавиш
При необходимости повторно выполнить ранее введенную инструкцию ее приходится на- бирать заново. Можно, конечно, скопировать инструкцию, а затем вставить, но как вы мо- жете сами убедиться, в контекстном меню нет пунктов Copy (Копировать) и Paste (Вста- вить). Они расположены в меню Edit. Постоянно выбирать пункты из этого меню очень неудобно. Одним из решений проблемы является использование комбинации клавиш быст- рого доступа
для вставки последней инст- рукции. Каждое последующее нажатие этих клавиш будет вставлять следующую (или пре- дыдущую) инструкцию. Для еще более быстрого повторного ввода инструкции следует предварительно ввести ее первые буквы. В этом случае перебираться будут только инст- рукции, начинающиеся с этих букв.
1.6. Вывод результатов работы программы
Вывести результаты работы программы можно с помощью функции print()
. Функция име- ет следующий формат: print([<Объекты>][, sep=' '][, end='\n'][, file=sys.stdout][, flush=False])
Функция print()
преобразует объект в строку и посылает ее в стандартный вывод stdout
С помощью параметра file можно перенаправить вывод в другое место — например, в файл. При этом, если параметр flush имеет значение
False
, выводимые значения будут принудительно записаны в файл. Перенаправление вывода мы подробно рассмотрим при изучении файлов.
После вывода строки автоматически добавляется символ перевода строки: print("Строка 1") print("Строка 2")
Результат:
Строка 1
Строка 2
Если необходимо вывести результат на той же строке, то в функции print()
данные указы- ваются через запятую в первом параметре: print("Строка 1", "Строка 2")
Результат:
Строка 1 Строка 2
Как видно из примера, между выводимыми строками автоматически вставляется пробел.
С помощью параметра sep можно указать другой символ. Например, выведем строки без пробела между ними: print("Строка1", "Строка2", sep="")
34
Часть I. Основы языка Python
Результат:
Строка 1Строка 2
После вывода объектов в конце добавляется символ перевода строки. Если необходимо произвести дальнейший вывод на той же строке, то в параметре end следует указать другой символ: print("Строка 1", "Строка 2", end=" ") print("Строка 3")
# Выведет: Строка 1 Строка 2 Строка 3
Если, наоборот, необходимо вставить символ перевода строки, то функция print()
указы- вается без параметров: for n in range(1, 5): print(n, end=" ") print() print("Это текст на новой строке")
Результат выполнения:
1 2 3 4
Это текст на новой строке
Здесь мы использовали цикл for
, который позволяет последовательно перебирать элементы.
На каждой итерации цикла переменной n
присваивается новое число, которое мы выводим с помощью функции print()
, расположенной на следующей строке.
Обратите внимание, что перед функцией мы добавили четыре пробела. Как уже отмечалось ранее, таким образом в языке Python выделяются блоки. При этом инструкции, перед кото- рыми расположено одинаковое количество пробелов, представляют собой тело цикла. Все эти инструкции выполняются определенное количество раз. Концом блока является инст- рукция, перед которой расположено меньшее количество пробелов. В нашем случае это функция print()
без параметров, которая вставляет символ перевода строки.
Если необходимо вывести большой блок текста, его следует разместить между утроенными кавычками или утроенными апострофами. В этом случае текст сохраняет свое форматиро- вание: print("""Строка 1
Строка 2
Строка 3""")
В результате выполнения этого примера мы получим три строки:
Строка 1
Строка 2
Строка 3
Для вывода результатов работы программы вместо функции print()
можно использовать метод write()
объекта sys.stdout
: import sys # Подключаем модуль sys sys.stdout.write("Строка") # Выводим строку
В первой строке с помощью оператора import мы подключаем модуль sys
, в котором объ- явлен объект stdout
. Далее с помощью метода write()
этого объекта выводим строку. Сле-
Глава 1. Первые шаги
35 дует заметить, что метод не вставляет символ перевода строки, поэтому при необходимости следует добавить его самим с помощью символа
\n
: import sys sys.stdout.write("Строка 1\n") sys.stdout.write("Строка 2")
1.7. Ввод данных
Для ввода данных в Python 3 предназначена функция input()
, которая получает данные со стандартного ввода stdin
. Функция имеет следующий формат:
[<Значение> = ] input([<Сообщение>])
Для примера переделаем нашу первую программу так, чтобы она здоровалась не со всем миром, а только с нами (листинг 1.6).
Листинг 1.6. Пример использования функции input()
# -*- coding: utf-8 -*- name = input("Введите ваше имя: ") print("Привет,", name) input("Нажмите
Чтобы окно сразу не закрылось, в конце программы указан еще один вызов функции input()
. В этом случае окно не закроется, пока не будет нажата клавиша
Вводим код и сохраняем файл, например, под именем test2.py
, а затем запускаем программу на выполнение с помощью двойного щелчка на значке файла. Откроется черное окно, в ко- тором мы увидим надпись: Введите ваше имя:. Вводим свое имя, например
Николай
, и на- жимаем клавишу
При использовании функции input()
следует учитывать, что при достижении конца файла или при нажатии комбинации клавиш
EOFError
. Если не предусмотреть обработку исключения, то программа аварий- но завершится. Обработать исключение можно следующим образом: try: s = input("Введите данные: ") print(s) except EOFError: print("Обработали исключение EOFError")
Если внутри блока try возникнет исключение
EOFError
, то управление будет передано в блок except
. После исполнения инструкций в блоке except программа нормально продол- жит работу.
В Python 2 для ввода данных применялись две функции: raw_input()
и input()
. Функция raw_input()
просто возвращала введенные данные, а функция input()
предварительно об- рабатывала данные с помощью функции eval()
и затем возвращала результат ее выполне- ния. В Python 3 функция raw_input()
была переименована в input()
, а прежняя функция input()
— удалена. Чтобы в Python 3 вернуться к поведению функции input()
в стиле
Python 2, необходимо передать значение в функцию eval()
явным образом:
36
Часть I. Основы языка Python
# -*- coding: utf-8 -*- result = eval(input("Введите инструкцию: ")) # Вводим: 2 + 2 print("Результат:", result) # Выведет: 4 input()
В
НИМАНИЕ
!
Функция eval() выполнит любую введенную инструкцию. Никогда не используйте этот код, если не доверяете пользователю.
Передать данные можно в командной строке, указав их после имени файла программы. Та- кие данные доступны через список argv модуля sys
. Первый элемент списка argv будет со- держать название файла запущенной программы, а последующие элементы — переданные данные. Для примера создадим файл test3.py в папке
C:\book
. Содержимое файла приведено в листинге 1.7.
Листинг 1.7. Получение данных из командной строки
# -*- coding: utf-8 -*- import sys arr = sys.argv[:] for n in arr: print(n)
Теперь запустим программу на выполнение из командной строки и передадим ей данные.
Для этого вызовем командную строку: выберем в меню Пуск пункт Выполнить, в открыв- шемся окне наберем команду cmd и нажмем кнопку OK — откроется черное окно команд- ной строки с приглашением для ввода команд. Перейдем в папку
C:\book
, набрав команду: cd C:\book
В командной строке должно появиться приглашение:
C:\book>
Для запуска нашей программы вводим команду:
C:\Python36\python.exe test3.py -uNik -p123
В этой команде мы передаем имя файла (
test3.py
) и некоторые данные (
-uNik и
-p123
).
Результат выполнения программы будет выглядеть так: test3.py
-uNik
-p123 1.8. Доступ к документации
При установке Python на компьютер помимо собственно интерпретатора копируется доку- ментация по этому языку в формате CHM. Чтобы открыть ее, в меню Пуск | Программы
(Все программы) | Python 3.6
нужно выбрать пункт Python 3.6 Manuals (32-bit) или
Python 3.6 Manuals (64-bit)
Если в меню Пуск | Программы (Все программы) | Python 3.6 выбрать пункт Python 3.6
Module Docs (32-bit)
или Python 3.6 Module Docs (64-bit), запустится сервер документов
Глава 1. Первые шаги
37 pydoc (рис. 1.11). Он представляет собой написанную на самом Python программу веб- сервера, выводящую результаты своей работы в веб-браузере.
Сразу после запуска pydoc откроется веб-браузер, в котором будет выведен список всех стандартных модулей, поставляющихся в составе Python. Щелкнув на названии модуля, представляющем собой гиперссылку, мы откроем страницу с описанием всех классов, функций и констант, объявленных в этом модуле.
Рис. 1.11. Окно pydoc
Чтобы завершить работу pydoc, следует переключиться в его окно (см. рис. 1.11), ввести в нем команду q
(от quit, выйти) и нажать клавишу
(от browser, браузер) повторно выведет в браузере страницу со списком модулей.
В окне Python Shell также можно отобразить документацию. Для этого предназначена функция help()
. В качестве примера отобразим документацию по встроенной функции input()
:
>>> help(input)
Результат выполнения:
Help on built-in function input in module builtins: input(prompt=None, /)
Read a string from standard input. The trailing newline is stripped.
The prompt string, if given, is printed to standard output without a trailing newline before reading input.
If the user hits EOF (*nix: Ctrl-D, Windows: Ctrl-Z+Return), raise EOFError.
On *nix systems, readline is used if available.
С помощью функции help()
можно получить документацию не только по конкретной функции, но и по всему модулю сразу. Для этого предварительно необходимо подключить модуль. Например, подключим модуль builtins
, содержащий определения всех встроенных функций и классов, а затем выведем документацию по этому модулю:
38
Часть I. Основы языка Python
>>> import builtins
>>> help(builtins)
При рассмотрении комментариев мы говорили, что часто для комментирования большого фрагмента кода используются утроенные кавычки или утроенные апострофы. Такие строки не являются комментариями в полном смысле этого слова. Вместо комментирования фраг- мента создается объект строкового типа, который сохраняется в атрибуте
__doc__
. Функция help()
при составлении документации получает информацию из этого атрибута. Такие строки называются строками документирования.
В качестве примера создадим файл test4.py
, содержимое которого показано в листинге 1.8.
Листинг 1.8. Тестовый модуль test4.py
# -*- coding: utf-8 -*-
""" Это описание нашего модуля """ def func():
""" Это описание функции""" pass
Теперь подключим этот модуль и выведем содержимое строк документирования. Все эти действия выполняет код из листинга 1.9.
Листинг 1.9. Вывод строк документирования посредством функции help()
# -*- coding: utf-8 -*- import test4 # Подключаем файл test4.py help(test4) input()
Запустим эту программу из среды Python Shell. (Если запустить ее щелчком мыши, вывод будет выполнен в окне интерактивной оболочки, и результат окажется нечитаемым. Веро- ятно, это происходит вследствие ошибки в интерпретаторе.) Вот что мы увидим:
Help on module test4:
NAME test4 - Это описание нашего модуля
FUNCTIONS func()
Это описание функции
FILE d:\data\документы\работа\книги\python 3 и pyqt 5 разработка приложений ii\примеры\1\test4.py
Теперь получим содержимое строк документирования с помощью атрибута
__doc__
. Как это делается, показывает код из листинга 1.10.
Глава 1. Первые шаги
39
Листинг 1.10. Вывод строк документирования посредством атрибута __doc__
# -*- coding: utf-8 -*- import test4 # Подключаем файл test4.py print(test4.__doc__) print(test4.func.__doc__) input()
Результат выполнения:
Это описание нашего модуля
Это описание функции
Атрибут
__doc__
можно использовать вместо функции help()
. В качестве примера получим документацию по функции input()
:
>>> print(input.__doc__)
Результат выполнения:
Read a string from standard input. The trailing newline is stripped.
The prompt string, if given, is printed to standard output without a trailing newline before reading input.
If the user hits EOF (*nix: Ctrl-D, Windows: Ctrl-Z+Return), raise EOFError.
On *nix systems, readline is used if available.
Получить список всех идентификаторов внутри модуля позволяет функция dir()
. Пример ее использования показывает код из листинга 1.11.
Листинг 1.11. Получение списка идентификаторов
# -*- coding: utf-8 -*- import test4 # Подключаем файл test4.py print(dir(test4)) input()
Результат выполнения:
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__',
'__package__', '__spec__', 'func']
Теперь получим список всех встроенных идентификаторов:
>>> import builtins
>>> print(dir(builtins))
Функция dir()
может не принимать параметров вообще. В этом случае возвращается спи- сок идентификаторов текущего модуля:
>>> print(dir())
Результат выполнения:
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__',
'__package__', '__spec__']
ГЛ А В А
2
Переменные
Все данные в языке Python представлены объектами. Каждый объект имеет тип данных и значение. Для доступа к объекту предназначены переменные. При инициализации в пере- менной сохраняется ссылка на объект (адрес объекта в памяти компьютера). Благодаря этой ссылке можно в дальнейшем изменять объект из программы.
2.1. Именование переменных
Каждая переменная должна иметь уникальное имя, состоящее из латинских букв, цифр и знаков подчеркивания, причем имя переменной не может начинаться с цифры. Кроме того, следует избегать указания символа подчеркивания в начале имени, поскольку идентифика- торам с таким символом определено специальное назначение. Например, имена, начинаю- щиеся с символа подчеркивания, не импортируются из модуля с помощью инструкции from module import *
, а имена, включающие по два символа подчеркивания — в начале и в кон- це, для интерпретатора имеют особый смысл.
В качестве имени переменной нельзя использовать ключевые слова. Получить список всех ключевых слов позволяет такой код:
>>> import keyword
>>> keyword.kwlist
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue',
'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if',
'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return',
'try', 'while', 'with', 'yield']
Помимо ключевых слов, следует избегать совпадений со встроенными идентификаторами.
Дело в том, что, в отличие от ключевых слов, встроенные идентификаторы можно переоп- ределять, но дальнейший результат может стать для вас неожиданным:
>>> help(abs)
Help on built-in function abs in module builtins: abs(x, /)
Return the absolute value of the argument.
>>> help = 10
>>> help
10
Глава 2. Переменные
41
>>> help(abs)
Traceback (most recent call last):
File "
", line 1, in
TypeError: 'int' object is not callable
В этом примере мы с помощью встроенной функции help() получаем справку по функции abs()
1 2 3 4 5 6 7 8 9 ... 83
. Далее переменной help присваиваем число 10. После переопределения идентифика- тора мы больше не можем пользоваться функцией help()
, т. к. это приведет к выводу сооб- щения об ошибке. По этой причине лучше избегать имен, совпадающих со встроенными идентификаторами. Очень часто подобная ошибка возникает при попытке назвать перемен- ную, в которой предполагается хранение строки, именем str
. Вроде бы логично, но str является часто используемым встроенным идентификатором и после такого переопределения поведение программы становится непредсказуемым. В редакторе IDLE встроенные иденти- фикаторы подсвечиваются фиолетовым цветом. Обращайте внимание на цвет перемен- ной — он должен быть черным. Если вы заметили, что переменная подсвечена, то название переменной следует обязательно изменить. Получить полный список встроенных иденти- фикаторов позволяет следующий код:
>>> import builtins
>>> print(dir(builtins))
Правильные имена переменных: x
, y1
, strName
, str_name
Неправильные имена переменных:
1y
,
ИмяПеременной
Последнее имя неправильное, т. к. в нем используются русские буквы. Хотя на самом деле такой вариант также будет работать, но лучше русские буквы все же не применять:
>>> ИмяПеременной = 10 # Лучше так не делать!!!
>>> ИмяПеременной
10
При указании имени переменной важно учитывать регистр букв: x
и
X
— разные перемен- ные:
>>> x = 10; X = 20
>>> x, X
(10, 20)
2.2. Типы данных
В Python 3 объекты могут иметь следующие типы данных:
bool
— логический тип данных. Может содержать значения
True или
False
, которые ведут себя как числа
1
и
0
соответственно:
>>> type(True), type(False)
(
>>> int(True), int(False)
(1, 0)
NoneType
— объект со значением
None
(обозначает отсутствие значения):
>>> type(None)
42
Часть I. Основы языка Python
В логическом контексте значение
None интерпретируется как
False
:
>>> bool(None)
False
int
— целые числа. Размер числа ограничен лишь объемом оперативной памяти:
>>> type(2147483647), type(999999999999999999999999)
(
float
— вещественные числа:
>>> type(5.1), type(8.5e-3)
(
complex
— комплексные числа:
>>> type(2+2j)
str
— Unicode-строки:
>>> type("Строка")
bytes
— неизменяемая последовательность байтов:
>>> type(bytes("Строка", "utf-8"))
bytearray
— изменяемая последовательность байтов:
>>> type(bytearray("Строка", "utf-8"))
list
— списки. Тип данных list аналогичен массивам в других языках программирова- ния:
>>> type( [1, 2, 3] )
tuple
— кортежи:
>>> type( (1, 2, 3) )
range
— диапазоны:
>>> type( range(1, 10) )
dict
— словари. Тип данных dict аналогичен ассоциативным массивам в других языках программирования:
>>> type( {"x": 5, "y": 20} )
set
— множества (коллекции уникальных объектов):
>>> type( {"a", "b", "c"} )
Глава 2. Переменные
43
frozenset
— неизменяемые множества:
>>> type(frozenset(["a", "b", "c"]))
ellipsis
— обозначается в виде трех точек или слова
Ellipsis
. Тип ellipsis использу- ется в расширенном синтаксисе получения среза:
>>> type(...), ..., ... is Ellipsis
(
>>> class C(): def __getitem__(self, obj): return obj
>>> c = C()
>>> c[..., 1:5, 0:9:1, 0]
(Ellipsis, slice(1, 5, None), slice(0, 9, 1), 0)
function
— функции:
>>> def func(): pass
>>> type(func)
module
— модули:
>>> import sys
>>> type(sys)
type
— классы и типы данных. Не удивляйтесь! Все данные в языке Python являются объектами, даже сами типы данных!
>>> class C: pass
>>> type(C)
>>> type(type(""))
Основные типы данных делятся на изменяемые и неизменяемые. К изменяемым типам относятся списки, словари и тип bytearray
. Пример изменения элемента списка:
>>> arr = [1, 2, 3]
>>> arr[0] = 0 # Изменяем первый элемент списка
>>> arr
[0, 2, 3]
К неизменяемым типам относятся числа, строки, кортежи, диапазоны и тип bytes
. Напри- мер, чтобы получить строку из двух других строк, необходимо использовать операцию кон- катенации, а ссылку на новый объект присвоить переменной:
>>> str1 = "авто"
>>> str2 = "транспорт"
>>> str3 = str1 + str2 # Конкатенация
>>> print(str3) автотранспорт
44
Часть I. Основы языка Python
Кроме того, типы данных делятся на последовательности и отображения. К последова- тельностям относятся строки, списки, кортежи, диапазоны, типы bytes и bytearray
, а к ото- бражениям — словари.
Последовательности и отображения поддерживают механизм итераторов, позволяющий произвести обход всех элементов с помощью метода
__next__()
или функции next()
. На- пример, вывести элементы списка можно так:
>>> arr = [1, 2]
>>> i = iter(arr)
>>> i.__next__() # Метод __next__()
1
>>> next(i) # Функция next()
2
Если используется словарь, то на каждой итерации возвращается ключ:
>>> d = {"x": 1, "y": 2}
>>> i = iter(d)
>>> i.__next__() # Возвращается ключ 'y'
>>> d[i.__next__()] # Получаем значение по ключу
1
На практике подобным способом не пользуются. Вместо него применяется цикл for
, кото- рый использует механизм итераторов незаметно для нас. Например, вывести элементы спи- ска можно так:
>>> for i in [1, 2]: print(i)
Перебрать слово по буквам можно точно так же. Для примера вставим тире после каждой буквы:
>>> for i in "Строка": print(i + " -", end=" ")
Результат:
С — т — р — о — к — а -
Пример перебора элементов словаря:
>>> d = {"x": 1, "y": 2}
>>> for key in d: print( d[key] )
Последовательности поддерживают также обращение к элементу по индексу, получение среза, конкатенацию (оператор
+
), повторение (оператор
*
) и проверку на вхождение (опе- ратор in
). Все эти операции мы будем подробно рассматривать по мере изучения языка.
2.3. Присваивание значения переменным
Присваивание — это занесение в переменную какого-либо значения (при этом значение, хранившееся в переменной ранее, теряется). Присваивание выполняется с помощью опера- тора
=
(знак равенства) таким образом:
Глава 2. Переменные
45
>>> x = 7 # Тип int
>>> y = 7.8 # Тип float
>>> s1 = "Строка" # Переменной s1 присвоено значение Строка
>>> s2 = 'Строка' # Переменной s2 также присвоено значение Строка
>>> b = True # Переменной b присвоено логическое значение True
В одной строке можно присвоить значение сразу нескольким переменным:
>>> x = y = 10 # Переменным x и y присвоено число 10
>>> x, y
(10, 10)
После присваивания значения в переменной сохраняется ссылка на объект, а не сам объект.
Это обязательно следует учитывать при групповом присваивании. Групповое присваивание можно использовать для чисел, строк и кортежей, но для изменяемых объектов этого делать нельзя. Пример:
>>> x = y = [1, 2] # Якобы создали два объекта
>>> x, y
([1, 2], [1, 2])
В этом примере мы создали список из двух элементов, присвоили его переменным x
и y
и теперь полагаем, что эти переменные хранят две разные копии упомянутого списка. Теперь попробуем изменить значение одного из элементов списка, что хранится в переменной y
:
>>> y[1] = 100 # Изменяем второй элемент списка
>>> x, y
([1, 100], [1, 100])
Как видно из примера, изменение значения элемента списка из переменной y
привело также к изменению значения того же элемента списка из переменной x
. То есть, обе переменные ссылаются на один и тот же объект, а не на два разных объекта. Чтобы получить два объек- та, необходимо производить раздельное присваивание:
>>> x = [1, 2]
>>> y = [1, 2]
>>> y[1] = 100 # Изменяем второй элемент
>>> x, y
([1, 2], [1, 100])
Проверить, ссылаются ли две переменные на один и тот же объект, позволяет оператор is
Если переменные ссылаются на один и тот же объект, оператор is возвращает значение
True
:
>>> x = y = [1, 2] # Один объект
>>> x is y
True
>>> x = [1, 2] # Разные объекты
>>> y = [1, 2] # Разные объекты
>>> x is y
False
Следует заметить, что в целях повышения эффективности кода интерпретатор производит кэширование малых целых чисел и небольших строк. Это означает, что если ста перемен- ным присвоено число 2, то, скорее всего, в этих переменных будет сохранена ссылка на один и тот же объект. Пример:
46
Часть I. Основы языка Python
>>> x = 2; y = 2; z = 2
>>> x is y, y is z
(True, True)
Посмотреть количество ссылок на объект позволяет метод getrefcount()
из модуля sys
:
>>> import sys # Подключаем модуль sys
>>> sys.getrefcount(2)
304
Когда число ссылок на объект становится равно нулю, объект автоматически удаляется из оперативной памяти. Исключением являются объекты, которые подлежат кэшированию.
Помимо группового, Python поддерживает позиционное присваивание. В этом случае пере- менные записываются через запятую слева от оператора
=
, а значения — через запятую справа. Пример позиционного присваивания:
>>> x, y, z = 1, 2, 3
>>> x, y, z
(1, 2, 3)
С помощью позиционного присваивания можно поменять значения переменных местами.
Пример:
>>> x, y = 1, 2
>>> x, y
(1, 2)
>>> x, y = y, x
>>> x, y
(2, 1)
По обе стороны оператора
=
могут быть указаны последовательности, к каковым относятся строки, списки, кортежи, диапазоны, типы bytes и bytearray
:
>>> x, y, z = "123" # Строка
>>> x, y, z
('1', '2', '3')
>>> x, y, z = [1, 2, 3] # Список
>>> x, y, z
(1, 2, 3)
>>> x, y, z = (1, 2, 3) # Кортеж
>>> x, y, z
(1, 2, 3)
>>> [x, y, z] = (1, 2, 3) # Список слева, кортеж справа
>>> x, y, z
(1, 2, 3)
Обратите внимание на то, что количество элементов справа и слева от оператора
=
должно совпадать, иначе будет выведено сообщение об ошибке:
>>> x, y, z = (1, 2, 3, 4)
Traceback (most recent call last):
File "
", line 1, in
ValueError: too many values to unpack (expected 3)
Глава 2. Переменные
47
Python 3 при несоответствии количества элементов справа и слева от оператора
= позволяет сохранить в переменной список, состоящий из лишних элементов. Для этого перед именем переменной указывается звездочка (
*
):
>>> x, y, *z = (1, 2, 3, 4)
>>> x, y, z
(1, 2, [3, 4])
>>> x, *y, z = (1, 2, 3, 4)
>>> x, y, z
(1, [2, 3], 4)
>>> *x, y, z = (1, 2, 3, 4)
>>> x, y, z
([1, 2], 3, 4)
>>> x, y, *z = (1, 2, 3)
>>> x, y, z
(1, 2, [3])
>>> x, y, *z = (1, 2)
>>> x, y, z
(1, 2, [])
Как видно из примера, переменная, перед которой указана звездочка, всегда получает в ка- честве значения список. Если для этой переменной не хватило значений, то ей присваивает- ся пустой список. Следует помнить, что звездочку можно указать только перед одной пере- менной, в противном случае возникнет неоднозначность и интерпретатор выведет сообще- ние об ошибке:
>>> *x, y, *z = (1, 2, 3, 4)
SyntaxError: two starred expressions in assignment
2.4. Проверка типа данных
Во многих языках программирования при создании переменной нужно указывать тип дан- ных, к которому должны относиться значения, присваиваемые этой переменной. Но в
Python этого делать не нужно, поскольку любая переменная может хранить значения любо- го типа.
Выяснить тип данных, к которому относится хранящееся в переменной значение, позволяет функция type(<Имя переменной>)
:
>>> type(a)
Проверить тип данных у значения, хранящегося в переменной, можно следующими спосо- бами:
сравнить значение, возвращаемое функцией type()
, с названием типа данных:
>>> x = 10
>>> if type(x) == int: print("Это целое число (тип int)")
проверить тип с помощью функции isinstance()
:
>>> s = "Строка"
>>> if isinstance(s, str): print("Это строка (тип str)")
48
Часть I. Основы языка Python
2.5. Преобразование типов данных
Над значением, относящимся к определенному типу, можно производить лишь операции, допустимые для этого типа данных. Например, можно складывать друг с другом числа, но строку сложить с числом нельзя — это приведет к выводу сообщения об ошибке:
>>> 2 + "25"
Traceback (most recent call last):
File "
", line 1, in
2 + "25"
TypeError: unsupported operand type(s) for +: 'int' and 'str'
Для преобразования значения из одного типа данных в другой предназначены следующие функции:
bool([<Объект>])
— преобразует объект в логический тип данных:
>>> bool(0), bool(1), bool(""), bool("Строка"), bool([1, 2]), bool([])
(False, True, False, True, True, False)
int([<Объект>[, <Система счисления>]])
— преобразует объект в число. Во втором па- раметре можно указать систему счисления (значение по умолчанию — 10). Примеры:
>>> int(7.5), int("71")
(7, 71)
>>> int("71", 10), int("71", 8), int("0o71", 8), int("A", 16)
(71, 57, 57, 10)
Если преобразование невозможно, то генерируется исключение:
>>> int("71s")
Traceback (most recent call last):
File "
", line 1, in
ValueError: invalid literal for int() with base 10: '71s'
float([<Число или строка>])
— преобразует целое число или строку в вещественное число:
>>> float(7), float("7.1")
(7.0, 7.1)
>>> float("Infinity"), float("-inf")
(inf, -inf)
>>> float("Infinity") + float("-inf") nan
str([<Объект>])
— преобразует объект в строку:
>>> str(125), str([1, 2, 3])
('125', '[1, 2, 3]')
>>> str((1, 2, 3)), str({"x": 5, "y": 10})
('(1, 2, 3)', "{'y': 10, 'x': 5}")
>>> str(bytes("строка", "utf-8"))
"b'\\xd1\\x81\\xd1\\x82\\xd1\\x80\\xd0\\xbe\\xd0\\xba\\xd0
\\xb0'"
>>> str(bytearray("строка", "utf-8"))
Глава 2. Переменные
49
"bytearray(b'\\xd1\\x81\\xd1\\x82\\xd1\\x80\\xd0\\xbe\\xd0
\\xba\\xd0\\xb0')"
str(<Объект>[, <Кодировка>[, <Обработка ошибок>]])
— преобразует объект типа bytes или bytearray в строку. В третьем параметре можно задать значение "strict"
(при ошибке возбуждается исключение
UnicodeDecodeError
— значение по умолчанию),
"replace"
(неизвестный символ заменяется символом, имеющим код
\uFFFD
) или "ignore"
(неизвестные символы игнорируются). Примеры:
>>> obj1 = bytes("строка1", "utf-8")
>>> obj2 = bytearray("строка2", "utf-8")
>>> str(obj1, "utf-8"), str(obj2, "utf-8")
('строка1', 'строка2')
>>> str(obj1, "ascii", "strict")
Traceback (most recent call last):
File "
", line 1, in
UnicodeDecodeError: 'ascii' codec can't decode byte
0xd1 in position 0: ordinal not in range(128)
>>> str(obj1, "ascii", "ignore")
'1'
bytes(<Строка>, <Кодировка>[, <Обработка ошибок>])
— преобразует строку в объект типа bytes
. В третьем параметре могут быть указаны значения "strict"
(значение по умолчанию),
"replace"
или "ignore"
. Примеры:
>>> bytes("строка", "cp1251") b'\xf1\xf2\xf0\xee\xea\xe0'
>>> bytes("строка123", "ascii", "ignore") b'123'
bytes(<Последовательность>)
— преобразует последовательность целых чисел от 0 до
255 в объект типа bytes
. Если число не попадает в диапазон, возбуждается исключение
ValueError
:
>>> b = bytes([225, 226, 224, 174, 170, 160])
>>> b b'\xe1\xe2\xe0\xae\xaa\xa0'
>>> str(b, "cp866")
'строка'
bytearray(<Строка>, <Кодировка>[, <Обработка ошибок>])
— преобразует строку в объ- ект типа bytearray
. В третьем параметре могут быть указаны значения "strict"
(значе- ние по умолчанию),
"replace"
или "ignore"
:
>>> bytearray("строка", "cp1251") bytearray(b'\xf1\xf2\xf0\xee\xea\xe0')
bytearray(<Последовательность>)
— преобразует последовательность целых чисел от 0 до 255 в объект типа bytearray
. Если число не попадает в диапазон, возбуждается ис- ключение
ValueError
:
>>> b = bytearray([225, 226, 224, 174, 170, 160])
>>> b
50
Часть I. Основы языка Python bytearray(b'\xe1\xe2\xe0\xae\xaa\xa0')
>>> str(b, "cp866")
'строка'
list(<Последовательность>)
— преобразует элементы последовательности в список:
>>> list("12345") # Преобразование строки
['1', '2', '3', '4', '5']
>>> list((1, 2, 3, 4, 5)) # Преобразование кортежа
[1, 2, 3, 4, 5]
tuple(<Последовательность>)
— преобразует элементы последовательности в кортеж:
>>> tuple("123456") # Преобразование строки
('1', '2', '3', '4', '5', '6')
>>> tuple([1, 2, 3, 4, 5]) # Преобразование списка
(1, 2, 3, 4, 5)
В качестве примера рассмотрим возможность сложения двух чисел, введенных пользовате- лем. Как вы уже знаете, вводить данные позволяет функция input()
. Воспользуемся этой функцией для получения чисел от пользователя (листинг 2.1).
Листинг 2.1. Получение данных от пользователя
# -*- coding: utf-8 -*- x = input("x = ") # Вводим 5 y = input("y = ") # Вводим 12 print(x + y) input()
Результатом выполнения этого скрипта будет не число, а строка
512
. Таким образом, следу- ет запомнить, что функция input()
возвращает результат в виде строки. Чтобы просуммиро- вать два числа, необходимо преобразовать строку в число (листинг 2.2).
Листинг 2.2. Преобразование строки в число
# -*- coding: utf-8 -*- x = int(input("x = ")) # Вводим 5 y = int(input("y = ")) # Вводим 12 print(x + y) input()
1 2 3 4 5 6 7 8 9 10 ... 83
В этом случае мы получим число 17, как и должно быть. Однако если пользователь вместо числа введет строку, то программа завершится с фатальной ошибкой. Как обработать ошиб- ку, мы разберемся по мере изучения языка.
2.6. Удаление переменных
Удалить переменную можно с помощью инструкции del
: del <Переменная1>[, ..., <ПеременнаяN>]
Глава 2. Переменные
51
Пример удаления одной переменной:
>>> x = 10; x
10
>>> del x; x
Traceback (most recent call last):
File "
", line 1, in del x; x
NameError: name 'x' is not defined
Пример удаления нескольких переменных:
>>> x, y = 10, 20
>>> del x, y
ГЛ А В А
3
Операторы
Операторы позволяют произвести с данными определенные действия. Например, операто- ры присваивания служат для сохранения данных в переменной, математические операторы позволяют выполнить арифметические вычисления, а оператор конкатенации строк служит для соединения двух строк в одну. Рассмотрим операторы, доступные в Python 3, подробно.
3.1. Математические операторы
Производить операции над числами позволяют математические операторы:
+
— сложение:
>>> 10 + 5 # Целые числа
15
>>> 12.4 + 5.2 # Вещественные числа
17.6
>>> 10 + 12.4 # Целые и вещественные числа
22.4
-
— вычитание:
>>> 10 - 5 # Целые числа
5
>>> 12.4 - 5.2 # Вещественные числа
7.2
>>> 12 - 5.2 # Целые и вещественные числа
6.8
*
— умножение:
>>> 10 * 5 # Целые числа
50
>>> 12.4 * 5.2 # Вещественные числа
64.48
>>> 10 * 5.2 # Целые и вещественные числа
52.0
/
— деление. Результатом деления всегда является вещественное число, даже если про- изводится деление целых чисел. Обратите внимание на эту особенность, если вы раньше
Глава 3. Операторы
53 программировали на Python 2. В Python 2 при делении целых чисел остаток отбрасывал- ся и возвращалось целое число, в Python 3 поведение оператора изменилось:
>>> 10 / 5 # Деление целых чисел без остатка
2.0
>>> 10 / 3 # Деление целых чисел с остатком
3.3333333333333335
>>> 10.0 / 5.0 # Деление вещественных чисел
2.0
>>> 10.0 / 3.0 # Деление вещественных чисел
3.3333333333333335
>>> 10 / 5.0 # Деление целого числа на вещественное
2.0
>>> 10.0 / 5 # Деление вещественного числа на целое
2.0
//
— деление с округлением вниз. Вне зависимости от типа чисел остаток отбрасывается:
>>> 10 // 5 # Деление целых чисел без остатка
2
>>> 10 // 3 # Деление целых чисел с остатком
3
>>> 10.0 // 5.0 # Деление вещественных чисел
2.0
>>> 10.0 // 3.0 # Деление вещественных чисел
3.0
>>> 10 // 5.0 # Деление целого числа на вещественное
2.0
>>> 10 // 3.0 # Деление целого числа на вещественное
3.0
>>> 10.0 // 5 # Деление вещественного числа на целое
2.0
>>> 10.0 // 3 # Деление вещественного числа на целое
3.0
%
— остаток от деления:
>>> 10 % 5 # Деление целых чисел без остатка
0
>>> 10 % 3 # Деление целых чисел с остатком
1
>>> 10.0 % 5.0 # Операция над вещественными числами
0.0
>>> 10.0 % 3.0 # Операция над вещественными числами
1.0
>>> 10 % 5.0 # Операция над целыми и вещественными числами
0.0
>>> 10 % 3.0 # Операция над целыми и вещественными числами
1.0
>>> 10.0 % 5 # Операция над целыми и вещественными числами
0.0
>>> 10.0 % 3 # Операция над целыми и вещественными числами
1.0
54
Часть I. Основы языка Python
**
— возведение в степень:
>>> 10 ** 2, 10.0 ** 2
(100, 100.0)
унарный минус (–) и унарный плюс (
+
):
>>> +10, +10.0, -10, -10.0, -(-10), -(-10.0)
(10, 10.0, -10, -10.0, 10, 10.0)
Как видно из примеров, операции над числами разных типов возвращают число, имеющее более сложный тип из типов, участвующих в операции. Целые числа имеют самый простой тип, далее идут вещественные числа и самый сложный тип — комплексные числа. Таким образом, если в операции участвуют целое число и вещественное, то целое число будет автоматически преобразовано в вещественное число, затем будет произведена операция над вещественными числами, а результатом станет вещественное число.
При выполнении операций над вещественными числами следует учитывать ограничения точности вычислений. Например, результат следующей операции может показаться стран- ным:
>>> 0.3 - 0.1 - 0.1 - 0.1
-2.7755575615628914e-17
Ожидаемым был бы результат
0.0
, но, как видно из примера, мы получили совсем другой результат. Если необходимо производить операции с фиксированной точностью, следует использовать модуль decimal
:
>>> from decimal import Decimal
>>> Decimal("0.3") - Decimal("0.1") - Decimal("0.1") - Decimal("0.1")
Decimal('0.0')
3.2. Двоичные операторы
Двоичные операторы предназначены для манипуляции отдельными битами. Язык Python поддерживает следующие двоичные операторы:
— двоичная инверсия. Значение каждого бита заменяется на противоположное:
>>> x = 100 # 01100100
>>> x = x # 10011011
&
— двоичное И:
>>> x = 100 # 01100100
>>> y = 75 # 01001011
>>> z = x & y # 01000000
>>> "{0:b} & {1:b} = {2:b}".format(x, y, z)
'1100100 & 1001011 = 1000000'
|
— двоичное ИЛИ:
>>> x = 100 # 01100100
>>> y = 75 # 01001011
>>> z = x | y # 01101111
>>> "{0:b} | {1:b} = {2:b}".format(x, y, z)
'1100100 | 1001011 = 1101111'
Глава 3. Операторы
55
^
— двоичное исключающее ИЛИ:
>>> x = 100 # 01100100
>>> y = 250 # 11111010
>>> z = x ^ y # 10011110
>>> "{0:b} ^ {1:b} = {2:b}".format(x, y, z)
'1100100 ^ 11111010 = 10011110'
<<
— сдвиг влево — сдвигает двоичное представление числа влево на один или более разрядов и заполняет разряды справа нулями:
>>> x = 100 # 01100100
>>> y = x << 1 # 11001000
>>> z = y << 1 # 10010000
>>> k = z << 2 # 01000000
>>
— сдвиг вправо — сдвигает двоичное представление числа вправо на один или более разрядов и заполняет разряды слева нулями, если число положительное:
>>> x = 100 # 01100100
>>> y = x >> 1 # 00110010
>>> z = y >> 1 # 00011001
>>> k = z >> 2 # 00000110
Если число отрицательное, то разряды слева заполняются единицами:
>>> x = -127 # 10000001
>>> y = x >> 1 # 11000000
>>> z = y >> 2 # 11110000
>>> k = z << 1 # 11100000
>>> m = k >> 1 # 11110000 3.3. Операторы для работы с последовательностями
Для работы с последовательностями предназначены следующие операторы:
+
— конкатенация:
>>> print("Строка1" + "Строка2") # Конкатенация строк
Строка1Строка2
>>> [1, 2, 3] + [4, 5, 6] # Списки
[1, 2, 3, 4, 5, 6]
>>> (1, 2, 3) + (4, 5, 6) # Кортежи
(1, 2, 3, 4, 5, 6)
*
— повторение:
>>> "s" * 20 # Строки 'ssssssssssssssssssss'
>>> [1, 2] * 3 # Списки
[1, 2, 1, 2, 1, 2]
>>> (1, 2) * 3 # Кортежи
(1, 2, 1, 2, 1, 2)
56
Часть I. Основы языка Python
in
— проверка на вхождение. Если элемент входит в последовательность, то возвраща- ется логическое значение
True
:
>>> "Строка" in "Строка для поиска" # Строки
True
>>> "Строка2" in "Строка для поиска" # Строки
False
>>> 2 in [1, 2, 3], 4 in [1, 2, 3] # Списки
(True, False)
>>> 2 in (1, 2, 3), 6 in (1, 2, 3) # Кортежи
(True, False)
not in
— проверка на невхождение. Если элемент не входит в последовательность, воз- вращается
True
:
>>> "Строка" not in "Строка для поиска" # Строки
False
>>> "Строка2" not in "Строка для поиска" # Строки
True
>>> 2 not in [1, 2, 3], 4 not in [1, 2, 3] # Списки
(False, True)
>>> 2 not in (1, 2, 3), 6 not in (1, 2, 3) # Кортежи
(False, True)
3.4. Операторы присваивания
Операторы присваивания предназначены для сохранения значения в переменной. Приведем перечень операторов присваивания, доступных в языке Python:
=
— присваивает переменной значение:
>>> x = 5; x
5
+=
— увеличивает значение переменной на указанную величину:
>>> x = 5; x += 10 # Эквивалентно x = x + 10
>>> x
15
Для последовательностей оператор
+=
производит конкатенацию:
>>> s = "Стр"; s += "ока"
>>> print(s)
Строка
-=
— уменьшает значение переменной на указанную величину:
>>> x = 10; x -= 5 # Эквивалентно x = x — 5
>>> x
5
*=
— умножает значение переменной на указанную величину:
>>> x = 10; x *= 5 # Эквивалентно x = x * 5
>>> x
50
Глава 3. Операторы
57
Для последовательностей оператор
*=
производит повторение:
>>> s = "*"; s *= 20
>>> s
'********************'
/=
— делит значение переменной на указанную величину:
>>> x = 10; x /= 3 # Эквивалентно x = x / 3
>>> x
3.3333333333333335
>>> y = 10.0; y /= 3.0 # Эквивалентно y = y / 3.0
>>> y
3.3333333333333335
//=
— деление с округлением вниз и присваиванием:
>>> x = 10; x //= 3 # Эквивалентно x = x // 3
>>> x
3
>>> y = 10.0; y //= 3.0 # Эквивалентно y = y // 3.0
>>> y
3.0
%=
— деление по модулю и присваивание:
>>> x = 10; x %= 2 # Эквивалентно x = x % 2
>>> x
0
>>> y = 10; y %= 3 # Эквивалентно y = y % 3
>>> y
1
**=
— возведение в степень и присваивание:
>>> x = 10; x **= 2 # Эквивалентно x = x ** 2
>>> x
100 3.5. Приоритет выполнения операторов
В какой последовательности будет вычисляться приведенное далее выражение? x = 5 + 10 * 3 / 2
Это зависит от приоритета выполнения операторов. В данном случае последовательность вычисления выражения будет такой:
1. Число 10 будет умножено на 3, т. к. приоритет оператора умножения выше приоритета оператора сложения.
2. Полученное значение будет поделено на 2, т. к. приоритет оператора деления равен при- оритету оператора умножения (а операторы с равными приоритетами выполняются сле- ва направо), но выше, чем у оператора сложения.
58
Часть I. Основы языка Python
3. К полученному значению будет прибавлено число 5, т. к. оператор присваивания
=
имеет наименьший приоритет.
4. Значение будет присвоено переменной x
>>> x = 5 + 10 * 3 / 2
>>> x
20.0
С помощью скобок можно изменить последовательность вычисления выражения: x = (5 + 10) * 3 / 2
Теперь порядок вычислений станет иным:
1. К числу 5 будет прибавлено 10.
2. Полученное значение будет умножено на 3.
3. Полученное значение будет поделено на 2.
4. Значение будет присвоено переменной x
>>> x = (5 + 10) * 3 / 2
>>> x
22.5
Перечислим операторы в порядке убывания приоритета:
1.
-x
,
+x
,
x
,
**
— унарный минус, унарный плюс, двоичная инверсия, возведение в сте- пень. Если унарные операторы расположены слева от оператора
**
, то возведение в сте- пень имеет больший приоритет, а если справа — то меньший. Например, выражение:
-10 ** -2 эквивалентно следующей расстановке скобок:
-(10 ** (-2))
2.
*
,
%
,
/
,
//
— умножение (повторение), остаток от деления, деление, деление с округле- нием вниз.
3.
+
, – — сложение (конкатенация), вычитание.
4.
<<
,
>>
— двоичные сдвиги.
5.
&
— двоичное И.
6.
^
— двоичное исключающее ИЛИ.
7.
|
— двоичное ИЛИ.
8.
=
,
+=
,
-=
,
*=
,
/=
,
//=
,
%=
,
**=
— присваивание.
ГЛ А В А
4
Условные операторы и циклы
Условные операторы позволяют в зависимости от значения логического выражения выпол- нить отдельный участок программы или, наоборот, не выполнить его. Логические выраже- ния возвращают только два значения:
True
(истина) или
False
(ложь), которые ведут себя как целые числа
1
и
0
соответственно:
>>> True + 2 # Эквивалентно 1 + 2 3
>>> False + 2 # Эквивалентно 0 + 2 2
Логическое значение можно сохранить в переменной:
>>> x = True; y = False
>>> x, y
(True, False)
Любой объект в логическом контексте может интерпретироваться как истина (
True
) или как ложь (
False
). Для определения логического значения можно использовать функцию bool()
Значение
True возвращает следующие объекты:
любое число, не равное нулю:
>>> bool(1), bool(20), bool(-20)
(True, True, True)
>>> bool(1.0), bool(0.1), bool(-20.0)
(True, True, True)
не пустой объект:
>>> bool("0"), bool([0, None]), bool((None,)), bool({"x": 5})
(True, True, True, True)
Следующие объекты интерпретируются как
False
:
число, равное нулю:
>>> bool(0), bool(0.0)
(False, False)
пустой объект:
>>> bool(""), bool([]), bool(())
(False, False, False)
60
Часть I. Основы языка Python
значение
None
:
>>> bool(None)
False
4.1. Операторы сравнения
Операторы сравнения используются в логических выражениях. Приведем их перечень:
==
— равно:
>>> 1 == 1, 1 == 5
(True, False)
!=
— не равно:
>>> 1 != 5, 1 != 1
(True, False)
<
— меньше:
>>> 1 < 5, 1 < 0
(True, False)
>
— больше:
>>> 1 > 0, 1 > 5
(True, False)
<=
— меньше или равно:
>>> 1 <= 5, 1 <= 0, 1 <= 1
(True, False, True)
>=
— больше или равно:
>>> 1 >= 0, 1 >= 5, 1 >= 1
(True, False, True)
in
— проверка на вхождение в последовательность:
>>> "Строка" in "Строка для поиска" # Строки
True
>>> 2 in [1, 2, 3], 4 in [1, 2, 3] # Списки
(True, False)
>>> 2 in (1, 2, 3), 4 in (1, 2, 3) # Кортежи
(True, False)
Оператор in можно также использовать для проверки существования ключа словаря:
>>> "x" in {"x": 1, "y": 2}, "z" in {"x": 1, "y": 2}
(True, False)
not in
— проверка на невхождение в последовательность:
>>> "Строка" not in "Строка для поиска" # Строки
False
>>> 2 not in [1, 2, 3], 4 not in [1, 2, 3] # Списки
(False, True)
Глава 4. Условные операторы и циклы
61
>>> 2 not in (1, 2, 3), 4 not in (1, 2, 3) # Кортежи
(False, True)
is
— проверяет, ссылаются ли две переменные на один и тот же объект. Если перемен- ные ссылаются на один и тот же объект, оператор is возвращает значение
True
:
>>> x = y = [1, 2]
>>> x is y
True
>>> x = [1, 2]; y = [1, 2]
>>> x is y
False
Следует заметить, что в целях повышения эффективности интерпретатор производит кэширование малых целых чисел и небольших строк. Это означает, что если ста пере- менным присвоено число 2, то в этих переменных, скорее всего, будет сохранена ссылка на один и тот же объект:
>>> x = 2; y = 2; z = 2
>>> x is y, y is z
(True, True)
is not
— проверяет, ссылаются ли две переменные на разные объекты. Если это так, возвращается значение
True
:
>>> x = y = [1, 2]
>>> x is not y
False
>>> x = [1, 2]; y = [1, 2]
>>> x is not y
True
Значение логического выражения можно инвертировать с помощью оператора not
:
>>> x = 1; y = 1
>>> x == y
True
>>> not (x == y), not x == y
(False, False)
Если переменные x
и y
равны, возвращается значение
True
, но так как перед выражением стоит оператор not
, выражение вернет
False
. Круглые скобки можно не указывать, по- скольку оператор not имеет более низкий приоритет выполнения, чем операторы сравнения.
В логическом выражении можно указывать сразу несколько условий:
>>> x = 10
>>> 1 < x < 20, 11 < x < 20
(True, False)
Несколько логических выражений можно объединить в одно большое с помощью следую- щих операторов:
and
— логическое И. Если x
в выражении x and y интерпретируется как
False
, то воз- вращается x
, в противном случае — y
. Примеры:
>>> 1 < 5 and 2 < 5 # True and True == True
True
62
Часть I. Основы языка Python
>>> 1 < 5 and 2 > 5 # True and False == False
False
>>> 1 > 5 and 2 < 5 # False and True == False
False
>>> 10 and 20, 0 and 20, 10 and 0
(20, 0, 0)
or
— логическое ИЛИ. Если x
в выражении x or y интерпретируется как
False
, то воз- вращается y
, в противном случае — x
. Примеры:
>>> 1 < 5 or 2 < 5 # True or True == True
True
>>> 1 < 5 or 2 > 5 # True or False == True
True
>>> 1 > 5 or 2 < 5 # False or True == True
True
>>> 1 > 5 or 2 > 5 # False or False == False
False
>>> 10 or 20, 0 or 20, 10 or 0
(10, 20, 10)
>>> 0 or "" or None or [] or "s"
's'
Следующее выражение вернет
True только в том случае, если оба выражения вернут
True
: x1 == x2 and x2 != x3
А это выражение вернет
True
, если хотя бы одно из выражений вернет
True
: x1 == x2 or x3 == x4
Перечислим операторы сравнения в порядке убывания приоритета:
1.
<
,
>
,
<=
,
>=
,
==
,
!=
,
<>
, is
, is not
, in
, not in
2. not
— логическое отрицание.
3. and
— логическое И.
4. or
— логическое ИЛИ.
4.2. Оператор ветвления if...else
Оператор ветвления if...else позволяет в зависимости от значения логического выраже- ния выполнить отдельный участок программы или, наоборот, не выполнить его. Оператор имеет следующий формат: if <Логическое выражение>:
<Блок, выполняемый, если условие истинно>
[elif <Логическое выражение>:
<Блок, выполняемый, если условие истинно>
]
[else:
<Блок, выполняемый, если все условия ложны>
]
Глава 4. Условные операторы и циклы
63
Как вы уже знаете, блоки внутри составной инструкции выделяются одинаковым количест- вом пробелов (обычно четырьмя). Концом блока является инструкция, перед которой рас- положено меньшее количество пробелов. В некоторых языках программирования логиче- ское выражение заключается в круглые скобки. В языке Python это делать необязательно, но можно, т. к. любое выражение может быть расположено внутри круглых скобок. Тем не менее, круглые скобки следует использовать только при необходимости разместить условие на нескольких строках.
1 ... 4 5 6 7 8 9 10 11 ... 83
В этом случае мы получим число 17, как и должно быть. Однако если пользователь вместо числа введет строку, то программа завершится с фатальной ошибкой. Как обработать ошиб- ку, мы разберемся по мере изучения языка.
2.6. Удаление переменных
Удалить переменную можно с помощью инструкции del
: del <Переменная1>[, ..., <ПеременнаяN>]
Глава 2. Переменные
51
Пример удаления одной переменной:
>>> x = 10; x
10
>>> del x; x
Traceback (most recent call last):
File "
", line 1, in del x; x
NameError: name 'x' is not defined
Пример удаления нескольких переменных:
>>> x, y = 10, 20
>>> del x, y
ГЛ А В А
3
Операторы
Операторы позволяют произвести с данными определенные действия. Например, операто- ры присваивания служат для сохранения данных в переменной, математические операторы позволяют выполнить арифметические вычисления, а оператор конкатенации строк служит для соединения двух строк в одну. Рассмотрим операторы, доступные в Python 3, подробно.
3.1. Математические операторы
Производить операции над числами позволяют математические операторы:
+
— сложение:
>>> 10 + 5 # Целые числа
15
>>> 12.4 + 5.2 # Вещественные числа
17.6
>>> 10 + 12.4 # Целые и вещественные числа
22.4
-
— вычитание:
>>> 10 - 5 # Целые числа
5
>>> 12.4 - 5.2 # Вещественные числа
7.2
>>> 12 - 5.2 # Целые и вещественные числа
6.8
*
— умножение:
>>> 10 * 5 # Целые числа
50
>>> 12.4 * 5.2 # Вещественные числа
64.48
>>> 10 * 5.2 # Целые и вещественные числа
52.0
/
— деление. Результатом деления всегда является вещественное число, даже если про- изводится деление целых чисел. Обратите внимание на эту особенность, если вы раньше
Глава 3. Операторы
53 программировали на Python 2. В Python 2 при делении целых чисел остаток отбрасывал- ся и возвращалось целое число, в Python 3 поведение оператора изменилось:
>>> 10 / 5 # Деление целых чисел без остатка
2.0
>>> 10 / 3 # Деление целых чисел с остатком
3.3333333333333335
>>> 10.0 / 5.0 # Деление вещественных чисел
2.0
>>> 10.0 / 3.0 # Деление вещественных чисел
3.3333333333333335
>>> 10 / 5.0 # Деление целого числа на вещественное
2.0
>>> 10.0 / 5 # Деление вещественного числа на целое
2.0
//
— деление с округлением вниз. Вне зависимости от типа чисел остаток отбрасывается:
>>> 10 // 5 # Деление целых чисел без остатка
2
>>> 10 // 3 # Деление целых чисел с остатком
3
>>> 10.0 // 5.0 # Деление вещественных чисел
2.0
>>> 10.0 // 3.0 # Деление вещественных чисел
3.0
>>> 10 // 5.0 # Деление целого числа на вещественное
2.0
>>> 10 // 3.0 # Деление целого числа на вещественное
3.0
>>> 10.0 // 5 # Деление вещественного числа на целое
2.0
>>> 10.0 // 3 # Деление вещественного числа на целое
3.0
%
— остаток от деления:
>>> 10 % 5 # Деление целых чисел без остатка
0
>>> 10 % 3 # Деление целых чисел с остатком
1
>>> 10.0 % 5.0 # Операция над вещественными числами
0.0
>>> 10.0 % 3.0 # Операция над вещественными числами
1.0
>>> 10 % 5.0 # Операция над целыми и вещественными числами
0.0
>>> 10 % 3.0 # Операция над целыми и вещественными числами
1.0
>>> 10.0 % 5 # Операция над целыми и вещественными числами
0.0
>>> 10.0 % 3 # Операция над целыми и вещественными числами
1.0
54
Часть I. Основы языка Python
**
— возведение в степень:
>>> 10 ** 2, 10.0 ** 2
(100, 100.0)
унарный минус (–) и унарный плюс (
+
):
>>> +10, +10.0, -10, -10.0, -(-10), -(-10.0)
(10, 10.0, -10, -10.0, 10, 10.0)
Как видно из примеров, операции над числами разных типов возвращают число, имеющее более сложный тип из типов, участвующих в операции. Целые числа имеют самый простой тип, далее идут вещественные числа и самый сложный тип — комплексные числа. Таким образом, если в операции участвуют целое число и вещественное, то целое число будет автоматически преобразовано в вещественное число, затем будет произведена операция над вещественными числами, а результатом станет вещественное число.
При выполнении операций над вещественными числами следует учитывать ограничения точности вычислений. Например, результат следующей операции может показаться стран- ным:
>>> 0.3 - 0.1 - 0.1 - 0.1
-2.7755575615628914e-17
Ожидаемым был бы результат
0.0
, но, как видно из примера, мы получили совсем другой результат. Если необходимо производить операции с фиксированной точностью, следует использовать модуль decimal
:
>>> from decimal import Decimal
>>> Decimal("0.3") - Decimal("0.1") - Decimal("0.1") - Decimal("0.1")
Decimal('0.0')
3.2. Двоичные операторы
Двоичные операторы предназначены для манипуляции отдельными битами. Язык Python поддерживает следующие двоичные операторы:
— двоичная инверсия. Значение каждого бита заменяется на противоположное:
>>> x = 100 # 01100100
>>> x = x # 10011011
&
— двоичное И:
>>> x = 100 # 01100100
>>> y = 75 # 01001011
>>> z = x & y # 01000000
>>> "{0:b} & {1:b} = {2:b}".format(x, y, z)
'1100100 & 1001011 = 1000000'
|
— двоичное ИЛИ:
>>> x = 100 # 01100100
>>> y = 75 # 01001011
>>> z = x | y # 01101111
>>> "{0:b} | {1:b} = {2:b}".format(x, y, z)
'1100100 | 1001011 = 1101111'
Глава 3. Операторы
55
^
— двоичное исключающее ИЛИ:
>>> x = 100 # 01100100
>>> y = 250 # 11111010
>>> z = x ^ y # 10011110
>>> "{0:b} ^ {1:b} = {2:b}".format(x, y, z)
'1100100 ^ 11111010 = 10011110'
<<
— сдвиг влево — сдвигает двоичное представление числа влево на один или более разрядов и заполняет разряды справа нулями:
>>> x = 100 # 01100100
>>> y = x << 1 # 11001000
>>> z = y << 1 # 10010000
>>> k = z << 2 # 01000000
>>
— сдвиг вправо — сдвигает двоичное представление числа вправо на один или более разрядов и заполняет разряды слева нулями, если число положительное:
>>> x = 100 # 01100100
>>> y = x >> 1 # 00110010
>>> z = y >> 1 # 00011001
>>> k = z >> 2 # 00000110
Если число отрицательное, то разряды слева заполняются единицами:
>>> x = -127 # 10000001
>>> y = x >> 1 # 11000000
>>> z = y >> 2 # 11110000
>>> k = z << 1 # 11100000
>>> m = k >> 1 # 11110000 3.3. Операторы для работы с последовательностями
Для работы с последовательностями предназначены следующие операторы:
+
— конкатенация:
>>> print("Строка1" + "Строка2") # Конкатенация строк
Строка1Строка2
>>> [1, 2, 3] + [4, 5, 6] # Списки
[1, 2, 3, 4, 5, 6]
>>> (1, 2, 3) + (4, 5, 6) # Кортежи
(1, 2, 3, 4, 5, 6)
*
— повторение:
>>> "s" * 20 # Строки 'ssssssssssssssssssss'
>>> [1, 2] * 3 # Списки
[1, 2, 1, 2, 1, 2]
>>> (1, 2) * 3 # Кортежи
(1, 2, 1, 2, 1, 2)
56
Часть I. Основы языка Python
in
— проверка на вхождение. Если элемент входит в последовательность, то возвраща- ется логическое значение
True
:
>>> "Строка" in "Строка для поиска" # Строки
True
>>> "Строка2" in "Строка для поиска" # Строки
False
>>> 2 in [1, 2, 3], 4 in [1, 2, 3] # Списки
(True, False)
>>> 2 in (1, 2, 3), 6 in (1, 2, 3) # Кортежи
(True, False)
not in
— проверка на невхождение. Если элемент не входит в последовательность, воз- вращается
True
:
>>> "Строка" not in "Строка для поиска" # Строки
False
>>> "Строка2" not in "Строка для поиска" # Строки
True
>>> 2 not in [1, 2, 3], 4 not in [1, 2, 3] # Списки
(False, True)
>>> 2 not in (1, 2, 3), 6 not in (1, 2, 3) # Кортежи
(False, True)
3.4. Операторы присваивания
Операторы присваивания предназначены для сохранения значения в переменной. Приведем перечень операторов присваивания, доступных в языке Python:
=
— присваивает переменной значение:
>>> x = 5; x
5
+=
— увеличивает значение переменной на указанную величину:
>>> x = 5; x += 10 # Эквивалентно x = x + 10
>>> x
15
Для последовательностей оператор
+=
производит конкатенацию:
>>> s = "Стр"; s += "ока"
>>> print(s)
Строка
-=
— уменьшает значение переменной на указанную величину:
>>> x = 10; x -= 5 # Эквивалентно x = x — 5
>>> x
5
*=
— умножает значение переменной на указанную величину:
>>> x = 10; x *= 5 # Эквивалентно x = x * 5
>>> x
50
Глава 3. Операторы
57
Для последовательностей оператор
*=
производит повторение:
>>> s = "*"; s *= 20
>>> s
'********************'
/=
— делит значение переменной на указанную величину:
>>> x = 10; x /= 3 # Эквивалентно x = x / 3
>>> x
3.3333333333333335
>>> y = 10.0; y /= 3.0 # Эквивалентно y = y / 3.0
>>> y
3.3333333333333335
//=
— деление с округлением вниз и присваиванием:
>>> x = 10; x //= 3 # Эквивалентно x = x // 3
>>> x
3
>>> y = 10.0; y //= 3.0 # Эквивалентно y = y // 3.0
>>> y
3.0
%=
— деление по модулю и присваивание:
>>> x = 10; x %= 2 # Эквивалентно x = x % 2
>>> x
0
>>> y = 10; y %= 3 # Эквивалентно y = y % 3
>>> y
1
**=
— возведение в степень и присваивание:
>>> x = 10; x **= 2 # Эквивалентно x = x ** 2
>>> x
100 3.5. Приоритет выполнения операторов
В какой последовательности будет вычисляться приведенное далее выражение? x = 5 + 10 * 3 / 2
Это зависит от приоритета выполнения операторов. В данном случае последовательность вычисления выражения будет такой:
1. Число 10 будет умножено на 3, т. к. приоритет оператора умножения выше приоритета оператора сложения.
2. Полученное значение будет поделено на 2, т. к. приоритет оператора деления равен при- оритету оператора умножения (а операторы с равными приоритетами выполняются сле- ва направо), но выше, чем у оператора сложения.
58
Часть I. Основы языка Python
3. К полученному значению будет прибавлено число 5, т. к. оператор присваивания
=
имеет наименьший приоритет.
4. Значение будет присвоено переменной x
>>> x = 5 + 10 * 3 / 2
>>> x
20.0
С помощью скобок можно изменить последовательность вычисления выражения: x = (5 + 10) * 3 / 2
Теперь порядок вычислений станет иным:
1. К числу 5 будет прибавлено 10.
2. Полученное значение будет умножено на 3.
3. Полученное значение будет поделено на 2.
4. Значение будет присвоено переменной x
>>> x = (5 + 10) * 3 / 2
>>> x
22.5
Перечислим операторы в порядке убывания приоритета:
1.
-x
,
+x
,
x
,
**
— унарный минус, унарный плюс, двоичная инверсия, возведение в сте- пень. Если унарные операторы расположены слева от оператора
**
, то возведение в сте- пень имеет больший приоритет, а если справа — то меньший. Например, выражение:
-10 ** -2 эквивалентно следующей расстановке скобок:
-(10 ** (-2))
2.
*
,
%
,
/
,
//
— умножение (повторение), остаток от деления, деление, деление с округле- нием вниз.
3.
+
, – — сложение (конкатенация), вычитание.
4.
<<
,
>>
— двоичные сдвиги.
5.
&
— двоичное И.
6.
^
— двоичное исключающее ИЛИ.
7.
|
— двоичное ИЛИ.
8.
=
,
+=
,
-=
,
*=
,
/=
,
//=
,
%=
,
**=
— присваивание.
ГЛ А В А
4
Условные операторы и циклы
Условные операторы позволяют в зависимости от значения логического выражения выпол- нить отдельный участок программы или, наоборот, не выполнить его. Логические выраже- ния возвращают только два значения:
True
(истина) или
False
(ложь), которые ведут себя как целые числа
1
и
0
соответственно:
>>> True + 2 # Эквивалентно 1 + 2 3
>>> False + 2 # Эквивалентно 0 + 2 2
Логическое значение можно сохранить в переменной:
>>> x = True; y = False
>>> x, y
(True, False)
Любой объект в логическом контексте может интерпретироваться как истина (
True
) или как ложь (
False
). Для определения логического значения можно использовать функцию bool()
Значение
True возвращает следующие объекты:
любое число, не равное нулю:
>>> bool(1), bool(20), bool(-20)
(True, True, True)
>>> bool(1.0), bool(0.1), bool(-20.0)
(True, True, True)
не пустой объект:
>>> bool("0"), bool([0, None]), bool((None,)), bool({"x": 5})
(True, True, True, True)
Следующие объекты интерпретируются как
False
:
число, равное нулю:
>>> bool(0), bool(0.0)
(False, False)
пустой объект:
>>> bool(""), bool([]), bool(())
(False, False, False)
60
Часть I. Основы языка Python
значение
None
:
>>> bool(None)
False
4.1. Операторы сравнения
Операторы сравнения используются в логических выражениях. Приведем их перечень:
==
— равно:
>>> 1 == 1, 1 == 5
(True, False)
!=
— не равно:
>>> 1 != 5, 1 != 1
(True, False)
<
— меньше:
>>> 1 < 5, 1 < 0
(True, False)
>
— больше:
>>> 1 > 0, 1 > 5
(True, False)
<=
— меньше или равно:
>>> 1 <= 5, 1 <= 0, 1 <= 1
(True, False, True)
>=
— больше или равно:
>>> 1 >= 0, 1 >= 5, 1 >= 1
(True, False, True)
in
— проверка на вхождение в последовательность:
>>> "Строка" in "Строка для поиска" # Строки
True
>>> 2 in [1, 2, 3], 4 in [1, 2, 3] # Списки
(True, False)
>>> 2 in (1, 2, 3), 4 in (1, 2, 3) # Кортежи
(True, False)
Оператор in можно также использовать для проверки существования ключа словаря:
>>> "x" in {"x": 1, "y": 2}, "z" in {"x": 1, "y": 2}
(True, False)
not in
— проверка на невхождение в последовательность:
>>> "Строка" not in "Строка для поиска" # Строки
False
>>> 2 not in [1, 2, 3], 4 not in [1, 2, 3] # Списки
(False, True)
Глава 4. Условные операторы и циклы
61
>>> 2 not in (1, 2, 3), 4 not in (1, 2, 3) # Кортежи
(False, True)
is
— проверяет, ссылаются ли две переменные на один и тот же объект. Если перемен- ные ссылаются на один и тот же объект, оператор is возвращает значение
True
:
>>> x = y = [1, 2]
>>> x is y
True
>>> x = [1, 2]; y = [1, 2]
>>> x is y
False
Следует заметить, что в целях повышения эффективности интерпретатор производит кэширование малых целых чисел и небольших строк. Это означает, что если ста пере- менным присвоено число 2, то в этих переменных, скорее всего, будет сохранена ссылка на один и тот же объект:
>>> x = 2; y = 2; z = 2
>>> x is y, y is z
(True, True)
is not
— проверяет, ссылаются ли две переменные на разные объекты. Если это так, возвращается значение
True
:
>>> x = y = [1, 2]
>>> x is not y
False
>>> x = [1, 2]; y = [1, 2]
>>> x is not y
True
Значение логического выражения можно инвертировать с помощью оператора not
:
>>> x = 1; y = 1
>>> x == y
True
>>> not (x == y), not x == y
(False, False)
Если переменные x
и y
равны, возвращается значение
True
, но так как перед выражением стоит оператор not
, выражение вернет
False
. Круглые скобки можно не указывать, по- скольку оператор not имеет более низкий приоритет выполнения, чем операторы сравнения.
В логическом выражении можно указывать сразу несколько условий:
>>> x = 10
>>> 1 < x < 20, 11 < x < 20
(True, False)
Несколько логических выражений можно объединить в одно большое с помощью следую- щих операторов:
and
— логическое И. Если x
в выражении x and y интерпретируется как
False
, то воз- вращается x
, в противном случае — y
. Примеры:
>>> 1 < 5 and 2 < 5 # True and True == True
True
62
Часть I. Основы языка Python
>>> 1 < 5 and 2 > 5 # True and False == False
False
>>> 1 > 5 and 2 < 5 # False and True == False
False
>>> 10 and 20, 0 and 20, 10 and 0
(20, 0, 0)
or
— логическое ИЛИ. Если x
в выражении x or y интерпретируется как
False
, то воз- вращается y
, в противном случае — x
. Примеры:
>>> 1 < 5 or 2 < 5 # True or True == True
True
>>> 1 < 5 or 2 > 5 # True or False == True
True
>>> 1 > 5 or 2 < 5 # False or True == True
True
>>> 1 > 5 or 2 > 5 # False or False == False
False
>>> 10 or 20, 0 or 20, 10 or 0
(10, 20, 10)
>>> 0 or "" or None or [] or "s"
's'
Следующее выражение вернет
True только в том случае, если оба выражения вернут
True
: x1 == x2 and x2 != x3
А это выражение вернет
True
, если хотя бы одно из выражений вернет
True
: x1 == x2 or x3 == x4
Перечислим операторы сравнения в порядке убывания приоритета:
1.
<
,
>
,
<=
,
>=
,
==
,
!=
,
<>
, is
, is not
, in
, not in
2. not
— логическое отрицание.
3. and
— логическое И.
4. or
— логическое ИЛИ.
4.2. Оператор ветвления if...else
Оператор ветвления if...else позволяет в зависимости от значения логического выраже- ния выполнить отдельный участок программы или, наоборот, не выполнить его. Оператор имеет следующий формат: if <Логическое выражение>:
<Блок, выполняемый, если условие истинно>
[elif <Логическое выражение>:
<Блок, выполняемый, если условие истинно>
]
[else:
<Блок, выполняемый, если все условия ложны>
]
Глава 4. Условные операторы и циклы
63
Как вы уже знаете, блоки внутри составной инструкции выделяются одинаковым количест- вом пробелов (обычно четырьмя). Концом блока является инструкция, перед которой рас- положено меньшее количество пробелов. В некоторых языках программирования логиче- ское выражение заключается в круглые скобки. В языке Python это делать необязательно, но можно, т. к. любое выражение может быть расположено внутри круглых скобок. Тем не менее, круглые скобки следует использовать только при необходимости разместить условие на нескольких строках.
1 ... 4 5 6 7 8 9 10 11 ... 83
Глава 2. Переменные
51
Пример удаления одной переменной:
>>> x = 10; x
10
>>> del x; x
Traceback (most recent call last):
File "
", line 1, in
NameError: name 'x' is not defined
Пример удаления нескольких переменных:
>>> x, y = 10, 20
>>> del x, y
ГЛ А В А
3
Операторы
Операторы позволяют произвести с данными определенные действия. Например, операто- ры присваивания служат для сохранения данных в переменной, математические операторы позволяют выполнить арифметические вычисления, а оператор конкатенации строк служит для соединения двух строк в одну. Рассмотрим операторы, доступные в Python 3, подробно.
3.1. Математические операторы
Производить операции над числами позволяют математические операторы:
+
— сложение:
>>> 10 + 5 # Целые числа
15
>>> 12.4 + 5.2 # Вещественные числа
17.6
>>> 10 + 12.4 # Целые и вещественные числа
22.4
-
— вычитание:
>>> 10 - 5 # Целые числа
5
>>> 12.4 - 5.2 # Вещественные числа
7.2
>>> 12 - 5.2 # Целые и вещественные числа
6.8
*
— умножение:
>>> 10 * 5 # Целые числа
50
>>> 12.4 * 5.2 # Вещественные числа
64.48
>>> 10 * 5.2 # Целые и вещественные числа
52.0
/
— деление. Результатом деления всегда является вещественное число, даже если про- изводится деление целых чисел. Обратите внимание на эту особенность, если вы раньше
Глава 3. Операторы
53 программировали на Python 2. В Python 2 при делении целых чисел остаток отбрасывал- ся и возвращалось целое число, в Python 3 поведение оператора изменилось:
>>> 10 / 5 # Деление целых чисел без остатка
2.0
>>> 10 / 3 # Деление целых чисел с остатком
3.3333333333333335
>>> 10.0 / 5.0 # Деление вещественных чисел
2.0
>>> 10.0 / 3.0 # Деление вещественных чисел
3.3333333333333335
>>> 10 / 5.0 # Деление целого числа на вещественное
2.0
>>> 10.0 / 5 # Деление вещественного числа на целое
2.0
//
— деление с округлением вниз. Вне зависимости от типа чисел остаток отбрасывается:
>>> 10 // 5 # Деление целых чисел без остатка
2
>>> 10 // 3 # Деление целых чисел с остатком
3
>>> 10.0 // 5.0 # Деление вещественных чисел
2.0
>>> 10.0 // 3.0 # Деление вещественных чисел
3.0
>>> 10 // 5.0 # Деление целого числа на вещественное
2.0
>>> 10 // 3.0 # Деление целого числа на вещественное
3.0
>>> 10.0 // 5 # Деление вещественного числа на целое
2.0
>>> 10.0 // 3 # Деление вещественного числа на целое
3.0
%
— остаток от деления:
>>> 10 % 5 # Деление целых чисел без остатка
0
>>> 10 % 3 # Деление целых чисел с остатком
1
>>> 10.0 % 5.0 # Операция над вещественными числами
0.0
>>> 10.0 % 3.0 # Операция над вещественными числами
1.0
>>> 10 % 5.0 # Операция над целыми и вещественными числами
0.0
>>> 10 % 3.0 # Операция над целыми и вещественными числами
1.0
>>> 10.0 % 5 # Операция над целыми и вещественными числами
0.0
>>> 10.0 % 3 # Операция над целыми и вещественными числами
1.0
54
Часть I. Основы языка Python
**
— возведение в степень:
>>> 10 ** 2, 10.0 ** 2
(100, 100.0)
унарный минус (–) и унарный плюс (
+
):
>>> +10, +10.0, -10, -10.0, -(-10), -(-10.0)
(10, 10.0, -10, -10.0, 10, 10.0)
Как видно из примеров, операции над числами разных типов возвращают число, имеющее более сложный тип из типов, участвующих в операции. Целые числа имеют самый простой тип, далее идут вещественные числа и самый сложный тип — комплексные числа. Таким образом, если в операции участвуют целое число и вещественное, то целое число будет автоматически преобразовано в вещественное число, затем будет произведена операция над вещественными числами, а результатом станет вещественное число.
При выполнении операций над вещественными числами следует учитывать ограничения точности вычислений. Например, результат следующей операции может показаться стран- ным:
>>> 0.3 - 0.1 - 0.1 - 0.1
-2.7755575615628914e-17
Ожидаемым был бы результат
0.0
, но, как видно из примера, мы получили совсем другой результат. Если необходимо производить операции с фиксированной точностью, следует использовать модуль decimal
:
>>> from decimal import Decimal
>>> Decimal("0.3") - Decimal("0.1") - Decimal("0.1") - Decimal("0.1")
Decimal('0.0')
3.2. Двоичные операторы
Двоичные операторы предназначены для манипуляции отдельными битами. Язык Python поддерживает следующие двоичные операторы:
— двоичная инверсия. Значение каждого бита заменяется на противоположное:
>>> x = 100 # 01100100
>>> x = x # 10011011
&
— двоичное И:
>>> x = 100 # 01100100
>>> y = 75 # 01001011
>>> z = x & y # 01000000
>>> "{0:b} & {1:b} = {2:b}".format(x, y, z)
'1100100 & 1001011 = 1000000'
|
— двоичное ИЛИ:
>>> x = 100 # 01100100
>>> y = 75 # 01001011
>>> z = x | y # 01101111
>>> "{0:b} | {1:b} = {2:b}".format(x, y, z)
'1100100 | 1001011 = 1101111'
Глава 3. Операторы
55
^
— двоичное исключающее ИЛИ:
>>> x = 100 # 01100100
>>> y = 250 # 11111010
>>> z = x ^ y # 10011110
>>> "{0:b} ^ {1:b} = {2:b}".format(x, y, z)
'1100100 ^ 11111010 = 10011110'
<<
— сдвиг влево — сдвигает двоичное представление числа влево на один или более разрядов и заполняет разряды справа нулями:
>>> x = 100 # 01100100
>>> y = x << 1 # 11001000
>>> z = y << 1 # 10010000
>>> k = z << 2 # 01000000
>>
— сдвиг вправо — сдвигает двоичное представление числа вправо на один или более разрядов и заполняет разряды слева нулями, если число положительное:
>>> x = 100 # 01100100
>>> y = x >> 1 # 00110010
>>> z = y >> 1 # 00011001
>>> k = z >> 2 # 00000110
Если число отрицательное, то разряды слева заполняются единицами:
>>> x = -127 # 10000001
>>> y = x >> 1 # 11000000
>>> z = y >> 2 # 11110000
>>> k = z << 1 # 11100000
>>> m = k >> 1 # 11110000 3.3. Операторы для работы с последовательностями
Для работы с последовательностями предназначены следующие операторы:
+
— конкатенация:
>>> print("Строка1" + "Строка2") # Конкатенация строк
Строка1Строка2
>>> [1, 2, 3] + [4, 5, 6] # Списки
[1, 2, 3, 4, 5, 6]
>>> (1, 2, 3) + (4, 5, 6) # Кортежи
(1, 2, 3, 4, 5, 6)
*
— повторение:
>>> "s" * 20 # Строки 'ssssssssssssssssssss'
>>> [1, 2] * 3 # Списки
[1, 2, 1, 2, 1, 2]
>>> (1, 2) * 3 # Кортежи
(1, 2, 1, 2, 1, 2)
56
Часть I. Основы языка Python
in
— проверка на вхождение. Если элемент входит в последовательность, то возвраща- ется логическое значение
True
:
>>> "Строка" in "Строка для поиска" # Строки
True
>>> "Строка2" in "Строка для поиска" # Строки
False
>>> 2 in [1, 2, 3], 4 in [1, 2, 3] # Списки
(True, False)
>>> 2 in (1, 2, 3), 6 in (1, 2, 3) # Кортежи
(True, False)
not in
— проверка на невхождение. Если элемент не входит в последовательность, воз- вращается
True
:
>>> "Строка" not in "Строка для поиска" # Строки
False
>>> "Строка2" not in "Строка для поиска" # Строки
True
>>> 2 not in [1, 2, 3], 4 not in [1, 2, 3] # Списки
(False, True)
>>> 2 not in (1, 2, 3), 6 not in (1, 2, 3) # Кортежи
(False, True)
3.4. Операторы присваивания
Операторы присваивания предназначены для сохранения значения в переменной. Приведем перечень операторов присваивания, доступных в языке Python:
=
— присваивает переменной значение:
>>> x = 5; x
5
+=
— увеличивает значение переменной на указанную величину:
>>> x = 5; x += 10 # Эквивалентно x = x + 10
>>> x
15
Для последовательностей оператор
+=
производит конкатенацию:
>>> s = "Стр"; s += "ока"
>>> print(s)
Строка
-=
— уменьшает значение переменной на указанную величину:
>>> x = 10; x -= 5 # Эквивалентно x = x — 5
>>> x
5
*=
— умножает значение переменной на указанную величину:
>>> x = 10; x *= 5 # Эквивалентно x = x * 5
>>> x
50
Глава 3. Операторы
57
Для последовательностей оператор
*=
производит повторение:
>>> s = "*"; s *= 20
>>> s
'********************'
/=
— делит значение переменной на указанную величину:
>>> x = 10; x /= 3 # Эквивалентно x = x / 3
>>> x
3.3333333333333335
>>> y = 10.0; y /= 3.0 # Эквивалентно y = y / 3.0
>>> y
3.3333333333333335
//=
— деление с округлением вниз и присваиванием:
>>> x = 10; x //= 3 # Эквивалентно x = x // 3
>>> x
3
>>> y = 10.0; y //= 3.0 # Эквивалентно y = y // 3.0
>>> y
3.0
%=
— деление по модулю и присваивание:
>>> x = 10; x %= 2 # Эквивалентно x = x % 2
>>> x
0
>>> y = 10; y %= 3 # Эквивалентно y = y % 3
>>> y
1
**=
— возведение в степень и присваивание:
>>> x = 10; x **= 2 # Эквивалентно x = x ** 2
>>> x
100 3.5. Приоритет выполнения операторов
В какой последовательности будет вычисляться приведенное далее выражение? x = 5 + 10 * 3 / 2
Это зависит от приоритета выполнения операторов. В данном случае последовательность вычисления выражения будет такой:
1. Число 10 будет умножено на 3, т. к. приоритет оператора умножения выше приоритета оператора сложения.
2. Полученное значение будет поделено на 2, т. к. приоритет оператора деления равен при- оритету оператора умножения (а операторы с равными приоритетами выполняются сле- ва направо), но выше, чем у оператора сложения.
58
Часть I. Основы языка Python
3. К полученному значению будет прибавлено число 5, т. к. оператор присваивания
=
имеет наименьший приоритет.
4. Значение будет присвоено переменной x
>>> x = 5 + 10 * 3 / 2
>>> x
20.0
С помощью скобок можно изменить последовательность вычисления выражения: x = (5 + 10) * 3 / 2
Теперь порядок вычислений станет иным:
1. К числу 5 будет прибавлено 10.
2. Полученное значение будет умножено на 3.
3. Полученное значение будет поделено на 2.
4. Значение будет присвоено переменной x
>>> x = (5 + 10) * 3 / 2
>>> x
22.5
Перечислим операторы в порядке убывания приоритета:
1.
-x
,
+x
,
x
,
**
— унарный минус, унарный плюс, двоичная инверсия, возведение в сте- пень. Если унарные операторы расположены слева от оператора
**
, то возведение в сте- пень имеет больший приоритет, а если справа — то меньший. Например, выражение:
-10 ** -2 эквивалентно следующей расстановке скобок:
-(10 ** (-2))
2.
*
,
%
,
/
,
//
— умножение (повторение), остаток от деления, деление, деление с округле- нием вниз.
3.
+
, – — сложение (конкатенация), вычитание.
4.
<<
,
>>
— двоичные сдвиги.
5.
&
— двоичное И.
6.
^
— двоичное исключающее ИЛИ.
7.
|
— двоичное ИЛИ.
8.
=
,
+=
,
-=
,
*=
,
/=
,
//=
,
%=
,
**=
— присваивание.
ГЛ А В А
4
Условные операторы и циклы
Условные операторы позволяют в зависимости от значения логического выражения выпол- нить отдельный участок программы или, наоборот, не выполнить его. Логические выраже- ния возвращают только два значения:
True
(истина) или
False
(ложь), которые ведут себя как целые числа
1
и
0
соответственно:
>>> True + 2 # Эквивалентно 1 + 2 3
>>> False + 2 # Эквивалентно 0 + 2 2
Логическое значение можно сохранить в переменной:
>>> x = True; y = False
>>> x, y
(True, False)
Любой объект в логическом контексте может интерпретироваться как истина (
True
) или как ложь (
False
). Для определения логического значения можно использовать функцию bool()
Значение
True возвращает следующие объекты:
любое число, не равное нулю:
>>> bool(1), bool(20), bool(-20)
(True, True, True)
>>> bool(1.0), bool(0.1), bool(-20.0)
(True, True, True)
не пустой объект:
>>> bool("0"), bool([0, None]), bool((None,)), bool({"x": 5})
(True, True, True, True)
Следующие объекты интерпретируются как
False
:
число, равное нулю:
>>> bool(0), bool(0.0)
(False, False)
пустой объект:
>>> bool(""), bool([]), bool(())
(False, False, False)
60
Часть I. Основы языка Python
значение
None
:
>>> bool(None)
False
4.1. Операторы сравнения
Операторы сравнения используются в логических выражениях. Приведем их перечень:
==
— равно:
>>> 1 == 1, 1 == 5
(True, False)
!=
— не равно:
>>> 1 != 5, 1 != 1
(True, False)
<
— меньше:
>>> 1 < 5, 1 < 0
(True, False)
>
— больше:
>>> 1 > 0, 1 > 5
(True, False)
<=
— меньше или равно:
>>> 1 <= 5, 1 <= 0, 1 <= 1
(True, False, True)
>=
— больше или равно:
>>> 1 >= 0, 1 >= 5, 1 >= 1
(True, False, True)
in
— проверка на вхождение в последовательность:
>>> "Строка" in "Строка для поиска" # Строки
True
>>> 2 in [1, 2, 3], 4 in [1, 2, 3] # Списки
(True, False)
>>> 2 in (1, 2, 3), 4 in (1, 2, 3) # Кортежи
(True, False)
Оператор in можно также использовать для проверки существования ключа словаря:
>>> "x" in {"x": 1, "y": 2}, "z" in {"x": 1, "y": 2}
(True, False)
not in
— проверка на невхождение в последовательность:
>>> "Строка" not in "Строка для поиска" # Строки
False
>>> 2 not in [1, 2, 3], 4 not in [1, 2, 3] # Списки
(False, True)
Глава 4. Условные операторы и циклы
61
>>> 2 not in (1, 2, 3), 4 not in (1, 2, 3) # Кортежи
(False, True)
is
— проверяет, ссылаются ли две переменные на один и тот же объект. Если перемен- ные ссылаются на один и тот же объект, оператор is возвращает значение
True
:
>>> x = y = [1, 2]
>>> x is y
True
>>> x = [1, 2]; y = [1, 2]
>>> x is y
False
Следует заметить, что в целях повышения эффективности интерпретатор производит кэширование малых целых чисел и небольших строк. Это означает, что если ста пере- менным присвоено число 2, то в этих переменных, скорее всего, будет сохранена ссылка на один и тот же объект:
>>> x = 2; y = 2; z = 2
>>> x is y, y is z
(True, True)
is not
— проверяет, ссылаются ли две переменные на разные объекты. Если это так, возвращается значение
True
:
>>> x = y = [1, 2]
>>> x is not y
False
>>> x = [1, 2]; y = [1, 2]
>>> x is not y
True
Значение логического выражения можно инвертировать с помощью оператора not
:
>>> x = 1; y = 1
>>> x == y
True
>>> not (x == y), not x == y
(False, False)
Если переменные x
и y
равны, возвращается значение
True
, но так как перед выражением стоит оператор not
, выражение вернет
False
. Круглые скобки можно не указывать, по- скольку оператор not имеет более низкий приоритет выполнения, чем операторы сравнения.
В логическом выражении можно указывать сразу несколько условий:
>>> x = 10
>>> 1 < x < 20, 11 < x < 20
(True, False)
Несколько логических выражений можно объединить в одно большое с помощью следую- щих операторов:
and
— логическое И. Если x
в выражении x and y интерпретируется как
False
, то воз- вращается x
, в противном случае — y
. Примеры:
>>> 1 < 5 and 2 < 5 # True and True == True
True
62
Часть I. Основы языка Python
>>> 1 < 5 and 2 > 5 # True and False == False
False
>>> 1 > 5 and 2 < 5 # False and True == False
False
>>> 10 and 20, 0 and 20, 10 and 0
(20, 0, 0)
or
— логическое ИЛИ. Если x
в выражении x or y интерпретируется как
False
, то воз- вращается y
, в противном случае — x
. Примеры:
>>> 1 < 5 or 2 < 5 # True or True == True
True
>>> 1 < 5 or 2 > 5 # True or False == True
True
>>> 1 > 5 or 2 < 5 # False or True == True
True
>>> 1 > 5 or 2 > 5 # False or False == False
False
>>> 10 or 20, 0 or 20, 10 or 0
(10, 20, 10)
>>> 0 or "" or None or [] or "s"
's'
Следующее выражение вернет
True только в том случае, если оба выражения вернут
True
: x1 == x2 and x2 != x3
А это выражение вернет
True
, если хотя бы одно из выражений вернет
True
: x1 == x2 or x3 == x4
Перечислим операторы сравнения в порядке убывания приоритета:
1.
<
,
>
,
<=
,
>=
,
==
,
!=
,
<>
, is
, is not
, in
, not in
2. not
— логическое отрицание.
3. and
— логическое И.
4. or
— логическое ИЛИ.
4.2. Оператор ветвления if...else
Оператор ветвления if...else позволяет в зависимости от значения логического выраже- ния выполнить отдельный участок программы или, наоборот, не выполнить его. Оператор имеет следующий формат: if <Логическое выражение>:
<Блок, выполняемый, если условие истинно>
[elif <Логическое выражение>:
<Блок, выполняемый, если условие истинно>
]
[else:
<Блок, выполняемый, если все условия ложны>
]
Глава 4. Условные операторы и циклы
63
Как вы уже знаете, блоки внутри составной инструкции выделяются одинаковым количест- вом пробелов (обычно четырьмя). Концом блока является инструкция, перед которой рас- положено меньшее количество пробелов. В некоторых языках программирования логиче- ское выражение заключается в круглые скобки. В языке Python это делать необязательно, но можно, т. к. любое выражение может быть расположено внутри круглых скобок. Тем не менее, круглые скобки следует использовать только при необходимости разместить условие на нескольких строках.
1 ... 4 5 6 7 8 9 10 11 ... 83