Книга на вашем родном языке Переводы 7 1 Доступные переводы переводы 7 3 Предисловие 16 1
Скачать 0.91 Mb.
|
Примечание: Обычно файлы создаются в том же каталоге, где расположены и соответствующие им файлы. Если Python не может получить доступ для записи файлов в этот каталог, файлы созданы не будут Оператор from … import Чтобы импортировать переменную argv прямо в программу и не писать всякий раз при обращении к ней, можно воспользоваться выражением « from sys import Для импорта всех имён, использующихся в модуле sys , можно выполнить команду sys import * ». Это работает для любых модулей. В общем случае вам следует избегать использования этого оператора и использовать вместо этого оператор import , чтобы предотвратить конфликты имён и не затруднять чтение программы. Файлы байткода .pyc 78 A Byte of Python (Russian), Версия 2.02 Пример: from math import * n = int ( input ( "Введите диапазон range ( 2 ,a): if ( i <= sqrt(a)): if (a % i == 0 ): (a, "непростое" ) b = 1 else : pass if (b != 1 ): (a, "простое" ) p = p + [a] count = count + 1 a = a + 2 (p) 11.3 Имя модуля – У каждого модуля есть имя, и команды в модуле могут узнать имя их модуля. Это полезно, когда нужно знать, запущен ли модуль как самостоятельная программа или импортирован. Как уже упоминалось выше, когда модуль импортируется впервые, содержащийся в нём код исполняется. Мы можем воспользоваться этим для того, чтобы заставить модуль вести себя по-разному в зависимости оттого, используется ли он сам по себе или импортируется в другую программа. Этого можно достичь с применением атрибута модуля под названием __name__ Пример: сохраните как Эта программа запущена сама по себе.' ) else : ( 'Меня импортировали в другой модуль.' ) Вывод: $ python3 Эта программа запущена сама по себе. (продолжение наследующей странице. Имя модуля – __name__ 79 A Byte of Python (Russian), Версия продолжение с предыдущей страницы python3 >>> import Меня импортировали в другой модуль. >>> Как это работает: В каждом модуле Python определено его имя – __name__ 5 . Если оно равно '__main__' , это означает, что модуль запущен самостоятельно пользователем, и мы можем выполнить соответствующие действия Создание собственных модулей Создать собственный модуль очень легко. Да вы всё время делали это Ведь каждая программа на Python также является и модулем. Необходимо лишь убедиться, что у неё установлено расширение. Следующий пример объяснит это. Пример: сохраните как Привет Это говорит мой модуль Конец модуля Выше приведён простой модуль. Как видно, в нём нет ничего особенного по сравнению с обычной программой на Python. Далее посмотрим, как использовать этот модуль в других наших программах. Помните, что модуль должен находиться либо в том же каталоге, что и программа, в которую мы импортируем его, либо водном из каталогов, указанных в sys.path Ещё один модуль (сохраните как mymodule_demo.py ): import mymodule mymodule Версия, mymodule __version__) 5 name - англ. имя (прим. перев.) 11.4. Создание собственных модулей A Byte of Python (Russian), Версия Вывод python Привет Это говорит мой модуль. Версия Как это работает: Обратите внимание, что мы используем всё тоже обозначение точкой для доступа к элементам модуля. Python повсеместно использует одно и тоже обозначение точкой, придавая ему таким образом характерный «Python-овый» вид и не вынуждая нас изучать всё новые и новые способы делать что-либо. Вот версия, использующая синтаксис сохраните как mymodule_demo2. py ): from mymodule import sayhi, Версия, Вывод mymodule_demo2.py такой же, как и Обратите внимание, что если в модуле, импортирующем данный модуль, уже было объявлено имя, возникнет конфликт. Это весьма вероятно, так как объявлять версию любого модуля при помощи этого имени – общепринятая практика. Поэтому всегда рекомендуется отдавать предпочтение оператору import , хотя это и сделает вашу программу немного длиннее. Вы могли бы также использовать: from mymodule import * Это импортирует все публичные имена, такие как sayhi , ноне импортирует, потому что оно начинается с двойного подчёркивания Дзэн Одним из руководящих принципов в Python является Явное лучше Неявного. Выполните команду « import this », чтобы узнать больше, а также просмотрите это обсуждение, в котором приводятся примеры по каждому из принципов. Создание собственных модулей A Byte of Python (Russian), Версия 2.02 11.5 Функция Встроенная функция возвращает список имён, определяемых объектом. Например, для модуля в этот список входят функции, классы и переменные, определённые в этом модуле. Эта функция может принимать аргументы. Если в качестве аргумента указано имя модуля, она возвращает список имён, определённых в этом модуле. Если никакого аргумента не передавать, она вернёт список имён, определённых в текущем модуле. Пример: $ python3 >>> import sys # получим список атрибутов модуля 'sys' >>> dir(sys) ['__displayhook__', '__doc__', '__excepthook__', '__name__', '__package__', '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_compact_free lists', '_current_frames', '_getframe', 'api_version', 'argv', 'builtin_module _names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dllhandle', 'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'getcheckinterval', 'getdefault encoding', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getref count', 'getsizeof', 'gettrace', 'getwindowsversion', 'hexversion', 'intern', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions', 'winver'] >>> dir() # получим список атрибутов текущего модуля, '__doc__', '__name__', '__package__', 'sys'] >>> a = 5 # создадим новую переменную 'a' >>> dir() ['__builtins__', '__doc__', '__name__', '__package__', 'a', 'sys'] >>> del a # удалим имя 'a' >>> dir() ['__builtins__', '__doc__', '__name__', '__package__', 'Как это работает: Сперва мы видим результат применения dir к импортированному модулю. Функция dir 82 A Byte of Python (Russian), Версия 2.02 sys . Видим огромный список атрибутов, содержащихся в нём. Затем мы вызываем функцию dir , не передавая ей параметров. По умолчанию, она возвращает список атрибутов текущего модуля. Обратите внимание, что список импортированных модулей также входит туда. Чтобы пронаблюдать за действием dir , мы определяем новую переменную и присваиваем ей значение, а затем снова вызываем dir . Видим, что в полученном списке появилось дополнительное значение. Удалим переменную атрибут из текущего модуля при помощи оператора del , и изменения вновь отобразятся на выводе функции Замечание по поводу del : этот оператор используется для удаления переменной имении после его выполнения, в данном случае – del a , к переменной больше невозможно обратиться – её как будто никогда и не было. Обратите внимание, что функция работает для любого объекта. Например, выполните « dir('print') », чтобы увидеть атрибуты функции или « dir(str) », чтобы увидеть атрибуты класса str 11.6 Пакеты К настоящему времени вы, вероятно, начали наблюдать некоторую иерархию в организации ваших программ. Переменные обычно находятся в функциях. Функции и глобальные переменные обычно находятся в модулях. А что, если возникнет необходимость как-то организовать модули Вот здесь-то и выходят на сцену пакеты. Пакеты – это просто каталоги с модулями и специальным файлом, который показывает Python, что этот каталог особый, так как содержит модули Представим, что мы хотим создать пакет под названием «world» с субпакетами «asia», «africa» и т.д., которые, в свою очередь, будут содержать модули «india», «madagascar» и т.д. Для этого следовало бы создать следующую структуру каталогов - некоторый каталог из sys path >/ | |---- world / | |---- __init__ py | |---- asia / | | |---- __init__ py | | |---- india / | | |---- __init__ py | | |---- foo py | |---- продолжение наследующей странице. Пакеты A Byte of Python (Russian), Версия продолжение с предыдущей страницы- madagascar / | |---- __init__ py | |---- bar Пакеты – это удобный способ иерархически организовать модули. Такое часто встречается в стандартной библиотеке Резюме Точно также, как функции являются многократно используемыми фрагментами программ, модули являются многократно используемыми программами. Пакеты – это способ иерархической организации модулей. Стандартная библиотека Python является примером такого набора пакетов и модулей. Мы увидели, как пользоваться этими модулями и создавать свои. Далее мы познакомимся с некоторыми интересными концепциями, называемыми «структуры данных. Резюме Структуры данных Структуры данных – это, по сути, и есть структуры, которые могут хранить некоторые данные вместе. Другими словами, они используются для хранения связанных данных. В Python существуют четыре встроенных структуры данных список, кортеж, словарь и множество. Посмотрим, какими пользоваться, и как они могут облегчить нам жизнь Список Список 1 – это структура данных, которая содержит упорядоченный набор элементов, т.е. хранит последовательность элементов. Это легко представить, если вспомнить список покупок, в котором перечисляется, что нужно купить, стем лишь исключением, что в списке покупок каждый элемент обычно размещается на отдельной строке, тогда как вони разделяются запятыми. Список элементов должен быть заключён в квадратные скобки, чтобы Python понял, что это список. Как только список создан, можно добавлять, удалять или искать элементы в нм. Поскольку элементы можно добавлять и удалять, мы говорим, что список – это изменяемый тип данных, те. его можно модифицировать Краткое введение в объекты и классы Хотя я и старался до сих пор оттянуть обсуждение объектов и классов, на данном этапе всё же необходимо некоторое пояснение, чтобы вы лучше поняли идею списков. Мы изучим эту тему детально в её собственной главе Список – это один из примеров использования объектов и классов. Когда мы назначаем некоторой переменной значение, скажем, целое число, это можно представить себе как создание объекта те. экземпляра) i класса те. типа. Чтобы лучше понять это, прочитайте Класс может также иметь методы, те. функции, определённые для использования только применительно к данному классу. Этот функционал будет доступен только когда имеется – англ. список (прим.перев.) 85 A Byte of Python (Russian), Версия объект данного класса. Например, Python предоставляет метод append для класса который позволяет добавлять элемент к концу списка. Так mylist.append('and добавит эту строку к списку mylist . Обратите внимание на обозначение точкой для доступа к методам объектов. Класс также может иметь поля, которые представляют собой нечто иное, как переменные, определённые для использования только применительно к данному классу. Эти переменные имена можно использовать только тогда, когда имеется объект этого класса. Доступ к полям также осуществляется при помощи точки. Например, mylist.field Пример: сохраните как using_list.py ) # Это мой список покупок shoplist = [ 'яблоки' , 'манго' , 'морковь' , 'бананы' ] ( 'Я должен сделать' , len (shoplist), 'покупки.' ) ( 'Покупки:' , end = ' ' ) for item in shoplist: (item, end = ' 'Также нужно купить риса append( 'рис' ) ( 'Теперь мой список покупок таков, shoplist) ( 'Отсортирую-ка я свой список Отсортированный список покупок выглядит так, Первое, что мне нужно купить, это, Я купил, Теперь мой список покупок, Вывод python3 Я должен сделать 4 покупки. Покупки: яблоки манго морковь бананы Также нужно купить риса. Теперь мой список покупок таков яблоки, 'манго, 'морковь, 'бананы', 'рис'] Отсортирую-ка я свой список Отсортированный список покупок выглядит так бананы, 'манго, 'морковь', 'рис', 'яблоки'] (продолжение наследующей странице. Краткое введение в объекты и классы A Byte of Python (Russian), Версия продолжение с предыдущей страницы) Первое, что мне нужно купить, это бананы Я купил бананы Теперь мой список покупок манго, 'морковь, 'рис, 'яблоки'] Как это работает: Переменная shoplist – это список покупок человека, идущего на рынок. В мы храним только строки с названиями того, что нужно купить, однако в список можно добавлять любые объекты, включая числа или даже другие списки. Мы также использовали цикл for..in для итерации по элементам списка. Вы уже, наверное, поняли, что список является также и последовательностью. Особенности последовательностей будут рассмотрены ниже Обратите внимание на использование ключевого аргумента end в функции print , который показывает, что мы хотим закончить вывод пробелом вместо обычного перевода строки. Далее мы добавляем элемент к списку при помощи append – метода объекта списка, который уже обсуждался ранее. Затем мы проверяем, действительно ли элемент был добавлен к списку, выводя содержимое списка на экран при помощи простой передачи этого списка функции print , которая аккуратно его печатает. Затем мы сортируем список, используя метод sort объекта списка. Имейте ввиду, что этот метод действует на сам список, а не возвращает изменённую его версию. В этом отличие оттого, как происходит работа со строками. Именно это имеется ввиду, когда мы говорим, что списки изменяемы, а строки – неиз- меняемы. Далее после совершения покупки мы хотим удалить её из списка. Это достигается применением оператора del . Мы указываем, какой элемент списка мы хотим удалить, и оператор del удаляет его. Мы указываем, что хотим удалить первый элемент списка, и поэтому пишем « del shoplist[0] » (помните, что начинает отсчёт с Чтобы узнать более детально обо всех методах объекта списка, просмотрите help(list) 12.2. Краткое введение в объекты и классы A Byte of Python (Russian), Версия 2.02 12.3 Кортеж Кортежи служат для хранения нескольких объектов вместе. Их можно рассматривать как аналог списков, но без такой обширной функциональности, которую предоставляет класс списка. Одна из важнейших особенностей кортежей заключается в том, что они неизме- няемы, также, как и строки. Те. модифицировать кортежи невозможно. Кортежи обозначаются указанием элементов, разделённых запятыми пожеланию их можно ещё заключить в круглые скобки. Кортежи обычно используются в тех случаях, когда оператор или пользовательская функция должны наверняка знать, что набор значений, те. кортеж значений, не изменится. Пример: сохраните как using_tuple.py ) zoo = ( 'питон' , 'слон' , 'пингвин' ) # помните, что скобки необязательны животных в зоопарке -' , len (zoo)) new_zoo = 'обезьяна' , 'верблюд' , zoo Количество клеток в зоопарке -Все животные в новом зоопарке, Животные, привезённые из старого зоопарка, Последнее животное, привезённое из старого зоопарка -' , Количество животных в новом зоопарке -Вывод python3 Количество животных в зоопарке - Количество клеток в зоопарке - Все животные в новом зоопарке (обезьяна, 'верблюд, (питон, 'слон', 'пингвин')) Животные, привезённые из старого зоопарка (питон, 'слон, 'пингвин') Последнее животное, привезённое из старого зоопарка - пингвин Количество животных в новом зоопарке - Как это работает: Переменная zoo обозначает кортеж элементов. Как мы видим, функция len позволяет получить длину кортежа. Это также указывает на то, что кортеж является последовательностью Теперь мы перемещаем этих животных в новый зоопарк, поскольку старый зоопарк закрывается. Поэтому кортеж new_zoo содержит тех животных, которые уже там, наряду с привезёнными из старого зоопарка. Возвращаясь к реальности, обратите внимание на то, что кортеж внутри кортежа не теряет своей индивидуальности. Кортеж A Byte of Python (Russian), Версия Доступ к элементам кортежа осуществляется указанием позиции элемента, заключённой в квадратные скобки – точно также, как мы это делали для списков. Это называется оператором индексирования. Доступ к третьему элементу в мы получаем, указывая new_zoo[2] , а доступ к третьему элементу внутри третьего элемента в кортеже new_zoo – указывая new_zoo[2][2] . Это достаточно просто, как только вы поймёте принцип. Скобки Хотя скобки и не являются обязательными, я предпочитаю всегда указывать их, чтобы было очевидно, что это кортеж, особенно в двусмысленных случаях. Например, print(1, 2,3) и print( (1,2,3) делают разные вещи первое выражение выводит три числа, тогда как второе – кортеж, содержащий эти три числа. Кортеж, содержащий 0 или 1 элемент Пустой кортеж создаётся при помощи пустой пары скобок – « myempty = () ». Однако, с кортежем из одного элемента не всё так просто. Его нужно указывать при помощи запятой после первого (и единственного) элемента, чтобы Python мог отличить кортеж от скобок, окружающих объект в выражении. Таким образом, чтобы получить кортеж, содержащий элемент, вам потребуется указать « singleton = (Замечание для программистов на Список внутри списка не теряет своей индивидуальности, те. списки не развёртываются, как в Perl. Это же относится к кортежу внутри кортежа, или кортежу внутри списка, или списку внутри кортежа и т.д. В Python все они рассматриваются как объекты, хранящиеся внутри другого объекта – только и всего Словарь Словарь – это некий аналог адресной книги, в которой можно найти адрес или контактную информацию о человеке, зная лишь его имя те. некоторые ключи имена) связаны со значениями информацией. Заметьте, что ключ должен быть уникальным – вы ведь не сможете получить корректную информацию, если у вас записаны два человека с полностью одинаковыми именами. Обратите также внимание на то, что в словарях в качестве ключей могут использоваться только неизменяемые объекты (как строки, а в качестве значений можно использовать как неизменяемые, таки изменяемые объекты. Точнее говоря, в качестве ключей должны использоваться только простые объекты. Словарь A Byte of Python (Russian), Версия Пары ключ-значение указываются в словаре следующим образом « d = {key1 : value1, key2 : value2 } ». Обратите внимание, что ключи значение разделяются двоеточием, а пары друг от друга отделяются запятыми, а затем всё это заключается в фигурные скобки. Помните, что пары ключ-значение никоим образом не упорядочены в словаре. Если вам необходим некоторый порядок, вам придётся отдельно отсортировать словарь перед обращением к нему. Словари являются экземплярами/объектами класса Пример сохраните как using_dict.py ) # 'ab' - сокращение от Адреса Удаление пары ключ-значение |