Лекция 13. Подпрограммы. (часть 2) (1152915)
Текст из файла
1Воробьева И.А. «Информатика. Язык Питон»Подпрограммы. Взаимодействие подпрограмм (продолжение)Программирование с использованием подпрограмм. Типы подпрограмм.Формальные и фактические параметры. Способы передачи параметров.Параметры по умолчанию, списки параметров. Области видимостипеременных. Разработка сложных программ, содержащих подпрограммы.Использование имени подпрограммы в качестве параметра.8. ПОДПРОГРАММЫ. ВЗАИМОДЕЙСТВИЕ ПОДПРОГРАММ8.2.3.
Дополнительные сведения о параметрах в PythonЯзык Python предоставляет достаточно гибкий набор способовпередачи параметра с точки зрения синтаксиса, не изменяя основномуправилу передачи параметров. Напомним его.Действует следующее правило, неизменяемые переменныепередаются только по значению (параметр-значение), а изменяемые– по ссылке (параметр-переменная).!Это означает, что для написания рабочего кода, реализующегоалгоритмы, вполне достаточно знать информацию из п.п. 8.2.2. Гибкостьсинтаксической конструкции призвана давать удобство в написаниикода, а не увеличивать его функционал. Ближайший известный наманалог – это цикл for, который вполне может быть замещен однимтолько циклом while.
Не будем описывать все способы, которые есть вPython, но есть два, которые могут оказаться очень полезными.Важно. Все параметры, которые мы рассматриваем в разделе 8.2.относятся к так называемым позиционным параметрам. Этоозначает, что в каком порядке они перечислены при определениифункции, в таком же порядке должны записываться и при ее вызове.Другими словами, важна «позиция в списке параметров».!2Воробьева И.А. «Информатика. Язык Питон»Значения аргументов по умолчаниюНередко в решениях практических задач есть параметры, которыепринимают определенные значения, что называется «как правило».Например: стандартное время открытия и закрытия заведения (магазина,офиса, поликлиники и т.п.) – 8.00 - 19.00; время задержки, принятое в данном классе приборов – 10 с; максимальное время ожидания «действия пользователя» – 5 мин; начальное значение важной для алгоритма величины и т.д.В этом случае удобно какую-то часть параметров функции сделатьнеобязательными, это значит, что для них будут использоватьсянекоторые заданные значения по умолчанию, если пользователь неукажет собственных.Их можно указать, добавив к имени параметра в определениифункции оператор присваивания «=» с последующим значением.Примеры:def say(message, times = 1): def mesErr(err='', n=-1):print(message * times)if len(err) == 0:print('Неизвестная ошибка.')say('Привет!')elif n == -1:say('Привет! ', 5)print(err)else:Вывод:print('Ошибка '+err+' по адресу: ',hex(n))Привет!Привет! Привет! Привет!mesErr('деление на ноль', 0x5fd6)mesErr('Ошибка при открытии файла.')mesErr()mesErr(0x5fd6) # недопустимый вызов функцииВывод:Ошибка деление на ноль по адресу: 0x5fd6Ошибка при открытии файла.Неизвестная ошибка3Воробьева И.А.
«Информатика. Язык Питон»Важно. Параметры по умолчанию должны располагаться в концесписка обычных параметров. Так определить функцию нельзя:def func(a, b=5, c, d):….Подумайте, почему.!Переменное число параметровИногда бывает нужно определить функцию, способную приниматьлюбое число параметров. Этого можно достичь при помощи установки«звёздочки» (*) перед именем параметра.Когда мы объявляем параметр со звёздочкой (например, *), всепозиционные аргументы, начиная с этой позиции и до конца, будут собраны в кортеж под именем.Проще всего удобство переменного числа аргументов показать напримере (см. [1], c. 66). Здесь можно «просуммировать» любую последовательность простых типов с инициализацией, причем допустим вызов функции вообще без аргументов.def total(init=5, *numbers):count = initfor i in numbers: # здесь i инициализируется самой конструкцией for..incount += ireturn countprint(total(3,4,5))print(total("3","4","5"))print(total(-37.5, 4786, -15, 0.456, -25.03))print(total((3+1j),(4-3j),(-1j)))print(total(10))print(total())4Воробьева И.А.
«Информатика. Язык Питон»Вывод:123454708.926(7-3j)105Важно. Параметры в списке при определении функции размещать вследующем порядке: 1) параметры со значениями без умолчания; 2)параметры по умолчанию; 3) параметр со звездочкой.Подумайте, почему.!.8.3. Подпрограммы. Области видимости переменныхНапоминание.
Все имена, представленные в разделе описаний основнойпрограммы, называются глобальными. Они «действуют» как в разделеоператоров основной программы, так и в любой подпрограмме. Имена,представленные в разделе описаний подпрограммы, называют локальными. Онидействуют только в рамках подпрограммы и недоступны операторам основнойпрограммы. Глобальные и локальные имена размещаются в разных областяхоперативной памяти (ОП) и существуют только на время работы соответствующегопрограммного блока.А как в Python?Слово «действуют» недаром взято в кавычки, так как оно, вообщеговоря, зависит от языка программирования. В Python есть защита отдействия, которое относится к крайне не рекомендуемым, но котороеновички игнорируют так же часто, как и прочие полезныерекомендации.Это действие – изменение глобальной переменной в локальной областивидимости неявным образом. Python просто не позволит этого сделать,в силу того, как в языке организовано объявление переменных.Единственное «действие», которое он позволит – это прочитатьсодержимое переменной, но не изменить его, не заявив о подобномнамерении специальной декларацией.
Продемонстрируем напримерах.5Воробьева И.А. «Информатика. Язык Питон»фрагмент кодакомментарииx = 50def F1():print('В F1 x равен ', x)– читаем(видим) глобальный xdef F2():x += 22print(' В F2 x равен ', x)– пытаемся изменить глобальный xи напечатать егоdef F3():x = 22print(' В F3 x равен ', x)def F4(a):a = a + 22print(' В F4 x равен ', x)return a– может мы и думаем, что это изменениеглобальной переменной, но это вовсе не так –здесь x – локальная переменная вообще никакне связанная с глобальным x– изменим параметр, который передадут– читаем (видим) глобальный x– возвратим измененный параметррезультат на экране, комментарииF1()print('x по прежнему ', x)В F1 x равен 50x по прежнему 50Глобальная переменная видна внутрифункции.F2()print('x по прежнему ', x)Вызов F2() спровоцирует ошибку «localvariable 'd' referenced before assignment»,так как Python считает, что мыпытаемся использовать локальнуюпеременную до ее объявления.F3()print('x по прежнему ', x)В F3 x равен 22x по прежнему 506Воробьева И.А.
«Информатика. Язык Питон»x = F4(x)print('x изменен ЯВНО, чтохорошо ', x)В F4 x равен 50x изменен ЯВНО, что хорошо 72Глобальная переменная была измененачерез передачу и возврат параметра –это явное изменение, которое непройдет для вас неожиданным образом– повышает надежность кода.print('Хотим увидеть чемуравно a ', a)Cпровоцируем ошибку «NameError: name'a' is not defined»Переменные из локальной области недоступны на верхнем уровне.В таблице выше продемонстрирован так называемый принципматрешки, который работает для области видимости переменных: всепеременные, объявленные во внешней «матрешке», виднывнутренней «матрешке», а все, объявленные во внутренней, не виднывнешней.Этот же принцип срабатывает, но в обратную сторону для ситуации,когда переменные имеют одинаковые имена: мы этот принцип виделив примере для функции F3() – как только объявили локальнуюпеременную с таким же именем , как и у глобальной, так сразу жеперекрыли себе доступ видимости к глобальному .Примеры ниже демонстрируют область видимости глобальных илокальных переменных при одинаковых именах.
Они же показывают,почему лучше избегать одинаковых имен при недостаточной подготовкепрограммиста: по сути, совершенно разные переменные имеютодинаковое название – это нормальная ситуация (она носит названиесокрытие имен), так как у переменных c одинаковыми именами разныеобласти видимости. Опытный программист четко разницу понимает, ановичок может воспринимать разные переменные, как одну, что грозитошибками. В этой же связи, важные глобальные переменные неназывают типичными «рабочими» названиями, такими как или .7Воробьева И.А.
«Информатика. Язык Питон»Таблица 8.3что будет в переменных(на экране)№program Pr11 Num = 0//глобальная2def Prov( a):Num=5 //локальная345print('num1= ', Num)a=39return a67№12Prov(Num)print('num2= ', Num)program Pr2Num = 0Bam = 23456def Prov(Num)print('num1= ', Num)Num=5print('num2= ', Num)return Num78910Prov(Num);print('num3= ', Num);Prov(Bam);print('num4= ', Bam);num1 = 5num2 = 391-й вызов2-й вызовnum1 = 0num1 = 2num2 = 5num2 = 5num3 = 5num4 = 5Изменение области видимости переменныхЗарезервированное слово «global»Чтобы принудительно нарушить запрет Python на изменение глобальных имен внутри функций и присвоить некоторое значение пере-8Воробьева И.А. «Информатика.
Язык Питон»менной, определённой в головном модуле программы, необходимо использовать зарезервированное слово global.Зарезервированное слово global используется внутри подпрограммдля того, чтобы объявить, что– это глобальная переменная,разрешенная к изменению, а значит, когда мы присваиваем значениеименивнутри функции, это изменение отразится на значениипеременной в основном блоке программы.Замечание. Используя одно зарезервированное слово global, можнообъявить сразу несколько переменных: global x, y, z.Использование зарезервированного слова global достаточно яснопоказывает читающему код подпрограммы, что переменная объявлена всамом внешнем блоке.фрагмент кодарезультат, комментарииx = 50def F2():global x# указываем, что это глобальный xprint(' В F2 x равен ', x)x = 22# изменяем глобальный xprint('F2 получила доступ к # и напечатать его новое значениеx и х = ', x)________________на экране:print('x равен ', x)x равен 50F2()В F2 x равен 50F2 получила доступ к x и х = 22print('x изменился на верхнем уровне ', x)x изменился на верхнем уровне 229Воробьева И.А.
«Информатика. Язык Питон»Зарезервированное слово «nonlocal»Есть ещё один тип области видимости, называемый нелокальнойобластью видимости, который представляет собой нечто среднее междупервыми двумя. Нелокальные области видимости встречаются, когдавы определяете функции внутри функций.Давайте рассмотрим пример, приведенный в [1]:фрагмент кодарезультат, комментарииx = 56на экране:def F_out():x=2print(' В F_out x равен ', x)def F_in():nonlocal xx=5F_in()print('Локальный xсменился на', x)________________print(x)F_out()print('Глобальный xсменился на' x)56В F_out x равен 2Локальный x сменился на 5Глобальный x сменился на 56_________________________Когда мы находимся внутри F_in,переменная , определённая в первойстроке F_out находится ни в локальнойобластивидимости(определениепеременной не входит в блок F_in), ни вглобальной области видимости (онатакже и не в основном блокепрограммы).
Мы объявляем, что хотимиспользовать именно эту переменную, следующим образом: nonlocal .Замечание. Попробуйте заменить «nonlocal x» на «global x», а затемудалить это зарезервированное слово, и пронаблюдайте за разницеймежду этими двумя случаями.10Воробьева И.А. «Информатика. Язык Питон»Основные рекомендации для начинающего программиста можносвести к нескольким простым правилам, соблюдение которых поможетизбежать лишних ошибок.Таблица 8.4.РЕКОМЕНДАЦИИ ПО ИСПОЛЬЗОВАНИЮ ГЛОБАЛЬНЫХ И ЛОКАЛЬНЫХ ИМЕН Помните, что подпрограмма взаимодействует с вызывающей программой с помощью параметров, а не за счет видимости глобальных переменных – во многом именно для этого и была придумана синтаксическая конструкция «подпрограмма» – для сокрытиявидимости и локализации ответственности за ошибку. Осуществляйте верное деление на подзадачи и все переменные,которые имеют отношение к алгоритму решения подзадачи делайте локальными и полностью подконтрольными ей.
Характеристики
Тип файла PDF
PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.
Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.