Введение в программирование алгоритмов на Python в этой глаВе Числовые и логические вычисления
Скачать 1.22 Mb.
|
Принятие решений с помощью инструкций 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) и на- жмите клавишу . Введите TestValue(5) и нажмите клавишу . Если вы введете TestValue(6) и нажмете клавишу . Функция 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 и снова нажмете ‑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] и нажать клавишу . Все индексы в 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() и нажать клавишу ЗАПОМНИ! 03_Part01.indd 117 18.04.2018 17:25:38 |