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

  • В заключение

  • Управляющие структуры

  • Циклы В языке Python есть две инструкции циклов – while и for ... in, которые имеют более сложный синтаксис, чем было показано в главе 1.Циклы while

  • Циклы for Подобно циклу while, полный синтаксис цикла for ... in также включает необязательное предложение else: 192

  • Программирование на Python 3. Руководство издательство СимволПлюс


    Скачать 3.74 Mb.
    НазваниеРуководство издательство СимволПлюс
    Дата10.11.2022
    Размер3.74 Mb.
    Формат файлаpdf
    Имя файлаПрограммирование на Python 3.pdf
    ТипРуководство
    #780382
    страница23 из 74
    1   ...   19   20   21   22   23   24   25   26   ...   74
    str.
    format()
    , стр. 100

    184
    Глава 3. Типы коллекций ляет получить список строк с модальными значениями; строки затем объединяются в единую строку, где отделяются друг от друга запятой с пробелом (", "). Последняя инструкция print() в самом конце полу
    чилась очень простой благодаря использованию именованного корте
    жа. Он позволяет обращаться к статистическим значениям в объекте statistics
    , используя не числовые индексы, а их имена, а благодаря строкам в тройных кавычках мы смогли отформатировать выводимый текст наглядным способом.
    В этой функции имеется одна особенность, о которой следует упомя
    нуть отдельно. Строка с модальными значениями выводится с помо
    щью элемента строки формата {2}, за которым следует символ обрат
    ного слеша. Символ обратного слеша экранирует символ перевода строки, поэтому если строка с модальными значениями пустая, то пус
    тая строка выводиться не будет. Именно по этой причине мы вынужде
    ны были добавить символ \n в конец строки modeline, если она не пус
    тая.
    В заключение
    В этой главе мы рассмотрели все встроенные типы коллекций в языке
    Python, а также пару типов коллекций из стандартной библиотеки.
    Мы рассмотрели коллекциипоследовательности, tuple, collections.na
    medtuple и list, поддерживающие, как и строки, возможность извлече
    ния срезов. Также было рассмотрено использование оператора распа
    ковывания последовательностей (*) и коротко было упомянуто исполь
    зование аргументов со звездочками в вызовах функций. Мы также рассмотрели типы множеств set и frozenset и типы отображений dict и collections.defaultdict.
    Мы узнали, как использовать именованные кортежи из стандартной библиотеки языка Python для создания своих собственных типов кор
    тежей, доступ к элементам которых выполняется не только с помощью числовых индексов, но и более удобным способом – с помощью имен.
    Мы также увидели, как создавать «константы», используя для этого переменные, идентификаторы которых состоят исключительно из символов верхнего регистра.
    При изучении списков мы увидели, что все, что применимо к корте
    жам, в равной степени применимо и к спискам. А благодаря тому, что списки относятся к категории изменяемых объектов, они обладают го
    раздо более широкими функциональными возможностями, чем корте
    жи. В число этих возможностей входят методы, изменяющие содер
    жимое списка (например, list.pop()), а поддержка операций со среза
    ми обеспечивает возможность вставки, замены и удаления срезов.
    Списки идеально подходят для хранения последовательностей элемен
    тов, особенно, когда необходим быстрый доступ к элементам по их ин
    дексам.

    В заключение
    185
    При обсуждении типов set и frozenset мы отметили, что они могут со
    держать только элементы хешируемых типов данных. Множества обес
    печивают быструю работу оператора проверки на вхождение и удобны для фильтрации повторяющихся данных.
    Словари отчасти напоминают множества, например, ключами слова
    рей могут быть только уникальные значения хешируемых типов дан
    ных, как и элементы множеств. Но, в отличие от множеств, словари хранят пары ключзначение, в которых значениями могут быть дан
    ные любых типов. При изучении словарей были охвачены методы dict.get()
    и dict.setdefault(), а при описании словарей со значениями по умолчанию были продемонстрированы альтернативы этим мето
    дам. Подобно множествам, словари предоставляют очень эффектив
    ный оператор проверки на вхождение и обеспечивают быстрый доступ к элементам по ключу.
    Списки, множества, словари – все они имеют собственные реализации генераторов, которые могут использоваться для создания коллекций этих типов из итерируемых объектов (которые в свою очередь также могут быть генераторами), с наложением дополнительных условий,
    если это необходимо. Функции range() и zip() часто используются для создания коллекций; обе эти функции удобно использовать в циклах for ... in и в генераторах.
    Элементы изменяемых коллекций могут удаляться с помощью соот
    ветствующих методов, таких как list.pop() и set.discard(), или с по
    мощью инструкции del – например, инструкция del d[k] удалит из словаря d элемент с ключом k.
    В языке Python используются ссылки на объекты, что делает опера
    цию присваивания чрезвычайно эффективной, но это также означает,
    что при использовании оператора присваивания (=) сами объекты не копируются. Мы рассмотрели различия между поверхностным и глу
    боким копированием, а позднее увидели, как с помощью операции из
    влечения среза L[:] можно создать поверхностную копию всего спи
    ска, а с помощью метода dict.copy() создать поверхностную копию словаря. Любой объект, допускающий возможность копирования, мо
    жет быть скопирован с помощью функций из модуля copy, например,
    функция copy.copy() выполняет поверхностное копирование, а функ
    ция copy.deepcopy() выполняет глубокое копирование.
    Мы познакомились с высокооптимизированной встроенной функцией sorted()
    . Эта функция широко используется при программировании на языке Python. В языке Python отсутствуют типы упорядоченных коллекций, поэтому, когда необходимо выполнить итерации через коллекции в определенном порядке, это можно реализовать с помо
    щью функции sorted().
    Встроенных типов коллекций – кортежей, списков, множеств, фикси
    рованных множеств и словарей – вполне достаточно для решения лю

    186
    Глава 3. Типы коллекций бого круга задач. Тем не менее в стандартной библиотеке имеется не
    сколько дополнительных типов коллекций и значительное количество типов, созданных сторонними разработчиками.
    Часто возникает необходимость читать коллекции данных из файлов или записывать содержимое коллекций в файлы. В этой главе, в ходе очень краткого рассмотрения принципов работы с текстовыми файла
    ми, основное наше внимание мы уделили чтению и записи текстовых строк. Полное описание работы с файлами приводится в главе 7, а до
    полнительные средства сохранения данных – в главе 11.
    В следующей главе мы поближе познакомимся с управляющими кон
    струкциями языка Python, среди которых будет представлена одна конструкция, с которой мы еще не сталкивались. Кроме того, мы бо
    лее подробно изучим тему обработки исключений и некоторые допол
    нительные инструкции, такие как assert, с которыми мы еще не зна
    комы. Помимо этого, мы рассмотрим порядок создания собственных функций и в частности изучим чрезвычайно гибкий механизм работы с аргументами, используемый в языке Python.
    Упражнения
    1. Модифицируйте программу external_sites.py и задействуйте в ней словарь со значениями по умолчанию. Это легко сделать, добавив одну дополнительную инструкцию import и изменив всего две стро
    ки. Решение приводится в файле external_sites_ans.py.
    2. Модифицируйте программу uniquewords2.py так, чтобы она выво
    дила слова не в алфавитном порядке, а по частоте встречаемости.
    Вам потребуется обойти элементы словаря и создать маленькую функцию из двух строк, которая будет извлекать значение каждого элемента, и передать ее в виде аргумента key функции sorted(). Кро
    ме того, потребуется соответствующим образом изменить инструк
    цию print(). Это несложно, но тут есть некоторый подвох. Решение приводится в файле uniquewords_ans.py.
    3. Модифицируйте программу generate_usernames.py так, чтобы в ка
    ждой строке она выводила информацию о двух пользователях, ог
    раничив длину имени 17 символами; через каждые 64 строки про
    грамма должна выводить символ перевода формата и в начале каж
    дой страницы она должна выводить заголовки столбцов. Ниже при
    водится пример того, как должен выглядеть вывод программы:
    Name ID Username Name ID Username
         
    Aitkin, Shatha... (2370) saitkin Alderson, Nicole. (8429) nalderso
    Allison, Karma... (8621) kallison Alwood, Kole E... (2095) kealwood
    Annie, Neervana.. (2633) nannie Apperson, Lucyann (7282) leappers

    Упражнения
    187
    Это достаточно сложно. Вам потребуется сохранить заголовки столбцов в переменных, чтобы потом их можно было использовать по мере необходимости, и изменить спецификаторы формата, что
    бы обеспечить вывод более коротких имен. Один из способов обеспе
    чить постраничный вывод заключается в том, чтобы сохранить все выводимые строки в списке, а затем выполнить обход списка, ис
    пользуя оператор извлечения среза с шагом для получения элемен
    тов слева и справа и применяя функцию zip() для их объединения.
    Решение приводится в файле generate_usernames_ans.py, а доста
    точно большой объем исходных данных вы найдете в файле data/
    users2.txt

    4
    Управляющие структуры и функции
    В первых двух разделах этой главы будут рассматриваться управляю
    щие структуры языка Python, причем в первом разделе будут рас
    сматриваться условные инструкции и циклы, а во втором – инструк
    ции обработки исключительных ситуаций. Большая часть управляю
    щих структур и основы обработки исключений уже рассматривались в главе 1, но в этой главе они будут изучены более полно, включая до
    полнительный синтаксис управляющих структур, а также порядок возбуждения исключительных ситуаций и создание собственных ис
    ключений.
    Третий и самый большой раздел посвящен созданию собственных функций, и здесь будет подробно рассматриваться чрезвычайно гиб
    кий механизм работы с аргументами функций. Собственные функции позволяют нам упаковывать параметризуемую функциональность и уменьшать объем программного кода за счет оформления повторяю
    щихся фрагментов в виде функций многократного использования.
    (В следующей главе мы узнаем, как создавать собственные модули,
    чтобы одни и те же функции можно было использовать в разных про
    граммах.)
    Управляющие структуры
    В языке Python условное ветвление реализуется с помощью инструк
    ции if, а циклическая обработка – с помощью инструкций while и for
    ... in
    . В языке Python имеется также такая конструкция, как услов
    ное выражение
    – вариант инструкции if, аналог трехместного опера
    тора (?:), имеющегося в Cподобных языках.

    Управляющие структуры

    Обработка исключений

    Собственные функции

    Управляющие структуры
    189
    Условное ветвление
    Как мы видели в главе 1, общий синтаксис инструкции условного ветвления в языке Python имеет следующий вид:
    if boolean_expression1:
    suite1
    elif boolean_expression2:
    suite2
    elif boolean_expressionN:
    suiteN
    else:
    else_suite
    Инструкция может содержать ноль или более предложений elif. За
    ключительное предложение else также является необязательным. Ес
    ли необходимо предусмотреть ветку для какогото особого случая, ко
    торый не требует никакой обработки, в качестве блока кода этой ветки можно использовать инструкцию pass (она ничего не делает и просто является инструкциейзаполнителем, используемой там, где должна находиться хотя бы одна инструкция).
    В некоторых случаях можно сократить инструкцию if ... else до единственного условного выражения. Ниже приводится синтаксис ус
    ловных выражений:
    expression1 if boolean_expression else expression2
    Если логическое выражение boolean_expression возвращает значение
    True
    , результатом всего условного выражения будет результат выраже
    ния expression1, в противном случае – результат выражения expression2.
    В практике программирования часто применяется такой прием, когда в переменную сначала записывается значение по умолчанию, а затем в случае необходимости оно изменяется, например, по требованию пользователя или в результате выяснения типа платформы, на кото
    рой выполняется программа. Ниже приводится типичная реализация такого приема с использованием инструкции if:
    offset = 20
    if not sys.platform.startswith("win"):
    offset = 10
    Переменная sys.platform хранит название текущей платформы, напри
    мер, «win32» или «linux2». Тот же результат можно получить с помо
    щью условного выражения:
    offset = 20 if sys.platform.startswith("win") else 10
    В данном случае нет необходимости использовать круглые скобки, но их использование поможет избежать малозаметных ловушек. Напри
    мер, предположим, что нам необходимо записать в переменную width

    190
    Глава 4. Управляющие структуры и функции значение 100 и прибавить к нему 10, если переменная margin имеет значение True. Мы могли бы написать такое выражение:
    width = 100 + 10 if margin else 0 # ОШИБКА!
    Особенно неприятно, что эта строка программного кода работа
    ет правильно, когда переменная margin имеет значение True, за
    писывая значение 110 в переменную width. Но когда перемен
    ная margin имеет значение False, в переменную width вместо 100
    будет записано значение 0. Это происходит потому, что интер
    претатор Python воспринимает выражение 100 + 10 как часть
    expression1
    условного выражения. Решить эту проблему можно с помощью круглых скобок:
    width = 100 + (10 if margin else 0)
    Кроме того, круглые скобки делают программный код более понятным для человека.
    Условные выражения могут использоваться для видоизменения сооб
    щений, выводимых для пользователя. Например, при выводе числа об
    работанных файлов, вместо того чтобы печатать «0 file(s)», «1 file(s)»
    1
    или чтото подобное, можно было бы использовать пару условных вы
    ражений:
    print("{0} file{1}".format((count if count != 0 else "no"),
    ("s" if count != 1 else "")))
    Эта инструкция будет выводить «no files», «1 file», «2 files» и т. д., что придаст программе более профессиональный вид.
    Циклы
    В языке Python есть две инструкции циклов – while и for ... in, кото
    рые имеют более сложный синтаксис, чем было показано в главе 1.
    Циклы while
    Ниже приводится полный синтаксис цикла while:
    while boolean_expression:
    while_suite
    else:
    else_suite
    Предложение else является необязательным. До тех пор, пока выра
    жение boolean_expression возвращает значение True, в цикле будет вы
    полняться блок while_suite. Если выражение boolean_expression вернет
    1
    Имеется в виду склонение по числам, то есть вместо «1 файл(ов)», «5 фай
    л(ов)» можно выводить более правильно: «1 файл», «5 файлов». Но в отли
    чие от английского языка реализация правильного склонения по числам в русском языке не уместится в два условных выражения. – Прим. перев.

    Управляющие структуры
    191
    значение False, цикл завершится, и при наличии предложения else будет выполнен блок else_suite. Если внутри блока while_suite выпол
    няется инструкция continue, то управление немедленно передается в начало цикла и выражение boolean_expression вычисляется снова.
    Если цикл не завершается нормально, блок предложения else не вы
    полняется.
    Необязательное предложение else имеет несколько сбивающее с толку название, поскольку оно выполняется во всех в случаях, когда цикл нормально завершается. Если цикл завершается в результате выпол
    нения инструкции break или return, когда цикл находится внутри функции или метода, или в результате исключения, то блок else_suite
    предложения else не выполняется. (При возникновении исключитель
    ной ситуации интерпретатор Python пропускает предложение else и пытается отыскать подходящий обработчик исключения, о чем будет рассказываться в следующем разделе.) Плюсом такой реализации яв
    ляется одинаковое поведение предложения else в циклах while, в цик
    лах for ... in и в блоках try ... except.
    Рассмотрим пример, демонстрирующий предложение else в действии.
    Методы str.index() и list.index() возвращают индекс заданной под
    строки или элемента или возбуждают исключение ValueError, если подстрока или элемент не найдены. Метод str.find() делает то же са
    мое, но в случае неудачи он не возбуждает исключение, а возвращает значение –1. Для списков не существует эквивалентного метода, но при желании мы могли бы создать такую функцию, использующую цикл while:
    def list_find(lst, target):
    index = 0
    while index < len(lst):
    if lst[index] == target:
    break index += 1
    else:
    index = 1
    return index
    Эта функция просматривает список в поисках заданного элемента tar
    get
    . Если искомый элемент будет найден, инструкция break завершит цикл и вызывающей программе будет возвращен соответствующий индекс. Если искомый элемент не будет найден, цикл достигнет конца списка и завершится обычным способом. В случае нормального завер
    шения цикла будет выполнен блок в предложении else, индекс полу
    чит значение –1 и будет возвращен вызывающей программе.
    Циклы for
    Подобно циклу while, полный синтаксис цикла for ... in также вклю
    чает необязательное предложение else:

    192
    Глава 4. Управляющие структуры и функции for expression in iterable:
    for_suite
    else:
    else_suite
    В качестве выражения expression обычно используется либо единствен
    ная переменная, либо последовательность переменных, как правило,
    в форме кортежа. Если в качестве выражения expression используется кортеж или список, каждый элемент итерируемого объекта iterable
    распаковывается в элементы expression.
    Если внутри блока for_suite встретится инструкция continue, управле
    ние будет немедленно передано в начало цикла и будет начата новая ите
    рация. Если цикл завершается по выполнении всех итераций и в цик
    ле присутствует предложение else, выполняется блок else_suite. Если выполнение цикла прерывается принудительно (инструкцией break или return), управление немедленно передается первой инструкции,
    следующей за циклом, а дополнительное предложение else при этом пропускается. Точно так же, когда возбуждается исключение, интер
    претатор Python пропускает предложение else и пытается отыскать подходящий обработчик исключения (о чем будет рассказываться в следующем разделе).
    Ниже приводится версия функции list_find(), реализо
    ванная на базе цикла for ... in, которая так же, как и версия на базе цикла while, демонстрирует предложе
    ние else в действии:
    def list_find(lst, target):
    for index, x in enumerate(lst):
    if x == target:
    break else:
    index = 1
    return index
    Как видно из этого фрагмента, переменные, созданные в выражении
    expression
    цикла for ... in, продолжают существовать после заверше
    ния цикла. Как и любые локальные переменные, они прекращают свое существование после выхода из области видимости, включающей их.
    1   ...   19   20   21   22   23   24   25   26   ...   74


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