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

  • Пример

  • 18.4. Lambda-формы 138 A Byte of Python (Russian), Версия 2.02Пример

  • 18.6. Передача кортежей и словарей в функции

  • 18.9. Функция repr 141 A Byte of Python (Russian), Версия 2.02"Это первое предложение.\

  • Замечание для пользователей регулярных выражений

  • 18.11. Необрабатываемые строки 142 Что дальше

  • 19.4. Советы и рекомендации

  • 19.9. Установка библиотек

  • Книга на вашем родном языке 6 2 Переводы 7 1 Доступные переводы переводы 7 3 Предисловие 16


    Скачать 0.72 Mb.
    НазваниеКнига на вашем родном языке 6 2 Переводы 7 1 Доступные переводы переводы 7 3 Предисловие 16
    Дата16.04.2023
    Размер0.72 Mb.
    Формат файлаpdf
    Имя файлаAByteofPythonRussian-2.02.pdf
    ТипКнига
    #1065836
    страница13 из 14
    1   ...   6   7   8   9   10   11   12   13   14
    17.3. Серия «Модуль недели»
    135

    Дополнительно
    К настоящему моменту мы уже рассмотрели большую часть того, что вам придётся ис- пользовать при работе с Python. В этой главе мы охватим некоторые дополнительные аспекты, которые помогут отшлифовать ваши знания.
    18.1 Передача кортежей
    Хотелось ли вам когда-нибудь, чтобы функция возвращала не один результат, а два? Это возможно. Всё, что для этого нужно, – использовать кортеж.
    >>>
    def
    get_error_details
    ():
    ...
    return
    (
    2
    ,
    'описание ошибки No2'
    )
    ...
    >>>
    errnum, errstr
    =
    get_error_details()
    >>>
    errnum
    2
    >>>
    errstr
    'описание ошибки No2'
    Обратите внимание, что использование выражения «
    a, b = <некоторое выражение>
    »
    интерпретирует результат как кортеж из двух значений.
    Чтобы интерпретировать результат как «
    (a, <всё остальное>)
    », нужно просто поста- вить звёздочку, как это делалось для параметров функций:
    >>>
    a,
    *
    b
    =
    [
    1
    ,
    2
    ,
    3
    ,
    4
    ]
    >>>
    a
    1
    >>>
    b
    [2, 3, 4]
    Это также подразумевает, что поменять местами два значения в Python быстрее всего можно так:
    136

    A Byte of Python (Russian), Версия 2.02
    >>>
    a
    =
    5
    ; b
    =
    8
    >>>
    a, b
    =
    b, a
    >>>
    a, b
    (8, 5)
    18.2 Специальные методы
    Есть ряд методов, играющих особую роль для классов. Например,
    __init__
    и
    __del__
    Специальные методы служат для того, чтобы имитировать поведение встроенных типов данных. Например, всё, что потребуется для использования операции индексирования x[индекс]
    применительно к своему классу (в таком виде, как это делалось для списков и кортежей), это реализовать метод
    __getitem__()
    . Кстати, именно этот метод Python использует для самого класса list
    !
    Некоторые полезные специальные методы перечислены в таблице ниже. Все другие ме- тоды можно посмотреть в документации
    Имя
    Описание
    __init__(self, …)
    Этот метод вызывается прямо перед тем, как вновь созданный объект возвращается для использования.
    __del__(self)
    Вызывается перед уничтожением объекта
    __str__(self)
    Вызывается при использовании функции print или str()
    __lt__(self, other)
    Вызывается, когда используется оператор «меньше» (<).
    Существуют и аналогичные методы для всех операторов (+, >,
    и т.д.)
    __getitem__(self, key) Вызывается при использовании оператора индексирования x[индекс]
    __len__(self)
    Вызывается при обращении к встроенной функции len()
    для объекта-последовательности.
    18.3 Блоки в одно выражение
    Мы неоднократно говорили, что каждый блок команд отделяется от других своим соб- ственным уровнем отступа. Однако, существует и исключение. Если блок команд содер- жит только одно выражение, его можно указывать в одной строке с условным оператором или, скажем, оператором цикла. Рассмотрим это на примере:
    >>>
    flag
    =
    True
    >>>
    if
    flag:
    print
    (
    'Да'
    )
    Да
    18.2. Специальные методы
    137

    A Byte of Python (Russian), Версия 2.02
    Обратите внимание, что единственный оператор расположен в той же строке, а не отдель- ным блоком. Этот способ может подкупить тем, что якобы «сокращает» программу, но я настоятельно рекомендую избегать его во всех случаях, кроме проверки ошибок. Прежде всего, потому что гораздо легче добавлять команды, когда уже есть необходимый уровень отступа.
    18.4 Lambda-формы
    Ключевое слово lambda используется для создания функций и возврата их значения во время выполнения программы.
    lambda принимает параметр, за которым следует одно выражение, которое становится телом функции, а значение этого выражения возвраща- ется новой функцией.
    Пример: (сохраните как lambda.py
    )
    points
    =
    [ {
    'x'
    :
    2
    ,
    'y'
    :
    3
    }, {
    'x'
    :
    4
    ,
    'y'
    :
    1
    } ]
    points sort(key
    =
    lambda
    i : i[
    'y'
    ])
    print
    (points)
    Вывод:
    $ python3 lambda.py
    [{'x': 4, 'y': 1}, {'x': 2, 'y': 3}]
    Как это работает:
    Обратите внимание на то, что метод sort класса list может принимать пара- метр key
    , определяющий способ сортировки списка (обычно мы думаем толь- ко о сортировке по возрастанию или по убыванию). В данном случае мы хотим провести сортировку по собственному принципу, для чего нам необходимо написать соответствующую функцию. Но вместо того, чтобы создавать отдель- ный блок def для описания функции, которая будет использоваться только в этом месте, мы применяем лямбда-выражение.
    18.5 Генераторы списков
    Генераторы списков служат для создания новых списков на основе существующих. Пред- ставьте, что имеется список чисел, на основе которого требуется получить новый список,
    состоящий из всех чисел, умноженных на 2, но только при условии, что само число боль- ше 2. Генераторы списков подходят для таких задач как нельзя лучше.
    18.4. Lambda-формы
    138

    A Byte of Python (Russian), Версия 2.02
    Пример: (сохраните как list_comprehension.py
    )
    listone
    =
    [
    2
    ,
    3
    ,
    4
    ]
    listtwo
    =
    [
    2
    *
    i
    for
    i
    in
    listone
    if
    i
    >
    2
    ]
    print
    (listtwo)
    Вывод:
    $ python3 list_comprehension.py
    [6, 8]
    Как это работает:
    В этом примере мы создаём новый список, указав операцию, которую необхо- димо произвести (
    2 * i
    ), когда выполняется некоторое условие (
    if i > 2
    ).
    Обратите внимание, что исходный список при этом не изменяется.
    Преимущество использования генераторов списков состоит в том, что это заметно сокра- щает объёмы стандартного кода, необходимого для циклической обработки каждого эле- мента списка и сохранения его в новом списке.
    18.6 Передача кортежей и словарей в функции
    Для получения параметров, переданных функции, в виде кортежа или словаря, существу- ют специальные приставки «
    *
    » или «
    **
    » соответственно. Это особенно полезно в случа- ях, когда функция может принимать переменное число параметров.
    >>>
    def
    powersum
    (power,
    *
    args):
    ...
    '''Возвращает сумму аргументов, возведённых в указанную степень.'''
    ...
    total
    =
    0
    ...
    for
    i
    in
    args:
    ...
    total
    +=
    pow
    (i, power)
    ...
    return
    total
    ...
    >>>
    powersum(
    2
    ,
    3
    ,
    4
    )
    25
    >>>
    powersum(
    2
    ,
    10
    )
    100
    Поскольку перед переменной args указана приставка «
    *
    », все дополнительные аргу- менты, переданные функции, сохранятся в args в виде кортежа. В случае использова- ния приставки «
    **
    » все дополнительные параметры будут рассматриваться как пары ключ/значение в словаре.
    18.6. Передача кортежей и словарей в функции
    139

    A Byte of Python (Russian), Версия 2.02 18.7 exec и eval
    Функция exec служит для выполнения команд Python, содержащихся в строке или фай- ле, в отличие от самого текста программы. Например, во время выполнения программы можно сформировать строку, содержащую текст программы на Python, и запустить его при помощи exec
    :
    >>>
    exec(
    'print("Здравствуй, Мир!")'
    )
    Здравствуй, Мир!
    Аналогично, функция eval позволяет вычислять корректные выражения Python, содер- жащиеся в строке. Вот простой пример.
    >>>
    eval
    (
    '2*3'
    )
    6 18.8 Оператор assert
    Оператор assert существует для того, чтобы указать, что нечто является истиной. На- пример, если требуется гарантировать, что в списке будет хотя бы один элемент, и вы- звать ошибку, если это не так, то оператор assert идеально подойдёт для такой задачи.
    Когда заявленное выражение ложно, вызывается ошибка
    AssertionError
    . Метод pop()
    возвращает последний элемент списка, одновременно удаляя его оттуда.
    >>>
    mylist
    =
    [
    'item'
    ]
    >>>
    assert len
    (mylist)
    >=
    1
    >>>
    mylist pop()
    'item'
    >>>
    mylist
    []
    >>>
    assert len
    (mylist)
    >=
    1
    Traceback (most recent call last):
    File
    ""
    , line
    1
    , in
    AssertionError
    Тем не менее, оператор assert следует использовать благоразумно. В большинстве слу- чаев гораздо лучше «отлавливать» исключения и либо решать соответствующую про- блему автоматически, либо выдавать пользователю сообщение об ошибке и завершать работу программы.
    18.7. exec и eval
    140

    A Byte of Python (Russian), Версия 2.02 18.9 Функция repr
    Функция repr используется для получения канонического строкового представления объекта. Любопытно, что в большинстве случаев eval(repr(object)) == object
    >>>
    i
    =
    []
    >>>
    i append(
    'item'
    )
    >>>
    repr
    (i)
    "['item']"
    >>>
    eval
    (
    repr
    (i))
    ['item']
    >>>
    eval
    (
    repr
    (i))
    ==
    i
    True
    По большому счёту, функция repr служит для получения печатаемого представления объекта. Определив метод
    __repr__
    в собственном классе, можно указать, что он будет возвращать по вызову функции repr
    18.10 Управляющие последовательности
    Попробуйте ответить на вопрос: Как указать строку, содержащую одинарную кавычку (
    '
    )?
    Например, строку «
    What's your name?
    ». Её ведь нельзя записать просто как «
    'What's your name?'
    », потому что тогда Python не сможет определить, где начало строки, и где конец. В таком случае придётся каким-то образом указать, что данная одинарная кавычка не обозначает конца строки. Это можно сделать при помощи так называемой управляю-
    щей последовательности. Укажите одинарную кавычку как
    \'
    – через обратную косую черту. Теперь наша строка будет выглядеть так:
    'What\'s your name?'
    Другой способ записи такой специфической строки –
    "What's your name?"
    , т.е. с ис- пользованием двойных кавычек. Аналогично следует использовать управляющую после- довательность для вставки двойной кавычки в строку, ограниченную двойными кавычка- ми. Сама же обратная наклонная черта указывается управляющей последовательностью
    \\
    А как записать двустрочную строку? Один из вариантов нам уже знаком – заключить строку в тройные кавычки, как было показано
    ранее
    . Но есть и другой – использовать управляющую последовательность для символа перевода строки
    \n
    . Например: «
    Это первая строка\nЭто вторая строка
    ». Полезно знать ещё одну управляющую после- довательность – табуляцию (
    \t
    ). Управляющих последовательностей существует намного больше, но здесь упомянуты только наиболее важные.
    Следует отметить, что одинарная наклонная черта в конце строки лишь указывает на то,
    что продолжение идёт строкой ниже, но не вставляет перевода строки. Например:
    18.9. Функция repr
    141

    A Byte of Python (Russian), Версия 2.02
    "Это первое предложение.
    \
    Это второе предложение."
    эквивалентно записи "Это первое предложение. Это второе предложение."
    18.11 Необрабатываемые строки
    Для записи строки, в которой не будет проводиться никакой специальной обработки, как,
    например, управляющих последовательностей, перед строкой указывается приставка «
    r
    »
    или «
    R
    »
    1
    . Например,
    r"Перевод строки обозначается \n"
    Замечание для пользователей регулярных выражений
    Для работы с регулярными выражениями всегда используйте необрабатываемые строки.
    В противном случае вас ждёт много возни с обратными косыми чёрточками. Например,
    обратные ссылки можно обозначать как '\\1'
    или r'\1'
    18.12 Резюме
    Итак, в настоящей главе мы рассмотрели некоторые дополнительные возможности
    Python, хотя по-прежнему, не охватили всего. Тем не менее, к настоящему моменту мы уже прошли почти всё, что вам когда-либо понадобится использовать на практике. Этого вполне достаточно для начала работы над любыми программами.
    Далее мы обсудим, как продолжать исследовать Python.
    1
    «r» – от англ. «raw» – «сырой, необработанный» (прим. перев.)
    18.11. Необрабатываемые строки
    142

    Что дальше
    Добросовестный читатель, дочитавший книгу до сих пор, а также много практиковав- шийся в написании программ, наверняка уже освоился с Python. И конечно, вы уже по- пробовали реализовать какие-нибудь собственные идеи на Python, чтобы потренировать- ся. Нет? Тогда стоит начать! Но в таком случае возникает вопрос: «Что же делать дальше?».
    Я предлагаю вам справиться со следующей задачей.
    Задача
    Создайте собственную программу «Адресная книга», работающую из командной стро- ки и позволяющую просматривать, добавлять, изменять, удалять или искать контактные данные ваших знакомых. Кроме того, эта информация также должна сохраняться на дис- ке для последующего доступа.
    Это достаточно простая задача, если думать о ней в терминах, которые мы до сих пор проходили. Если же вы всё-таки нуждаетесь в подсказке, как действовать, вот она.
    Подсказка (не читать!)
    Создайте класс для хранения персональных данных. Объекты визитных карточек храни- те в словаре, в котором имена контактов будут служить ключами. Для длительного хра- нения этих объектов на жёстком диске воспользуйтесь модулем pickle. Для добавления,
    изменения или удаления контактов применяйте встроенные методы словаря.
    Как только вы справитесь с этим, вы смело можете называться программистом на Python.
    А теперь немедленно напишите мне письмо
    ;-). Это не обязательный шаг, но весьма ре- комендуемый. Также подумайте о покупке бумажной версии книги
    , чтобы поддержать её дальнейшую разработку.
    Если эта задачка показалась вам слишком лёгкой, попробуйте ещё одну:
    143

    A Byte of Python (Russian), Версия 2.02
    Задача
    Реализуйте команду replace
    . Эта команда заменяет одну строку другой в списке передан- ных ей файлов.
    Команда replace может быть любой желаемой сложности: от простой замены строк до поиска по шаблону (регулярному выражению).
    А вот ещё некоторые возможные направления вашего дальнейшего путешествия по миру
    Python:
    19.1 Упражнения
    На Stack Overflow есть неплохое обсуждение упражнений на Python, помогающих отто- чить ваше мастерство
    19.2 Примеры программ
    Лучший способ овладеть языком программирования – это писать много программ и чи- тать много программ:

    Проект PLEAC

    Хранилище кода Rosetta

    Примеры для Python на java2s

    Книга рецептов Python
    – ценнейшая коллекция рецептов и подсказок, как решать те или иные проблемы при помощи Python. Обязательна к прочтению каждым про- граммистом на Python.

    Модуль недели
    – ещё один замечательный путеводитель по
    стандартной библио-
    теке Python
    19.3 Вопросы и ответы

    Официальные «Можно и нельзя» в Python

    Официальные ЧаВо Python

    Список НеЧасто задаваемых Вопросов от Norvig

    Вопросы и ответы из интервью о Python
    19.1. Упражнения
    144

    A Byte of Python (Russian), Версия 2.02

    Вопросы на StackOverflow с пометкой «python»
    19.4 Советы и рекомендации

    Трюки и уловки Python

    Сколачиваем программы при помощи Python

    Очаровательный Python
    – замечательная серия статей о Python Дэвида Мерца.
    19.5 Учебники

    Всеобъемлющий список учебников по Python от Awaretek
    19.6 Видео

    PyVideo
    19.7 Обсуждение
    Если вы застряли на какой-то проблеме в Python и не знаете, кого спросить, тогда список рассылки python-tutor подойдёт наилучшим образом.
    Тем не менее, сначала проделайте всю домашнюю работу и попытайтесь решить пробле- му самостоятельно.
    19.8 Новости
    Если вас интересуют последние новости мира Python, отслеживайте их на официальной планете Python
    19.4. Советы и рекомендации
    145

    A Byte of Python (Russian), Версия 2.02 19.9 Установка библиотек
    В
    Каталоге пакетов Python существует колоссальное количество открытых библиотек, ко- торые вы можете использовать в своих программах. Для их установки можно воспользо- ваться pip
    19.10 Графические программы
    Для создания собственной графической программы на Python понадобится какая-нибудь библиотека ГИП (графического интерфейса пользователя) со своими привязками к
    Python. Привязки позволяют писать программу на Python, используя библиотеки, кото- рые сами по себе написаны на C, C++ или других языках.
    Выбор ГИП для Python достаточно обширен:
    Kivy
    http://kivy.org
    PyGTK
    Это привязки Python к инструментарию GTK+, на основе которого построен
    GNOME. У GTK+ есть много своих особенностей, но как только вы освоитесь, вы сможете создавать ГИП очень быстро. Что касается дизайнера графического интер- фейса Glade, то он просто незаменим. Документация же всё ещё требует некоторых улучшений. GTK+ хорошо работает в GNU/Linux, но его порт на Windows пока не закончен. При помощи GTK+ можно создавать как свободные, так и проприетарные программы. Для начала прочитайте
    Учебник по PyGTK
    PyQt
    Это привязки Python к инструментарию Qt, на основе которого построена KDE. Qt чрезвычайно прост в использовании, особенно благодаря Qt Designer и изумитель- ной документации Qt. PyQt бесплатно, если используется для создания свободных программ (с лицензией GPL). Для создания закрытых проприетарных программ вам придётся его купить. Начиная с Qt 4.5, разрешается создавать при помощи него не только GPL’ные программы. Для начала прочитайте краткое пособие по PyQt или
    Книгу PyQt
    wxPython
    Это привязки Python к инструментарию wxWidgets. wxPython не так прост в освое- нии, но зато он переносим и работает на GNU/Linux, Windows, Mac и даже на встраи- ваемых платформах. Многие среды разработки для wxPython, такие как
    SPE (Stani’s
    Python Editor)
    и wxGlade включают дизайнеры графического интерфейса. При по- мощи wxPython можно создавать как свободные, так и проприетарные программы.
    Для начала прочитайте учебник по wxPython
    19.9. Установка библиотек
    146

    A Byte of Python (Russian), Версия 2.02 19.11 Резюме по инструментам ГИП
    Другие варианты можно найти на wiki-странице GuiProgramming официального сайта
    Python
    К сожалению, не существует некоего единого стандартного инструмента для создания графических программ на Python. Я бы рекомендовал выбирать один из инструментов,
    описанных выше, наиболее подходящий для конкретной ситуации. Во-первых, опреде- литесь, согласны ли вы платить за использование этого инструмента. Во-вторых, опре- делитесь, на каких платформах должна работать ваша программа: только на Windows, на
    Mac и GNU/Linux или на всех сразу. И в-третьих, если вы выбрали платформу GNU/Linux,
    то в какой среде вы работаете: в KDE или GNOME.
    Для более подробного анализа см. страницу 26
    Статей о Python, Том 3, Выпуск 1 19.12 Различные реализации
    Язык программирования обычно состоит из двух частей: собственно языка и программ- ного обеспечения. Язык – это то, как мы что-либо пишем, а программное обеспечение –
    это то, что запускает наши программы.
    До сих пор для выполнения наших программ мы использовали CPython. Он называется
    «CPython», потому что написан на языке C и является Классическим интерпретатором
    Python
    1
    Но существует и другое программное обеспечение, способное выполнять программы на
    Python:

    Jython
    Реализация Python, работающая на платформе Java. Это означает, что можно ис- пользовать библиотеки и классы Java в программе на Python и наоборот.

    IronPython
    Реализация Python, работающая на платформе .NET, что означает возможность ис- пользования библиотек и классов .NET в программах на Python и наоборот.

    PyPy
    Реализация Python, написанная на Python! Это исследовательский проект, суще- ствующий для ускорения и облегчения разработки интерпретатора, поскольку сам интерпретатор написан на динамическом языке (в отличие от статических языков,
    как C, Java и C# в вышеупомянутых реализациях)

    Stackless Python
    1
    1   ...   6   7   8   9   10   11   12   13   14


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