Главная » Просмотр файлов » Лутц М. - Изучаем Python

Лутц М. - Изучаем Python (1077325), страница 90

Файл №1077325 Лутц М. - Изучаем Python (Лутц М. - Изучаем Python) 90 страницаЛутц М. - Изучаем Python (1077325) страница 902018-01-10СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 90)

«ак как значения по умолчанию реализованы в виде единственных объектов, изменяемые объекты по умолчанию сохраняют свое состояние от вызова к вызову, а не инициализируются заново при каждом вызове. В зависимости от того, кому задается вопрос, зта особенность может рассматриваться или как особенность, поддерживающая возможность сохранения состояния, или как недостаток языка. Подробнее об этом будет говориться в следующей главе. »> асса[0)(2) 16 »> апта[2)(2) 16 »> апта[4)(2) 16 № бса возвращают 4 * ° 2, последнее значение з № здесь должно бать 2 ° ° 2 № здесь должно бать 4 *.

2 а3В Глава )б. Области видимости и аргументы Произвольное вложение областей видимости Прежде чем закончить это исследование, я должен заметить, что об- ласти видимости могут вкладываться произвольно, но поиск будет производиться только в объемлющих функциях (не в классах, кото- рые описываются в шестой части книги): »> бет Г)() х - "99 Сет Г2(): бет Гз(): рг(лт х гз() г2() № Будет ивйдвив в обвести видииости ГП »> гт() 99 Интерпретатор будет искать переменную в локальных областях видимости всех объемлющих инструкций бе(, начиная от внутренних к внешним, выше локальной области видимости и ниже глобальной области видимости модуля. Однако такой программный код едва ли может получиться на практике. В языке РуФЬоп считается, что плоское лучше вложенного — ваша жизнь и жизнь ваших коллег будет проще, если вы сведете к минимуму количество вложенных определений функций. Передача аргументов Раньше уже говорилось, что передача аргументов производится посредством операции присваивания.

Здесь имеется несколько моментов, не всегда очевидных для начинающих, о которых будет говориться в этом разделе. Ниже приводится несколько важных замечаний, касающихся передачи аргументов в функции: ° Аргументы передаются через автоматическое присваивание объектов локальным именам. Аргументы функции — ссылки на объекты, которые (возможно) используются совместно с вызывающей программой — это всего лишь результат еще одной из разновидностей операции присваивания.

Ссылки в языке Ру()топ реализованы в виде указателей, поэтому все аргументы фактически передаются по указателям. Объекты, которые передаются в виде аргументов, никогда не копируются. ° Операция присваивания именам аргументов внутри функции не оказывает влияния на вызывающую программу. При вызове функции имена аргументов, указанные в ее заголовке, становятся новыми локальными именами в области видимости функции.

Это не является совмещением имен между именами аргументов и именами в вызывающей программе. 419 Передача аргументов ° Изменение внутри функции аргумента, который является изменяемым объектом, может оказывать влияние на вызывающую программу. С другой стороны, так как аргументы — это всего лишь результат операции присваивания полученных объектов, функции могут воздействовать на полученные изменяемые объекты и тем самым оказывать влияние на вызывающую программу.

Изменяемые объекты могут рассматриваться функциями, как средство ввода, так и вывода информации. За дополнительной информацией о ссылках обращайтесь к главе 6— все, что там говорится, вполне применимо и к аргументам функций несмотря нато, что присваивание именам аргументов выполняется автоматически и неявно.

Схема передачи аргументов посредством присваивания, принятая в язы- ке Ру[)топ, это далеко не то же самое, что передача аргументов по ссыл- ке в языке С++, но она очень близка к модели передачи аргументов в языке С: Аргументы и разделяемые ссылки Ниже приводится пример, который иллюстрирует работу этих поло- жений: »> авт опапзег[а, Ь)'. а = 2 э[03 = 'арав' № Функция № Изменяется только значение поколь~ого имени № изменяется нелосредстеенно разделяеиий объект »> Х = 1 >»«=[1, 23 »> опапзег(Х, [) »> Х, 11, ['ераю', 2]) № Визмааююая программа № Передаются изменяеиий и неизменяеммй обьектм № К - не изменилась, ь - изиеннлась ° Неизменяемые объекты передаются «по значению». Такие объекты, как целые числа и строки, передаются в виде ссылок на объекты, а не в виде копий объектов, но, так как неизменяемые объекты невозможно изменить непосредственно, передача таких объектов очень напоминает копирование.

° Изменяемые объекты передаются «по указателю». Такие объекты, как списки и словари, также передаются в виде ссылок на объекты, что очень похоже на то, как в языке С передаются указатели на массивы — изменяемые объекты допускают возможность непосредственного изменения внутри функции так же, как и массивы в языке С. Конечно, если вы никогда ранее не использовали язык С, модель передачи аргументов в языке Рустов буде казаться вам еще проще — согласно этой модели выполняется присваивание объектов именам аргументов, и она одинаково работает с любыми объектами, как с изменяемыми, так и с неизменяемыми. Передача аргументов как последовательность простых инструкций присваивания.

Для пер- вого аргумента операции присваивания не оказывают влияния на вы- зывающую программу: >» Х = 1 »> а = Х >» 8 = 2 »> рг1пС Х 1 Ф Разделяют один и тот ме объект В Изменяется только 'в', значение 'К' остается равныи 1 Но для второго аргумента операция присваивания сказывается на зна- чении переменной, участвующей в вызове, так как она производит не- посредственное изменение объекта: »>1=[1, 2] »> Ь = [ »> Ь[0] = 'араа' »> рг1пт [ ['зраю', 2] В Разделяют один и тот ме объект В Непосредственное изиенениег Ч ' такие изменяется Вспомните обсуждение вопросов совместного использования изменяемых объектов в главах 6 и 9, и вы узнаете это явление: непосредственное воздействие на изменяемый объект может сказываться на других ссылках на этот объект.

В данном случае один из параметров функции играет роль средства вывода информации. В языке Ру[]топ по умолчанию аргументы передаются в функции по ссылкам [т.е. по указателям), потому что в большинстве случаев именно это и требуется — это означает, что мы можем передавать крупные объекты в любые точки программы без создания множества копий и легко изменять эти объекты в процессе работы. Однако, если нам требуется избежать влияния непосредственных изменений объектов, производимых в функциях, на вызывающую программу, мы можем просто явно копировать изменяемые объекты, как описывалось в главе 6. В случае с аргументами функций мы всегда можем скопировать список в точке вызова: 'с=[1, 2] сьапрег(х, ь[;]) а передается копия, поэтому переменная ч ' не изменится Можно также создать копию внутри функции, если нам не требуется изменять полученный объект независимо от того, как была вызвана функция: Се( свап9ег(а, Ь); Ь Ь[:] Ф Входной список копируется, что исключает В воздействие на вызываюмую программу а = 2 Ь[0] = 'зраа' а Изменится только копия списка Как избежать воздействий на изменяемые аргументы 422 Глава 16, Области видимости и аргументы Оба варианта копирования не мешают функции изменять объект, они лишь препятствуют воздействию этих изменений на вызывающую программу.

Чтобы действительно предотвратить изменения, мы всегда можем преобразовать изменяемые объекты в неизменяемые, что позволит выявить источники проблем. Например, при попытке изменения кортежа будет возбуждено исключение: (1, 2] слапдег(х. тер1е(1)) № передается кортех, позтоиу попытка изменения № возбудит исключение Здесь используется встроенная функция тср1е, которая создает новый кортеж из всех элементов последовательности (в действительности— любого итерируемого объекта). Это особенно важно, потому что вынуждает писать функцию так, чтобы она никогда не пыталась изменять передаваемые ей аргументы.

Однако такое решение накладывает на функцию больше ограничений, чем следует, поэтому его вообще следует избегать. Нельзя знать заранее, когда изменение аргументов окажется необходимым. Кроме того, при таком подходе функция теряет возможность применять к аргументу методы списков, включая методы, которые не производят непосредственных изменений. Главное, что следует запомнить, — функции могут оказывать воздействия на передаваемые им изменяемые объекты (например, на списки и словари). Это не всегда является проблемой и часто может приносить пользу. Но вам действительно необходимо знать об этой особенности— если изменения в объектах происходят неожиданно для вас, проверьте вызываемые функции и в случае необходимости передавайте им копии объектов.

Имитация выходных параметров Мы уже обсудили инструкцию гетега и использовали ее в нескольких примерах. Эта инструкция может возвращать объект любого типа, поэтому с ее помощью можно возвращать сразу несколько значений, упаковав их в кортеж или в коллекцию любого другого типа. В языке Рус)топ фактически отсутствует такое понятие, которое в некоторых других языках называется япередача аргументов по ссылке», однако мы можем имитировать такое поведение, возвращая кортеж и выполняя присваивание результатов оригинальным именам аргументов в вызывающей программе: »> бег ав111р1е(х, у): х - "2 № Нзиеняется только локальное иия у-"(3, 4) гетега х, у № Новые значения возвращаются в виде кортеиа »> Х = 1 »>1=(1, 2) »> Х, ( = ае111Р1е(Х, 1) № результаты присваиваются ииенаи 423 Специальные режимы сопоставления аргументов »> Х, [2, [3, 4]) З е еызыеающея прогреыые Выглядит так, как будто функция возвращает два значения, но на самом деле — это единственный кортеж, состоящий из двух элементов, а необязательные окружающие скобки просто опущены.

После возврата из функции можно использовать операцию присваивания кортежа, чтобы извлечь отдельные элементы. (Если вы забыли, как это работает, вернитесь к разделу «Кортежи» в главе 4 и «Инструкции присваивания» в главе 11.) Такой прием позволяет имитировать выходные параметры, имеющиеся в других языках программирования, за счет использования явной операции присваивания. Переменные Х и С изменятся после вызова функции, но только потому, что мы явно это запрограммировали. Как только что было показано, в языке Ру[]топ аргументы всегда передаются через операцию присваивания — передаваемые объекты присваиваются именам, указанным в заголовке инструкции оет.

Характеристики

Тип файла
DJVU-файл
Размер
11,21 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6359
Авторов
на СтудИзбе
311
Средний доход
с одного платного файла
Обучение Подробнее