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

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 10.01.2024

Просмотров: 236

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

A Byte of Python (Russian), Версия 2.02 10.7 Переменное число параметров
4
Иногда бывает нужно определить функцию, способную принимать любое число парамет- ров. Этого можно достичь при помощи звёздочек (сохраните как function_varargs.py
):
def
total
(a
=
5
,
*
numbers,
**
phonebook):
print
(
'a'
, a)
#проход по всем элементам кортежа
for
single_item
in
numbers:
print
(
'single_item'
, single_item)
#проход по всем элементам словаря
for
first_part, second_part
in
phonebook items():
print
(first_part,second_part)
print
(total(
10
,
1
,
2
,
3
,Jack
=
1123
,John
=
2231
,Inge
=
1560
))
Вывод:
$ python function_varargs.py a 10
single_item 1
single_item 2
single_item 3
Inge 1560
John 2231
Jack 1123
None
Как это работает:
Когда мы объявляем параметр со звёздочкой (например,
*param
), все позици- онные аргументы начиная с этой позиции и до конца будут собраны в кортеж под именем param
Аналогично, когда мы объявляем параметры с двумя звёздочками (
**param
),
все ключевые аргументы начиная с этой позиции и до конца будут собраны в словарь под именем param
Мы изучим кортежи и словари в
одной из последующих глав
4
VarArgs – от англ. «Variable number of Arguments» – «переменное число аргументов» (прим. перев.)
10.7. Переменное число параметров
4 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
)
# Вызовет ошибку, поскольку мы не указали значение
# аргумента по умолчанию для 'extra_number'.
Вывод:
$ 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 extra_number
Как это работает:
Объявление параметров после параметра со звёздочкой даёт только ключевые аргументы. Если для таких аргументов не указано значение по умолчанию, и оно не передано при вызове, обращение к функции вызовет ошибку, в чём мы только что убедились.
Обратите внимание на использование
+=
, который представляет собой сокра- щённый оператор, позволяющий вместо x = x + y просто написать x += y
Если вам нужны аргументы, передаваемые только по ключу, но не нужен па- раметр со звёздочкой, то можно просто указать одну звёздочку без указания имени:
def total(initial=5, *, extra_number)
10.8. Только ключевые параметры
72


A Byte of Python (Russian), Версия 2.02 10.9 Оператор «return»
Оператор return используется для возврата
5
из функции, т.е. для прекращения её работы и выхода из неё. При этом можно также вернуть некоторое значение из функции.
Пример: (сохраните как func_return.py
)
#!/usr/bin/python
# Filename: func_return.py
def
maximum
(x, y):
if
x
>
y:
return
x
elif
x
==
y:
return
'Числа равны.'
else
:
return
y print
(maximum(
2
,
3
))
Вывод:
$ python func_return.py
3
Как это работает:
Функция maximum возвращает максимальный из двух параметров, которые в данном случае передаются ей при вызове. Она использует обычный условный оператор if..else для определения наибольшего числа, а затем возвращает
это число.
Обратите внимание, что оператор return без указания возвращаемого значения эквива- лентен выражению return None
None
– это специальный тип данных в Python, обозна- чающий ничего. К примеру, если значение переменной установлено в
None
, это означает,
что ей не присвоено никакого значения.
Каждая функция содержит в неявной форме оператор return None в конце, если вы не указали своего собственного оператора return
. В этом можно убедиться, запустив print(someFunction())
, где функция someFunction
– это какая-нибудь функция, не имеющая оператора return в явном виде. Например:
def
someFunction
():
pass
Оператор pass используется в Python для обозначения пустого блока команд.
5
return – англ. «возврат» (прим. перев.)
10.9. Оператор «return»
73

A Byte of Python (Russian), Версия 2.02
Примечание: Существует встроенная функция max
, в которой уже реализован функци- онал «поиск максимума», так что пользуйтесь этой встроенной функцией, где это воз- можно.
10.10 Строки документации
6
Python имеет остроумную особенность, называемую строками документации, обычно обозначаемую сокращённо docstrings. Это очень важный инструмент, которым вы обяза- тельно должны пользоваться, поскольку он помогает лучше документировать программу и облегчает её понимание. Поразительно, но строку документации можно получить, на- пример, из функции, даже во время выполнения программы!
Пример: (сохраните как func_doc.py
)
def
printMax
(x, y):
'''Выводит максимальное из двух чисел.
Оба значения должны быть целыми числами.'''
x
=
int
(x)
# конвертируем в целые, если возможно
y
=
int
(y)
if
x
>
y:
print
(x,
'наибольшее'
)
else
:
print
(y,
'наибольшее'
)
printMax(
3
,
5
)
print
(printMax
__doc__
)
Вывод:
$ python func_doc.py
5 наибольшее
Выводит максимальное из двух чисел.
Оба значения должны быть целыми числами.
Как это работает:
Строка в первой логической строке функции является строкой документации
для этой функции. Обратите внимание на то, что строки документации при- менимы также к
модулям
и
классам
, о которых мы узнаем в соответствующих
6
DocString - от англ. «Documentation String» – «строка документации» (прим. перев.)
10.10. Строки документации
6 74


A Byte of Python (Russian), Версия 2.02
главах.
Строки документации принято записывать в форме многострочной
7
строки,
где первая строка начинается с заглавной буквы и заканчивается точкой. Вто- рая строка оставляется пустой, а подробное описание начинается с третьей.
Вам настоятельно рекомендуется следовать такому формату для всех строк документации всех ваших нетривиальных функций.
Доступ к строке документации функции printMax можно получить с помо- щью атрибута этой функции (т.е. имени, принадлежащего ей)
__doc__
(обра- тите внимание на двойное подчёркивание). Просто помните, что Python пред- ставляет всё в виде объектов, включая функции. Мы узнаем больше об объек- тах в главе
о классах
Если вы пользовались функцией help()
в Python, значит вы уже видели строки доку- ментации. Эта функция просто-напросто считывает атрибут
__doc__
соответствующей функции и аккуратно выводит его на экран. Вы можете проверить её на рассмотренной выше функции: просто включите help(printMax)
в текст программы. Не забудьте на- жать клавишу q
для выхода из справки (
help
).
Точно так же автоматические инструменты могут получать документацию из програм- мы. Именно поэтому я настоятельно рекомендую вам использовать строки документации для любой нетривиальной функции, которую вы пишете. Команда pydoc
, поставляемая вместе с пакетом Python, работает аналогично функции help()
10.11 Аннотации
Функции имеют ещё одну дополнительную возможность, называемую аннотациями, ко- торые предоставляют отличный способ сопровождения каждого параметра, равно как и возвращаемого значения дополнительной информацией. Поскольку сам язык Python не интерпретирует эти аннотации каким-либо способом (этот функционал отводится посто- ронним библиотекам), мы опустим эту возможность из нашего обсуждения. Если вам интересно почитать об аннотациях, просмотрите
PEP 3107
10.12 Резюме
Мы рассмотрели достаточно много аспектов функций, но тем не менее, вы должны по- нимать, что это далеко не все их аспекты. В то же время, мы охватили большинство того,
с чем вы будете сталкиваться при повседневном использовании функций в Python.
Далее мы увидим, как использовать и создавать модули Python.
7
т.е. строки, содержащей символы перевода строки. (прим. перев)
10.11. Аннотации
75

Модули
Как можно использовать код повторно, помещая его в функции, мы уже видели. А что,
если нам понадобится повторно использовать различные функции в других наших про- граммах? Как вы уже, наверное, догадались, ответ – модули.
Существуют разные способы составления модулей, но самый простой – это создать файл с расширением
.py
, содержащий функции и переменные.
Другой способ – написать модуль на том языке программирования, на котором написан сам интерпретатор Python. Например, можно писать модули на языке программирова- ния C
, которые после компиляции могут использоваться стандартным интерпретатором
Python.
Модуль можно импортировать в другую программу, чтобы использовать функции из него. Точно так же мы используем стандартную библиотеку Python. Сперва посмотрим,
как использовать модули стандартной библиотеки.
Пример: (сохраните как using_sys.py
)
import
sys
print
(
'Аргументы командной строки:'
)
for
i
in
sys argv:
print
(i)
print
(
'
\n\nПеременная PYTHONPATH содержит'
, sys path,
'
\n'
)
Вывод:
$ python3 using_sys.py we are arguments
Аргументы командной строки:
using_sys.py we are arguments
Переменная PYTHONPATH содержит ['', 'C:\\Windows\\system32\\python30.zip',
'C:\\Python30\\DLLs', 'C:\\Python30\\lib',
(продолжение на следующей странице)
76


A Byte of Python (Russian), Версия 2.02
(продолжение с предыдущей страницы)
'C:\\Python30\\lib\\plat-win', 'C:\\Python30',
'C:\\Python30\\lib\\site-packages']
Как это работает:
В начале мы импортируем модуль sys командой import
. Этим мы говорим
Python, что хотим использовать этот модуль. Модуль sys содержит функции,
относящиеся к интерпретатору Python и его среде, т.е. к системе (system).
Когда Python выполняет команду import sys
, он ищет модуль sys
. В данном случае это один из встроенных модулей, и Python знает, где его искать.
Если бы это был не скомпилированный модуль, т.е. модуль, написанный на
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
, а всё,
что следует далее – аргументы, передаваемые программе
3
. Python сохраняет аргументы командной строки в переменной sys.argv для дальнейшего ис- пользования.
Помните, что имя запускаемого сценария
4
всегда является первым аргумен- том в списке sys.argv
. Так что в приведённом примере 'using_sys.py'
бу- дет элементом 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 нумерация начинается с
0, а не с 1.
sys.path содержит список имён каталогов, откуда импортируются модули.
Заметьте, что первая строка в sys.path пуста; эта пустая строка показывает,
что текущая директория также является частью sys.path
, которая совпадает со значением переменной окружения
PYTHONPATH
. Это означает, что моду- ли, расположенные в текущем каталоге, можно импортировать напрямую. В
противном случае придётся поместить свой модуль в один из каталогов, пе- речисленных в sys.path
Помните, что текущий каталог – это каталог, в котором была запущена про- грамма. Выполните «
import os; print(os.getcwd())
», чтобы узнать те- кущий каталог программы.
11.1 Файлы байткода .pyc
Импорт модуля – относительно дорогостоящее мероприятие, поэтому Python предприни- мает некоторые трюки для ускорения этого процесса. Один из способов – создать байт-
компилированные файлы (или байткод) с расширением
.pyc
, которые являются некой промежуточной формой, в которую Python переводит программу (помните раздел
«Введе-
ние»
о том, как работает Python?). Такой файл
.pyc полезен при импорте модуля в следу- ющий раз в другую программу – это произойдёт намного быстрее, поскольку значитель- ная часть обработки, требуемой при импорте модуля, будет уже проделана. Этот байткод также является платформо-независимым.
1   2   3   4   5   6   7   8   9   ...   14