Укус питона. Книга на вашем родном языке Переводы 7 1 Доступные переводы переводы 7 3 Предисловие 16 1
Скачать 0.76 Mb.
|
Пример: сохраните как func_global.py ) x = 50 def func (): global x print ( 'x равно, Заменяем глобальное значение x на, Значение x составляет, Вывод python func_global.py x равно Заменяем глобальное значение x на Значение x составляет Как это работает: Зарезервированное слово global используется для того, чтобы объявить, что x – это глобальная переменная, а значит, когда мы присваиваем значение имени внутри функции, это изменение отразится назначении переменной в основном блоке программы. Используя одно зарезервированное слово global , можно объявить сразу несколько переменных x, y, z 10.3. Зарезервированное слово «global» 67 A Byte of Python (Russian), Версия 2.02 10.4 Зарезервированное слово Мы увидели, как получать доступ к переменным в локальной и глобальной области видимости. Есть ещё один тип области видимости, называемый нелокальной (областью видимости, который представляет собой нечто среднее между первыми двумя. Нелокальные области видимости встречаются, когда вы определяете функции внутри функций. Поскольку в Python всё является выполнимым кодом, вы можете определять функции где угодно. Давайте рассмотрим пример Filename: func_nonlocal.py def func_outer (): x = 2 ( 'x равно, x) def func_inner (): nonlocal x Локальное x сменилось на, Вывод python func_nonlocal.py x равно Локальное x сменилось на Как это работает: Когда мы находимся внутри func_inner , переменная x , определённая впервой строке func_outer находится нив локальной области видимости (определение переменной не входит в блок func_inner ), нив глобальной области видимости (она также и не в основном блоке программы. Мы объявляем, что хотим использовать именно эту переменную x , следующим образом Попробуйте заменить « nonlocal x » на « global x », а затем удалить это зарезервированное слово, и пронаблюдайте за разницей между этими двумя случаями. Зарезервированное слово «nonlocal» 68 A Byte of Python (Russian), Версия 2.02 10.5 Значения аргументов по умолчанию Зачастую часть параметров функций могут быть необязательными, и для них будут использоваться некоторые заданные значения по умолчанию, если пользователь не укажет собственных. Этого можно достичь с помощью значений аргументов по умолчанию. Их можно указать, добавив к имени параметра в определении функции оператор присваивания) с последующим значением. Обратите внимание, что значение по умолчанию должно быть константой. Или точнее говоря, оно должно быть неизменным это объясняется подробнее в последующих главах. А пока запомните это. Пример: сохраните как func_default.py ) def say (message, times = 1 ): (message * times) say( 'Привет' ) say( 'Мир' , 5 ) Вывод: $ python func_default.py Привет МирМирМирМирМир Как это работает: Функция под именем say используется для вывода на экран строки указанное число раз. Если мы не указываем значения, по умолчанию строка выводится один раз. Мы достигаем этого указанием значения аргумента по умолчанию, равного 1 для параметра При первом вызове say мы указываем только строку, и функция выводите один раз. При втором вызове say мы указываем также и аргумент, обозначая таким образом, что мы хотим сказать 3 фразу 5 раз. Важно: Значениями по умолчанию могут быть снабжены только параметры, находящиеся в конце списка параметров. Таким образом, в списке параметров функции параметр со значением по умолчанию не может предшествовать параметру без значения по умолчанию. Это связано стем, что значения присваиваются параметрам в соответствии сих положением. Например func(a, допустимо, а def func(a=5, b) – недопустимо в терминологии Python (прим. перев.) 2 times – англ. раз (прим. перев.) 3 say – англ. сказать (прим. перев.) 10.5. Значения аргументов по умолчанию A Byte of Python (Russian), Версия 2.02 10.6 Ключевые аргументы Если имеется некоторая функция с большим числом параметров, и при её вызове требуется указать только некоторые из них, значения этих параметров могут задаваться по их имени – это называется ключевые параметры. В этом случае для передачи аргументов функции используется имя (ключ) вместо позиции (как было до сих пор). Есть два преимущества такого подхода во-первых, использование функции становится легче, поскольку нет необходимости отслеживать порядок аргументов во-вторых, можно задавать значения только некоторым избранным аргументам, при условии, что остальные параметры имеют значения аргумента по умолчанию. Пример: сохраните как func_key.py ) def func (a, b = 5 , c = 10 ): ( 'a равно, a, ', b равно, b, ', а c равно, c) func( 3 , 7 ) func( 25 , c = 24 ) func(c = 50 , Вывод python func_key.py a равно 3, b равно 7, а c равно 10 a равно 25, b равно 5, а c равно 24 a равно 100, b равно 5, а c равно Как это работает: Функция с именем func имеет один параметр без значения по умолчанию, за которым следуют два параметра со значениями по умолчанию. При первом вызове, 7) , параметр получает значение, параметр получает значение, а получает своё значение по умолчанию, равное 10 При втором вызове func(25, переменная получает значение 25 в силу позиции аргумента. После этого параметр получает значение 24 по имени, те. как ключевой параметр. Переменная получает значение по умолчанию, равное 5 При третьем обращении func(c=50, мы используем ключевые аргументы для всех указанных значений. Обратите внимание на то, что мы указываем значение для параметра перед значением для a , даже несмотря на то, что в определении функции параметр указан раньше c 10.6. Ключевые аргументы A Byte of Python (Russian), Версия 2.02 10.7 Переменное число параметров 4 Иногда бывает нужно определить функцию, способную принимать любое число параметров. Этого можно достичь при помощи звёздочек (сохраните как function_varargs.py ): def total (a = 5 , * numbers, ** phonebook): ( 'a' , проход по всем элементам кортежа, проход по всем элементам словаря, second_part in phonebook Вывод python function_varargs.py a 10 single_item 1 single_item 2 single_item 3 Inge 1560 John 2231 Jack Как это работает: Когда мы объявляем параметр со звёздочкой (например, все позиционные аргументы начиная с этой позиции и до конца будут собраны в кортеж под именем Аналогично, когда мы объявляем параметры с двумя звёздочками (все ключевые аргументы начиная с этой позиции и до конца будут собраны в словарь под именем Мы изучим кортежи и словари водной из последующих глав – от англ. «Variable number of Arguments» – переменное число аргументов (прим. перев.) 10.7. Переменное число параметров 71 A Byte of Python (Russian), Версия 2.02 10.8 Только ключевые параметры Если некоторые ключевые параметры должны быть доступны только по ключу, а не как позиционные аргументы, их можно объявить после параметра со звёздочкой (сохраните как keyword_only.py ): def total (initial = 5 , * numbers, extra_number): count = initial for number in numbers: count += number count += extra_number print (count) total( 10 , 1 , 2 , 3 , extra_number = 50 ) total( 10 , 1 , 2 , 3 ) # Вызовет ошибку, поскольку мы не указали значение аргумента по умолчанию для 'Вывод python keyword_only.py 66 Traceback (most recent call last): File "keyword_only.py", line 12, in total(10, 1, 2, 3) TypeError: total() needs keyword-only argument Как это работает: Объявление параметров после параметра со звёздочкой даёт только ключевые аргументы. Если для таких аргументов не указано значение по умолчанию, и оно не передано при вызове, обращение к функции вызовет ошибку, в чём мы только что убедились. Обратите внимание на использование, который представляет собой сокра- щённый оператор, позволяющий вместо x = x + y просто написать x += Если вам нужны аргументы, передаваемые только по ключу, ноне нужен параметр со звёздочкой, то можно просто указать одну звёздочку без указания имени total(initial=5, *, extra_number) 10.8. Только ключевые параметры A Byte of Python (Russian), Версия 2.02 10.9 Оператор Оператор return используется для возврата 5 из функции, те. для прекращения её работы и выхода из не. При этом можно также вернуть некоторое значение из функции. Пример: сохраните как func_return.py ) #!/usr/bin/python # Filename: func_return.py def maximum (x, Числа равны Вывод python Как это работает: Функция maximum возвращает максимальный из двух параметров, которые в данном случае передаются ей при вызове. Она использует обычный условный оператор if..else для определения наибольшего числа, а затем возвращает это число. Обратите внимание, что оператор return без указания возвращаемого значения эквивалентен выражению return None None – это специальный тип данных в Python, обозначающий ничего. К примеру, если значение переменной установлено в, это означает, что ей не присвоено никакого значения. Каждая функция содержит в неявной форме оператор return None в конце, если вы не указали своего собственного оператора return . В этом можно убедиться, запустив print(someFunction()) , где функция someFunction – это какая-нибудь функция, не имеющая оператора return в явном виде. Например: def someFunction (): pass Оператор pass используется в Python для обозначения пустого блока команд – англ. возврат (прим. перев.) 10.9. Оператор «return» 73 A Byte of Python (Russian), Версия Примечание Существует встроенная функция max , в которой уже реализован функционал поиск максимума, так что пользуйтесь этой встроенной функцией, где это возможно Строки документации имеет остроумную особенность, называемую строками документации, обычно обозначаемую сокращённо docstrings. Это очень важный инструмент, которым вы обязательно должны пользоваться, поскольку он помогает лучше документировать программу и облегчаете понимание. Поразительно, но строку документации можно получить, например, из функции, даже вовремя выполнения программы! Пример: сохраните как func_doc.py ) def printMax (x, Выводит максимальное из двух чисел. Оба значения должны быть целыми числами конвертируем в целые, если возможно y = int (y) if x > y: (x, 'наибольшее' ) else : (y, 'наибольшее' ) printMax( 3 , 5 ) (printMax __doc__ ) Вывод: $ python func_doc.py 5 наибольшее Выводит максимальное из двух чисел. Оба значения должны быть целыми числами. Как это работает: Строка впервой логической строке функции является строкой документации для этой функции. Обратите внимание на то, что строки документации применимы также к модулям и классам , о которых мы узнаем в соответствующих - от англ. «Documentation String» – строка документации (прим. перев.) 10.10. Строки документации 74 A Byte of Python (Russian), Версия 2.02 главах. Строки документации принято записывать в форме многострочной 7 строки, где первая строка начинается с заглавной буквы и заканчивается точкой. Вторая строка оставляется пустой, а подробное описание начинается с третьей. Вам настоятельно рекомендуется следовать такому формату для всех строк документации всех ваших нетривиальных функций. Доступ к строке документации функции printMax можно получить с помощью атрибута этой функции (те. имени, принадлежащего ей) __doc__ (обра- тите внимание на двойное подчёркивание). Просто помните, что Python представляет всё в виде объектов, включая функции. Мы узнаем больше об объектах в главе о классах Если вы пользовались функцией в Python, значит вы уже видели строки документации. Эта функция просто-напросто считывает атрибут __doc__ соответствующей функции и аккуратно выводит его на экран. Вы можете проверить её на рассмотренной выше функции просто включите в текст программы. Не забудьте нажать клавишу для выхода из справки (Точно также автоматические инструменты могут получать документацию из программы. Именно поэтому я настоятельно рекомендую вам использовать строки документации для любой нетривиальной функции, которую выпишете. Команда pydoc , поставляемая вместе с пакетом Python, работает аналогично функции help() 10.11 Аннотации Функции имеют ещё одну дополнительную возможность, называемую аннотациями, которые предоставляют отличный способ сопровождения каждого параметра, равно как и возвращаемого значения дополнительной информацией. Поскольку сам язык Python не интерпретирует эти аннотации каким-либо способом (этот функционал отводится посторонним библиотекам, мы опустим эту возможность из нашего обсуждения. Если вам интересно почитать об аннотациях, просмотрите 3107 10.12 Резюме Мы рассмотрели достаточно много аспектов функций, но тем не менее, вы должны понимать, что это далеко не все их аспекты. В тоже время, мы охватили большинство того, с чем выбудете сталкиваться при повседневном использовании функций в Далее мы увидим, как использовать и создавать модули те. строки, содержащей символы перевода строки. (прим. перев) 10.11. Аннотации Модули Как можно использовать код повторно, помещая его в функции, мы уже видели. А что, если нам понадобится повторно использовать различные функции в других наших программах Как вы уже, наверное, догадались, ответ – модули. Существуют разные способы составления модулей, но самый простой – это создать файл с расширением, содержащий функции и переменные. Другой способ – написать модуль на том языке программирования, на котором написан сам интерпретатор Python. Например, можно писать модули на языке программирования, которые после компиляции могут использоваться стандартным интерпретатором Python. Модуль можно импортировать в другую программу, чтобы использовать функции из него. Точно также мы используем стандартную библиотеку Python. Сперва посмотрим, как использовать модули стандартной библиотеки. Пример: сохраните как Аргументы командной строки Переменная PYTHONPATH содержит, sys Вывод python3 using_sys.py we are Аргументы командной строки we are Переменная PYTHONPATH содержит ['', 'C:\\Windows\\system32\\python30.zip', 'C:\\Python30\\DLLs', 'продолжение наследующей странице A Byte of Python (Russian), Версия продолжение с предыдущей страницы, 'Как это работает: В начале мы импортируем модуль sys командой import . Этим мы говорим, что хотим использовать этот модуль. Модуль sys содержит функции, относящиеся к интерпретатору Python и его среде, тек системе (Когда Python выполняет команду import sys , он ищет модуль sys . В данном случае это один из встроенных модулей, и Python знает, где его искать. Если бы это был не скомпилированный модуль, те. модуль, написанный на, тогда интерпретатор Python искал бы его в каталогах, перечисленных в переменной sys.path . Если модуль найден, выполняются команды в теле модуля, ион становится доступным. Обратите внимание, что инициализация 1 происходит только при первом импорте модуля. Доступ к переменной argv в модуле sys предоставляется при помощи точки, т.е. sys.argv . Это явно показывает, что это имя является частью модуля sys Ещё одним преимуществом такого обозначения является то, что имя не конфликтует с именем переменной argv , которая может использоваться в вашей программе. Переменная sys.argv является списком строк (списки будут детально обсуждаться водной из последующих глав. Она содержит список аргументов командной строки, те. аргументов, переданных программе из командной строки. Если вы используете среду разработки 2 для написания и запуска программ, поищите где-нибудь в её меню возможность передавать параметры командной строки. В нашем примере, когда мы запускаем « python using_sys.py we are arguments », мы запускаем модуль using_sys.py командой python , а всё, что следует далее – аргументы, передаваемые программе. Python сохраняет аргументы командной строки в переменной sys.argv для дальнейшего ис- пользования. Помните, что имя запускаемого сценария 4 всегда является первым аргументом в списке sys.argv . Так что в приведённом примере 'будет элементом sys.argv[0] , 'we' – sys.argv[1] , 'are' – sys.argv[2] , а 1 Инициализация – ряд действий, производимых при начальной загрузке (прим. перев.) 2 IDE – от англ. «Integrated Development Environment» – интегрированная среда разработки (прим. пе- рев.) 3 «we are arguments» – англ. мы аргументы (прим. перев.) 4 Программу на интерпретируемом языке программирования также называют сценарием или скриптом (прим. перев.) 77 A Byte of Python (Russian), Версия 2.02 'arguments' – sys.argv[3] . Помните, что в Python нумерация начинается сане с 1. sys.path содержит список имён каталогов, откуда импортируются модули. Заметьте, что первая строка в sys.path пуста эта пустая строка показывает, что текущая директория также является частью sys.path , которая совпадает со значением переменной окружения. Это означает, что модули, расположенные в текущем каталоге, можно импортировать напрямую. В противном случае придётся поместить свой модуль в один из каталогов, перечисленных в Помните, что текущий каталог – это каталог, в котором была запущена программа. Выполните « import os; print(os.getcwd()) », чтобы узнать текущий каталог программы Файлы байткода Импорт модуля – относительно дорогостоящее мероприятие, поэтому Python предпринимает некоторые трюки для ускорения этого процесса. Один из способов – создать байт- компилированные файлы (или байткод) с расширением, которые являются некой промежуточной формой, в которую Python переводит программу (помните раздел «Введе- ние» о том, как работает Python?). Такой файл полезен при импорте модуля в следующий разв другую программу – это произойдёт намного быстрее, поскольку значительная часть обработки, требуемой при импорте модуля, будет уже проделана. Этот байткод также является платформо-независимым. |