Главная страница
Навигация по странице:

  • Закрепление пройденного Контрольные вопросы

  • Упражнения к третьей части

  • Инструкция Примеры

  • • def – это исполняемый программный код

  • Математический анализ. 3е издание


    Скачать 4.86 Mb.
    Название3е издание
    АнкорМатематический анализ
    Дата04.02.2022
    Размер4.86 Mb.
    Формат файлаpdf
    Имя файлаpython_01.pdf
    ТипДокументы
    #351981
    страница46 из 98
    1   ...   42   43   44   45   46   47   48   49   ...   98

    Вместо циклов while и функции range старайтесь использовать про!
    стые циклы for. Еще одно напоминание: простые циклы for (напри
    мер, for x in seq) практически всегда проще и выполняются быст
    рее, чем счетные циклы while или основанные на использовании функции range. Так как в простых циклах for извлечение элементов последовательностей производится внутренними механизмами ин
    терпретатора, они выполняются, порой, в два раза быстрее, чем эк
    вивалентные циклы while. Избегайте искушения считать чтолибо в циклах на языке Python!

    Будьте внимательны, выполняя присваивание изменяемых объек!
    тов. Об этом уже говорилось в главе 11: следует быть особенно вни
    мательным при использовании изменяемых объектов в инструкци
    ях множественного присваивания (a = b = []), а также в расширен
    ных инструкциях присваивания (a += [1, 2]). В обоих случаях не
    посредственные изменения могут затронуть другие переменные.
    Более подробно об этом рассказывается в главе 11.

    Не ожидайте получения результатов от функций, выполняющих
    непосредственные изменения в объектах. Мы уже сталкивались с этим ранее: операции, выполняющие непосредственное изменение,
    такие как методы list.append и list.sort, представленные в главе 8,
    не имеют возвращаемых значений (отличных от None), поэтому их следует вызывать без присваивания возвращаемого значения. На
    чинающие программисты часто допускают ошибку, используя при
    мерно такой программный код: mylist = mylist.append(X), пытаясь получить результат метода append, но в действительности в этом

    В заключение
    379
    случае в переменную mylist записывается ссылка на объект None,
    а не на измененный список (фактически такая инструкция ведет к полной потере ссылки на список).
    Менее явный пример такой ошибки – когда выполняется попытка обойти элементы словаря в порядке сортировки. Очень часто можно увидеть, например, такой программный код: for k in D.keys().sort():.
    Он почти работает – метод keys создает список ключей, а метод sort упорядочивает его, но, так как метод sort возвращает объект None,
    цикл for терпит неудачу, потому что, в конечном счете, выполняется попытка обойти элементы объекта None (который не является после
    довательностью). Этот алгоритм можно реализовать либо с помощью новой встроенной функции sorted, которая возвращает отсортирован
    ный список, либо необходимо разделить вызовы методов на инструк
    ции: Ks = D.keys(), затем Ks.sort(), и наконец for k in Ks:. Это один из случаев, когда может потребоваться явный вызов метода keys для ор
    ганизации обхода элементов словаря в цикле вместо использования итераторов словарей, так как итераторы не выполняют сортировку.

    Всегда используйте круглые скобки при вызове функций. При вы
    зове функций после их имен всегда следует добавлять круглые скобки независимо от наличия входных аргументов (например, вы
    зов функции должен выглядеть как function(), а не function). В чет
    вертой части книги вы узнаете, что функции – это простые объек
    ты, которые могут выполнять специальную операцию – вызов –
    при обращении к имени с круглыми скобками.
    Похоже, что эта проблема наиболее часто возникает в классах при работе с файлами – нередко можно увидеть, как начинающие про
    граммисты пытаются оформить вызов метода как file.close, а не как file.close(). Поскольку обращение к имени метода без круг
    лых скобок в языке Python считается допустимым, такая попытка не приводит к появлению ошибки, но файл остается открытым!

    Не используйте расширения имен файлов в инструкциях import
    и reload. Не указывайте полные пути к файлам и расширения в ин
    струкциях import (например, следует писать import mod, а не import mod.py
    ). (Начальные сведения о модулях приводились в главе 3, и мы будем еще обсуждать их в пятой части книги.) Так как помимо .py
    имена файлов модулей могут иметь другие расширения (например,
    .pyc
    ), указание расширения не только является нарушением син
    таксиса, но и вообще не имеет смысла. Синтаксис определения пути зависит от типа платформы и определяется настройками параметра пути поиска модулей, а не инструкцией import.
    В заключение
    В этой главе мы рассмотрели вопросы документирования программ, ко
    торые касаются как документации, которую мы пишем для наших соб
    ственных программ, так и документации к встроенным инструментам.

    380
    Глава 14. Документация
    Мы познакомились со строками документирования, с ресурсами, со
    держащими справочные руководства по языку Python, и узнали, как с помощью функции help и вебинтерфейса PyDoc получить доступ к до
    полнительной документации. Так как это последняя глава в этой час
    ти книги, мы также рассмотрели наиболее часто встречающиеся ошибки, что должно помочь вам избежать их.
    В следующей части книги мы начнем применять полученные знания к более крупным программным конструкциям: к функциям. Однако,
    прежде чем двинуться дальше, проработайте упражнения к этой час
    ти, которые приводятся в конце главы. Но перед этим ответьте на кон
    трольные вопросы к главе.
    Закрепление пройденного
    Контрольные вопросы
    1. Когда вместо комментариев, начинающихся с символа решетки,
    следует использовать строки документирования?
    2. Назовите три способа извлечения строк документирования.
    3. Как получить перечень всех атрибутов объекта?
    4. Как можно получить перечень всех модулей, доступных на компь
    ютере?
    5. Какие книги о Python, после этой, следует приобрести?
    Ответы
    1. Строки документирования считаются более удобными для создания функционального описания, где поясняются принципы использова
    ния модулей, функций, классов и методов. Комментарии, начинаю
    щиеся с символа решетки, лучше подходят для пояснений к выра
    жениям и инструкциям. Такой порядок принят не только потому,
    что строки документирования проще отыскать в файле с исходными текстами, но и потому, что они могут извлекаться и просматривать
    ся с помощью системы PyDoc.
    2. Получить содержимое строк документирования можно с помощью атрибута __doc__ объекта, передав его функции help, или выбирая мо
    дули в поисковой системе PyDoc с графическим интерфейсом, в ре
    жиме клиент/сервер. Дополнительно PyDoc обладает возможно
    стью сохранять описание модулей в файлах HTML для последую
    щего просмотра.
    3. Список всех атрибутов, имеющихся у любого объекта, можно полу
    чить с помощью функции dir(X).
    4. Запустите графический интерфейс PyDoc, оставьте пустым поле ввода имени модуля и щелкните на кнопке «open browser» (открыть

    Закрепление пройденного
    381
    броузер). В результате будет открыта вебстраница, содержащая ссылки на описания всех модулей, доступных вашей программе.
    5. Мои, конечно. (А если серьезно, в предисловии имеется перечень некоторых книг, как справочных пособий, так и учебников, реко
    мендуемых для дальнейшего прочтения.)
    Упражнения к третьей части
    Теперь, когда вы узнали, как описывается логика работы программы,
    в следующих упражнениях вам будет предложено реализовать реше
    ние некоторых простых задач с использованием инструкций. Самым большим является упражнение 4, где вам будет предложено рассмот
    реть альтернативные варианты реализации. Одна и та же задача всегда может быть решена разными способами и отчасти изучение языка Py
    thon заключается в том, чтобы находить более оптимальные решения.
    Решения приводятся в приложении B, в разделе «Часть III, Инструк
    ции и синтаксис».
    1. Основы циклов.
    a. Напишите цикл for, который выводит ASCIIкоды всех символов в строке с именем S. Для преобразования символов в целочислен
    ные ASCIIкоды используйте встроенную функцию ord(character).
    (Поэкспериментируйте с ней в интерактивной оболочке, чтобы понять, как она работает.)
    b. Затем измените цикл так, чтобы он вычислял сумму кодов ASCII
    всех символов в строке.
    c. Наконец, измените свой программный код так, чтобы он возвра
    щал новый список, содержащий ASCIIкоды всех символов в стро
    ке. Дает ли выражение map(ord, S) похожий результат? (Подсказ
    ка: прочитайте четвертую часть.)
    2. Символы обратного слеша. Что произойдет, если в интерактивной оболочке ввести следующий программный код?
    for i in range(50):
    print 'hello %d\n\a' % i
    Будьте осторожны при запуске этого примера не в среде IDLE, он может сгенерировать звуковой сигнал, что может не понравиться окружающим. Среда разработки IDLE вместо этого выводит мало
    понятные символы (символы, экранированные обратным слешем,
    приводятся в табл. 7.2).
    3. Сортировка словарей. В главе 8 мы видели, что словари представ
    ляют собой неупорядоченные коллекции. Напишите цикл for, ко
    торый выводит элементы словаря в порядке возрастания. Подсказ
    ка: используйте метод keys словаря и метод списка sort или новую встроенную функцию sorted.

    382
    Глава 14. Документация
    4. Программирование альтернативной логики. Изучите следующий фрагмент, где для поиска числа 2 в пятой степени (32) в списке сте
    пеней числа 2, используются цикл while и флаг found. Этот фраг
    мент хранится в файле power.py.
    L = [1, 2, 4, 8, 16, 32, 64]
    X = 5
    found = i = 0
    while not found and i < len(L):
    if 2 ** X == L[i]:
    found = 1
    else:
    i = i+1
    if found:
    print 'at index', i else:
    print X, 'not found'
    C:\book\tests> python power.py
    at index 5
    В этом примере не используются обычные приемы программирова
    ния, принятые в языке Python. Следуя указаниям ниже, попробуй
    те улучшить его (вы можете вносить изменения в интерактивной оболочке или сохранять в файле сценария и запускать его из ко
    мандной строки системы – использование файла существенно упро
    стит это упражнение):
    a. Сначала добавьте в цикл while блок else, чтобы избавиться от флага found и последней инструкции if.
    b. Затем перепишите пример с циклом for и блоком else, чтобы из
    бавиться от логики вычисления индексов в списке. Подсказка:
    получить индекс элемента можно с помощью метода index (L.in
    dex(X)
    ), возвращающего смещение первого элемента со значени
    ем X в списке.
    c. Затем вообще избавьтесь от цикла, реализовав решение на осно
    ве оператора in проверки вхождения. (Подробности вы найдете в главе 8 или попробуйте ввести такое выражение: 2 in [1,2,3].)
    d. Наконец, вместо литерала списка L используйте цикл for и метод append для заполнения списка степеней двойки.
    Более глубокие улучшения:
    e. Как вы думаете, повысится ли производительность, если выраже
    ние 2 ** X вынести за пределы циклов? Как это можно сделать?
    f. Как мы видели в упражнении 1, Python включает в себя функ
    цию map(function, list), которая может создать список степеней числа 2: map(lambda x: 2 ** x, range(7)). Попробуйте выполнить этот программный код в интерактивной оболочке; с инструкци
    ей lambda мы познакомимся в главе 17.

    IV
    Функции

    15
    Основы функций
    В третьей части книги мы рассмотрели основные процедурные инст
    рукции языка Python. В этой части мы переходим к исследованию на
    бора дополнительных инструкций, которые используются при созда
    нии функций.
    Если говорить просто, то функция – это устройство, которое группи
    рует набор инструкций так, что в программе они могут запускаться неоднократно. Функции могут вычислять некоторый результат и по
    зволять указывать входные параметры, отличающиеся по своим зна
    чениям от вызова к вызову. Возможность оформления операций в виде функций – это очень удобный инструмент, который мы можем исполь
    зовать в самых разных ситуациях.
    С принципиальной точки зрения функции устраняют необходимость вставлять в программу избыточные копии блоков одного и того же программного кода, так как они могут быть заменены единственной функцией. Благодаря функциям можно существенно уменьшить тру
    дозатраты на программирование: если операцию необходимо будет ви
    доизменить, достаточно будет внести изменения всего в одном месте,
    а не во многих.
    Функции – это самые основные программные структуры в языке Py
    thon, обеспечивающие многократное использование программного кода и уменьшающие его избыточность. Как будет показано далее,
    функции – это еще и средство проектирования, которое позволяет раз
    бить сложную систему на достаточно простые и легко управляемые части. В табл. 15.1 приводятся основные инструменты, имеющие от
    ношение к функциям, которые мы будем изучать в этой части книги.

    386
    Глава 15. Основы функций
    Таблица 15.1. Инструкции и выражения, имеющие отношение к функциям
    Зачем нужны функции?
    Прежде чем перейти к обсуждению деталей, мы нарисуем себе четкую картину, что из себя представляют функции. Функции – это практиче
    ски универсальное средство структурирования программы. Возможно,
    раньше вам уже приходилось сталкиваться с ними в других языках программирования, где они могли называться подпрограммами или про+
    цедурами
    . В процессе разработки функции играют две основные роли:
    Максимизировать многократное использование программного кода
    и минимизировать его избыточность
    Как и в большинстве других языков программирования, функции в языке Python представляют собой простейший способ упаковки логики выполнения, которая может использоваться в разных мес
    тах программы и более чем один раз. До сих пор весь программный код, который нам приходилось писать, выполнялся немедленно.
    Функции позволяют группировать и обобщать программный код,
    который может позднее использоваться произвольное число раз.
    Так как функции позволяют поместить реализацию операции в од
    но место и использовать ее в разных местах, они являются самым основным инструментом структуризации: они дают возможность уменьшить избыточность программного кода и тем самым умень
    шить трудозатраты на его сопровождение.
    Процедурная декомпозиция
    Функции также обеспечивают возможность разбить сложную сис
    тему на части, каждая из которых играет вполне определенную роль. Например, чтобы испечь пиццу, сначала нужно замесить тес
    то, раскатать его, добавить начинку, испечь и т. д. Если бы мы пи
    сали программу для машины по выпечке пиццы, мы могли бы об
    щую задачу «испечь пиццу» разбить на мелкие части – по одной функции для каждого из этапов. Гораздо проще создать решение маленьких задач по отдельности, чем реализовать весь процесс це
    ликом. Вообще функции описывают «как делать», а не «зачем де
    лать». В шестой части книги мы увидим, почему это различие име
    ет такое большое значение.
    Инструкция
    Примеры
    Вызов myfunc("spam", "eggs", meat=ham)
    def, return, yield def adder(a, b=1, *c):
    return a+b+c[0]
    global def changer():
    global x; x = 'new'
    lambda
    Funcs = [lambda x: x**2, lambda x: x*3]

    Создание функций
    387
    В этой части книги мы исследуем понятия языка Python, используе
    мые при создании функций: основы функций, правила области види
    мости и передача аргументов, а также ряд сопутствующих концепций,
    таких как генераторы и функциональные инструменты. Мы также еще раз вернемся к понятию полиморфизма, введенному ранее в этой книге, поскольку на данном уровне его важность становится еще более очевидной. Как вы увидите, функции привносят не так много новых синтаксических конструкций, но они ведут нас к более существенным идеям программирования.
    Создание функций
    Несмотря на то, что функции еще не были представлены формально,
    тем не менее, мы уже использовали некоторые из них в предыдущих главах. Например, для создания объекта файла мы вызывали функ
    цию open; точно так же мы использовали встроенную функцию len, ко
    гда нам необходимо было узнать число элементов в объекте коллекции.
    В этой главе мы узнаем, как создаются новые функции в языке Py
    thon. Функции, которые мы пишем сами, ведут себя точно так же, как и встроенные функции, которые нам уже приходилось встречать: они могут вызываться в выражениях, получать значения и возвращать ре
    зультаты. Но для того чтобы создавать новые функции, необходимо ввести дополнительные понятия. Кроме того, в языке Python функции ведут себя иначе, чем в компилирующих языках программирования,
    таких как C. Ниже приводится краткое введение в основные концеп
    ции, составляющие основу функций в языке Python, каждую из кото
    рых мы будем изучать в этой части книги:
    • def это исполняемый программный код. Функции в языке Python создаются с помощью новой инструкции def. В отличие от функций в компилирующих языках программирования, таких как C, def отно
    сится к классу исполняемых инструкций – функция не существует,
    пока интерпретатор не доберется до инструкции def и не выполнит ее.
    Фактически, вполне допустимо (а иногда даже полезно) вкладывать инструкции def внутрь инструкций if, циклов while и даже в другие инструкции def. В случае наиболее типичного использования инст
    рукции def вставляются в файлы модулей и генерируют функции при выполнении во время первой операции импортирования.

    def
    создает объект и присваивает ему имя. Когда интерпретатор Py
    thon встречает и выполняет инструкцию def, он создает новый объ
    ектфункцию и связывает его с именем функции. Как и в любой другой операции присваивания, имя становится ссылкой на объ
    ектфункцию. В имени функции нет ничего необычного – как будет показано далее, объектфункция может быть связан с несколькими именами, сохраняться в списке и т. д. Кроме того, функции могут создаваться с помощью выражения lambda (более сложная концеп
    ция, которая будет рассматриваться в одной из последующих глав).

    388
    Глава 15. Основы функций

    return
    передает объект результата вызывающей программе. Когда функция вызывается, вызывающая программа приостанавливает свою работу, пока функция не завершит работу и не вернет управ
    ление. Функции, вычисляющие какоелибо значение, возвращают его с помощью инструкции return – возвращаемое значение стано
    вится результатом обращения к функции. Функции, известные как
    генераторы
    , для передачи возвращаемого значения могут также использовать инструкцию yield и сохранять свое состояние так,
    чтобы работа функции могла быть возобновлена позднее, – это еще одна из сложных тем, которые будут рассматриваться позже.
    1   ...   42   43   44   45   46   47   48   49   ...   98


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