Главная страница

Введение в программирование алгоритмов на Python в этой глаВе Числовые и логические вычисления


Скачать 1.22 Mb.
НазваниеВведение в программирование алгоритмов на Python в этой глаВе Числовые и логические вычисления
Дата04.12.2022
Размер1.22 Mb.
Формат файлаpdf
Имя файлаalgoritmy-dlya-chaynikov-dialektika.pdf
ТипГлава
#828302
страница3 из 3
1   2   3
Принятие решений с помощью инструкций
if
В повседневной жизни вы регулярно используете предложения со словом
“если”. Например, вы можете сказать себе “если сегодня четверг, на обед я возьму блюдо из рыбы”. Инструкции if в Python менее многословны, но дей- ствуют по той же схеме. Чтобы увидеть, как это работает, откройте копию
IPython и введите следующий код:
03_Part01.indd 107 18.04.2018 17:25:34

Часть I
Начала
108
def TestValue(Value): if Value == 5: print('Значение Value равно 5!') elif Value == 6: print('Значение Value равно 6!') else: print('Значение Value равно чему-то иному.') print('Оно равно ' + str(Value))
Каждая инструкция if в Python начинается, как ни странно это звучит, со слова if
. Когда Python видит if
, он знает, что вы хотите принять некоторое решение. После слова if идет условие, указывающее, какой вид сравнения дол- жен выполнить Python. В приведенном выше случае вы хотите, чтобы Python выяснил, содержит ли
Value значение
5
Обратите внимание, что условие использует оператор отношения ра- венства
==
, а не оператор присваивания
=
. Распространенная ошибка начинающих разработчиков — использование оператора присваива- ния вместо оператора равенства, что ведет к некорректной работе кода.
Условие всегда заканчивается двоеточием (
:
). Если вы не поставите двоето- чие, Python не будет знать, что условие закончено, и будет продолжать искать дополнительные условия, что, скорее всего, приведет к ошибке. После двоето- чия следуют действия, выполнения которых вы хотите от Python.
Может потребоваться выполнить несколько задач в одной инструкции if
Конструкция elif позволяет добавить дополнительное условие и связанные с ним задачи. Эта конструкция представляет собой дополнение к предыдуще- му условию, которым в данном случае является конструкция if
. Конструкция elif всегда предусматривает наличие условия, как в инструкции if
, и имеет собственный связанный с условием набор задач для выполнения.
Иногда вам нужно сделать что­то, если условие не выполняется. Для этого служит инструкция else
. Она указывает Python, что делать, если условия в конструкции if оказываются ложными.
Обратите внимание, как с усложнением функциональности растет важность отступов. Функция содержит инструкцию if
, которая, в свою очередь, содержит только один вызов print()
. Конструкция else содержит уже два вызова print()
Чтобы увидеть эту функцию в действии, введите
TestValue(1)
и на- жмите клавишу . Вы увидите выход из конструкции else
. Введите
TestValue(5)
и нажмите клавишу , и вывод будет выполнен вызовом из инструкции if
. Если вы введете
TestValue(6)
и нажмете клавишу , то выполнится вызов из конструкции elif
. Функция
TestValue()
оказывается
ВНИМАНИЕ!
ЗАПОМНИ!
03_Part01.indd 108 18.04.2018 17:25:35

Глава 4
Введение в программирование алгоритмов на Python
109
значительно более гибкой, чем предыдущие функции, рассматриваемые в этой главе, потому что она может принимать решения.
Выбор одного из нескольких вариантов
с использованием вложенных принятий решений
Вложенность представляет собой процесс размещения подчиненной ин- струкции внутри другой. В большинстве случаев вы можете вложить любую инструкцию в любую другую. Чтобы увидеть, как это работает, откройте ко- пию IPython и введите следующий код:
def SecretNumber():
One = int(input("Введите число от 1 до 10: "))
Two = int(input("Введите число от 1 до 10: ")) if (One >= 1) and (One <= 10): if (Two >= 1) and (Two <= 10): print('Ваше секретное число равно: ' + str(One * Two)) else: print("Неверное второе значение!") else: print("Неверное первое значение!")
В этом случае функция
SecretNumber()
просит вас ввести два числа. При необходимости вы можете получить данные от пользователя с помощью функ- ции input()
; функция int()
преобразует введенные данные в число.
На этот раз имеется два уровня инструкции if
. Первый уровень проверяет корректность числа
One
. Второй уровень проверяет корректность числа
Two
Когда и
One
, и
Two имеют значения от 1 до 10, функция
SecretNumber()
выво- дит пользователю “секретное число”.
Чтобы увидеть функцию
SecretNumber()
в действии, введите
SecretNumber()
и нажмите клавишу . Введите
20
и нажмите клави- шу , когда вас попросят ввести первое входное значение, а в ответ на просьбу ввести второе значение введите
10
и нажмите клавишу . Вы увидите сообщение об ошибке, гласящее, что первое значение введено невер- но. Введите
SecretNumber()
и нажмите клавишу еще раз. На этот раз введите значения
10
и
20
. Теперь функция сообщит, что второе значение является неверным. Попробуйте еще раз выполнить те же действия, вводя на этот раз числа
10
и
10
Выполнение повторяющихся действий
с использованием цикла
for
Иногда необходимо выполнить некоторые действия более чем один раз.
Когда нужно выполнить действия определенное количество раз, можно
03_Part01.indd 109 18.04.2018 17:25:35

Часть I
Начала
110
использовать цикл for
, который имеет определенные начало и конец. Количе- ство итераций, выполняемых циклом, зависит от количества элементов в пре- доставляемой переменной. Чтобы увидеть, как это работает, откройте копию
IPython и введите следующий код:
def DisplayMulti(*VarArgs): for Arg in VarArgs: if Arg.upper() == 'CONT': continue print('Continue Argument: ' + Arg) elif Arg.upper() == 'BREAK': break print('Break Argument: ' + Arg) print('Good Argument: ' + Arg)
В этом случае цикл for пытается обработать каждый элемент
VarArgs
. Об- ратите внимание на наличие вложенной в цикл инструкции if
, которая прове- ряет два условия завершения.
В большинстве случаев код пропускает инструкцию if и просто выводит аргумент. Однако, когда инструкция if находит во входных значениях слово
CONT
или
BREAK
, она выполняет одно из двух действий.
continue
»
: заставляет цикл продолжаться, переходя от текущей точ- ки к обработке следующего значения из
VarArgs.
break
»
: прекращает работу цикла.
Ключевые слова могут использовать любую комбинацию прописных и строчных букв, как, например,
ConT
, потому что функция upper()
пре- образует их в символы верхнего регистра. Функция
DisplayMulti()
может обрабатывать любое количество входных строк. Чтобы увидеть ее в действии, введите
DisplayMulti('Hello','Goodbye','First',
'Last')
и нажмите клавишу . Вы увидите каждую из входных строк в отдельной строке на экране в выходных данных. Теперь вве- дите
DisplayMulti('Hello','Cont','Goodbye','Break','Last')
и нажмите клавишу . Обратите внимание, что слова
Cont и
Break в выходных данных не отображаются, потому что являются ключевыми словами. Кроме того, в выходных данных отсутствует и слово
Last
, поскольку цикл завершается до его обработки.
Использование цикла
while
Цикл while выполняет итерации до тех пор, пока его условие не переста- нет быть истинным. Как и инструкция for
, инструкция while поддерживает
СОВЕТ
03_Part01.indd 110 18.04.2018 17:25:36

Глава 4
Введение в программирование алгоритмов на Python
111
ключевые слова continue и break
. Чтобы увидеть цикл while в работе, открой- те копию IPython и введите следующий код:
def SecretNumber():
GotIt = False while GotIt == False:
One = int(input("Введите число от 1 до 10: "))
Two = int(input("Введите число от 1 до 10: ")) if (One >= 1) and (One <= 10): if (Two >= 1) and (Two <= 10): print('Ваше секретное число равно: ' + str(One * Two))
GotIt = True continue else: print("Неверное второе значение!") else: print("Неверное первое значение!") print("Попробуйте еще раз!")
Перед вами расширение функции
SecretNumber()
, описанной в разделе
“Выбор одного из нескольких вариантов с использованием вложенных приня- тий решений” ранее в этой главе. Однако в этом случае добавление инструкции while приводит к тому, что функция продолжает запрашивать повтор ввода, пока не получит корректный ответ.
Чтобы увидеть, как работает цикл while
, введите
SecretNumber()
и на- жмите клавишу . Введите
20
и нажмите клавишу , затем вве- дите
10
и вновь нажмите клавишу . Вы получите сообщение о том, что первое введенное число неверное, и предложение повторить ввод. Попробуйте во второй раз, используя теперь значения
10
и
20
. На этот раз вы получите со- общение о неверном втором числе и предложение повторить ввод. При третьей попытке используйте значения
10
и
10
. На этот раз вы получите “секретное число”. Обратите внимание, что оператор continue не позволяет приложению предложить вам снова ввести данные.
Хранение данных в множествах,
списках и кортежах
При работе с алгоритмами все действия выполняются с данными. Python предоставляет множество методов для хранения данных в памяти. Каждый метод имеет свои преимущества и недостатки. Важно, исходя из конкретных потребностей, выбрать наиболее подходящий метод хранения. В следующих разделах рассматриваются три распространенных метода хранения данных.
03_Part01.indd 111 18.04.2018 17:25:36

Часть I
Начала
112
Создание множеств
Большинство людей использовали множества (да хотя бы на уроках матема- тики в школе) для создания списков связанных между собой элементов. Затем над этими списками могут выполняться различные манипуляции с использова- нием математических операций, таких как пересечение, объединение, разность или симметричная разность. Множества оказываются наилучшим выбором, когда нужно выполнить проверку членства или удалить дубликаты из списка.
С помощью множеств нельзя выполнить задачи, связанные с последователь- ностями, такие как индексирование или срез. Чтобы на практике увидеть, как можно работать с множествами, запустите копию IPython и введите следую- щий код:
SetA = set(['Red', 'Blue', 'Green', 'Black'])
SetB = set(['Black', 'Green', 'Yellow', 'Orange'])
SetX = SetA.union(SetB)
SetY = SetA.intersection(SetB)
SetZ = SetA.difference(SetB)
Теперь у вас есть пять различных множеств, каждое из которых имеет неко- торые общие элементы. Чтобы просмотреть результаты каждой математической операции, введите
print('{0}\n{1}\n{2}'.format(SetX,SetY,SetZ))
и на- жмите клавишу . Вы увидите по одному множеству в каждой строке:
{'Blue', 'Orange', 'Red', 'Green', 'Black', 'Yellow'}
{'Green', 'Black'}
{'Blue', 'Red'}
Вывод демонстрирует результаты выполнения математических опе- раций difference()
, union()
и intersection()
. Форматирование вывода в Python может оказаться полезным при работе с множества- ми. Функция format()
указывает Python, какие объекты следует ис- пользовать вместо каждого из заполнителей в строке. Заполнитель представляет собой фигурные скобки (
{}
) с необязательным числом в них. Управляющий символ
\n обеспечивает вывод знака начала новой строки. О применении форматирования и управлении им в
Python вы можете прочесть по адресу http://go.dialektika.com/
alg04_02
Можно также проверить различные соотношения между множествами. На- пример, введите
SetA.issuperset(SetY)
и нажмите клавишу . Выход- ное значение
True говорит о том, что множество
SetA
является надмножеством
SetY
. Аналогично, введя
SetA.issubset(SetX)
и нажав клавишу , вы обнаружите, что
SetA
представляет собой подмножество
SetX
СОВЕТ
03_Part01.indd 112 18.04.2018 17:25:36

Глава 4
Введение в программирование алгоритмов на Python
113
Важно понимать, что множества могут быть изменяемыми или неизменяе- мыми. В данном примере все множества являются изменяемыми, т.е. в них можно добавлять элементы или удалять их из множеств. Например, если вве- сти
SetA.add('Purple')
и нажать клавишу , множество
SetA
получит новый элемент. Если вы введете
SetA.issubset(SetX)
и нажмете клавишу
, то выяснится, что
SetA
больше не является подмножеством
SetX
, по- тому что у множества
SetA
имеется элемент 'Purple'
, которого нет в
SetX
Создание списков
Список в Python определен как разновидность последовательности. По-
следовательность представляет собой средство, позволяющее нескольким элементам данных сосуществовать в одной единице хранения, но в качестве отдельных сущностей. Рассматривайте их как ящики для почты в подъездах многоквартирных домов. Один такой ящик содержит ряд небольших ячеек, каждая из которых может содержать почту. Python также поддерживает другие виды последовательностей.
Кортежи
»
. Кортеж представляет собой коллекцию, которая исполь- зуется для создания сложных, похожих на список последовательно- стей. Преимуществом кортежей является то, что содержимое корте- жа может быть вложенным. Эта функциональность позволяет созда- вать структуры, которые могут содержать записи о сотрудниках или о парах координат x‑y.
Словари
»
. При использовании словарей вы создаете пары “ключ/
значение” (как и в случае реальных словарей пары “слово/его определение”). Словарь обеспечивает невероятно быстрый поиск и упрощает упорядочение данных.
Стеки
»
. Большинство языков программирования непосредственно поддерживает стеки. Однако в Python стек не поддерживается, хотя для этого имеется обходной путь. Стек — это последовательность, которая характеризуется правилом “последним вошел — первым вышел” (last in/first out — LIFO). Подумайте о стопке блинов: вы мо- жете добавлять новые блины, укладывая их поверх стопки, но и брать их можно тоже только сверху. Стек представляет собой важ- ную коллекцию, которую можно моделировать в Python с помощью списка.
Очереди
»
. Очередь представляет собой коллекцию, которая харак- теризуется правилом “первым вошел — первым вышел” (first in/first out — FIFO). Очередь используется для отслеживания элементов, которые должны быть каким-то образом обработаны. Думайте об очереди как об обычной очереди в реальной жизни.
03_Part01.indd 113 18.04.2018 17:25:37

Часть I
Начала
114
Деки
»
. Двусторонняя очередь (double-ended queue, deque) пред- ставляет собой структуру, схожую с очередью, но у нее постановка в очередь и выход из нее могут осуществляться с обоих концов (но не из средины). Дек можно использовать как очередь или как стек, или как любую иную коллекцию, добавление в которую (и удаление из которой) выполняется упорядоченным образом (в отличие от списков, кортежей и словарей, которые допускают произвольный доступ к элементам).
Среди всех последовательностей списки являются простейшими для по- нимания и наиболее тесно связанными с реальными объектами. Работа со списками помогает научиться работе с другими видами последовательностей, обеспечивающими большую функциональность и гибкость. Дело в том, что хранение данных в списке очень схоже с их записью на листке бумаги, когда один элемент следует за другим. Список имеет начало, средину и конец. Python нумерует элементы в списке. (Нумерация элементов в списке облегчает доступ к ним.) Чтобы просмотреть списки в работе, запустите копию IPython и введи- те следующий код:
ListA = [0, 1, 2, 3]
ListB = [4, 5, 6, 7]
ListA.extend(ListB)
ListA
После ввода последней строки кода вы увидите вывод
[0,1,2,3,4,5,6,7]
Функция extend()
добавляет элементы­члены списка
ListB
к списку
ListA
Помимо расширения списков, к ним можно добавлять элементы, используя функцию append()
. Введите
ListA.append(-5)
и нажмите клавишу .
Если вы введете
ListA
и снова нажмете , то увидите, что Python доба- вил
‑5
в конец списка. Чтобы удалить элементы из списка, используйте функ- цию remove()
. Например, введите
ListA.remove(-5)
и нажмите клавишу
. Когда вы снова запросите список
ListA
, введя
ListA
и нажав , вы увидите, что добавленный элемент
‑5
из списка удален.
Списки также поддерживают конкатенацию с помощью операто- ра “плюс” (
+
), который добавляет элементы одного списка к друго- му. Например, если ввести
ListX=ListA+ListB
и нажать клавишу
, можно увидеть, что созданный список
ListX
содержит эле- менты списков
ListA
и
ListB
, причем элементы списка
ListA
рас- положены первыми.
ЗАПОМНИ!
03_Part01.indd 114 18.04.2018 17:25:37

Глава 4
Введение в программирование алгоритмов на Python
115
Создание и использование кортежей
Кортеж представляет собой коллекцию, которая используется для создания сложных списков, в которых один кортеж можно вставлять в другой. Это по- зволяет создавать иерархии с использованием кортежей. Иерархия может быть по уровню сложности такой же, как список каталогов жесткого диска или ор- ганизационная структура вашей компании. Главное, что вы можете создавать сложные структуры данных с помощью кортежей.
Кортежи являются неизменяемыми, так что вы не можете их изме- нять. Можно создать новый кортеж с тем же именем и тем или иным способом его изменить, но нельзя изменить существующий кортеж.
В отличие от кортежей, списки являются изменяемыми. На первый взгляд, неизменяемость кортежей может показаться недостатком, но она имеет свои преимущества, а именно — безопасность и скорость.
Кроме того, неизменяемые объекты легче использовать в многозадач- ной среде с несколькими процессорами. Чтобы увидеть, как работа- ют кортежи, запустите копию IPython и введите следующий код:
MyTuple = (1, 2, 3, (4, 5, 6, (7, 8, 9)))
MyTuple имеет трехуровневую вложенность. Первый уровень состоит из значений
1
,
2
,
3
и кортежа. Второй уровень состоит из значения
4
,
5
,
6
и еще одного кортежа. Третий уровень состоит из значений
7
,
8
и
9
. Чтобы увидеть, как это работает, введите в IPython следующий код:
for Value1 in MyTuple: if type(Value1) == int: print(Value1) else: for Value2 in Value1: if type(Value2) == int: print("\t", Value2) else: for Value3 in Value2: print("\t\t", Value3)
При выполнении этого кода вы увидите значения на трех разных уровнях, показанных с помощью отступов:
1 2
3 4
5 6
7 8
9
ЗАПОМНИ!
03_Part01.indd 115 18.04.2018 17:25:37

Часть I
Начала
116
Можно выполнять такие задачи, как добавление новых значений, но делать это следует путем добавления в новый кортеж исходных запи- сей и новых значений. Кроме того, кортежи можно добавлять только в уже существующие кортежи. Чтобы увидеть, как это работает, вве- дите
MyNewTuple=MyTuple.__add__((10,11,12,(13,14,15)))
и нажмите клавишу . Кортеж
MyNewTuple теперь содержит но- вые записи на первом и втором уровнях:
(1,2,3,(4,5,6,(7,8,9)),
10,11,12,(13,14,15))
Определение итераторов
В последующих главах используются всевозможные методы доступа к от- дельным значениям в структурах данных различных типов. В этом разделе ис- пользуются два простых списка, определенных следующим образом:
ListA = ['Orange', 'Yellow', 'Green', 'Brown']
ListB = [1, 2, 3, 4]
Простейший метод получения доступа к определенным значениям состоит в использовании индекса. Например, если ввести
ListA[1]
и нажать клавишу
, на выходе можно увидеть 'Yellow'
. Все индексы в Python отсчитыва- ются с нуля, а это означает, что первая запись имеет индекс 0, а не 1.
Диапазоны представляют собой еще одно простое средство доступа к зна- чениям. Например, если ввести
ListB[1:3]
и нажать , будет выведено
[2,3]
. Диапазон можно использовать в качестве входных данных для цикла for
, такого как for Value in ListB[1:3]: print(Value)
Вместо всего списка вы увидите выведенными в отдельных строках только
2
и
3
. Диапазон состоит из двух значений, разделенных двоеточием. Однако значения являются необязательными. Например,
ListB[:3]
приведет к выводу
[1,2,3]
. Когда вы пропускаете значение, диапазон начинается в начале (или заканчивается в конце) списка.
Иногда нужно обработать два списка параллельно. Самый простой способ сделать это — использовать функцию zip()
. Ниже приведен пример функции zip()
в действии:
for Value1, Value2 in zip(ListA, ListB): print(Value1, '\t', Value2)
СОВЕТ
03_Part01.indd 116 18.04.2018 17:25:37

Глава 4
Введение в программирование алгоритмов на Python
117
Этот код одновременно обрабатывает
ListA
и
ListB
. Обработка заверша- ется, когда цикл for достигает конца более короткого из двух списков. В этом случае можно увидеть следующее:
Orange 1
Yellow 2
Green 3
Brown 4
Это всего лишь верхушка айсберга. В книге вы увидите множество различных типов итераторов. Идея заключается в том, чтобы позво- лить перечислять только нужные элементы вместо всех элементов в списке или иной структуре данных. Некоторые из итераторов, ис- пользуемых в последующих главах, немного сложнее показанных здесь, но это всего лишь начало.
Индексация данных
с использованием словарей
Словарь представляет собой особый вид последовательности, которая ис- пользует пару “имя/значение”. Используя имя, можно легко получить доступ к определенному значению с помощью сущности, отличной от числового ин- декса. Для создания словаря пары имен и значений заключаются в фигурные скобки. Создайте тестовый словарь, введя
MyDict={'Orange':1,'Blue':2,
'Pink':3}
и нажав клавишу .
Для доступа к определенному значению используйте в качестве индекса имя. Например, введите
MyDict['Pink']
и нажмите , чтобы увидеть выходное значение
3
. Использование словарей в качестве структуры данных упрощает доступ к невероятно сложным наборам данных с использованием понятных для всех терминов. Во многих других отношениях работа со слова- рем является такой же, как и с любой другой последовательностью.
Словари обладают некоторыми специальными возможностями. Например, можно ввести
MyDict.keys()
и нажать клавишу , чтобы просмотреть список ключей. Чтобы увидеть список значений в словаре, можно воспользо- ваться функцией values()
ЗАПОМНИ!
03_Part01.indd 117 18.04.2018 17:25:38
1   2   3


написать администратору сайта