Шаг 114.
Основы языка Python.
Пользовательские функции. Определение и вызов функции

    На этом шаге мы рассмотрим различные способы определения и вызова функции.

    Функция создается (или, как говорят программисты, определяется) с помощью ключевого слова def по следующей схеме:

   def <Имя функции> ( [ <Параметры> ] ) :
        ["""  Строка документирования  """] 
        <Тело функции> 
        [return <Результат>]

    Имя функции должно быть уникальным идентификатором, состоящим из латинских букв, цифр и знаков подчеркивания, причем имя функции не может начинаться с цифры. В качестве имени нельзя использовать ключевые слова, кроме того, следует избегать совпадений с названиями встроенных идентификаторов. Регистр символов в названии функции также имеет значение.

    После имени функции в круглых скобках можно указать один или несколько параметров через запятую, а если функция не принимает параметры, указываются только круглые скобки. После круглых скобок ставится двоеточие.

    Тело функции представляет собой составную конструкцию. Как и в любой составной конструкции, инструкции внутри функции выделяются одинаковым количеством пробелов слева. Концом функции считается инструкция, перед которой находится меньшее количество пробелов. Если тело функции не содержит инструкций, то внутри ее необходимо разместить оператор pass, который не выполняет никаких действий. Этот оператор удобно использовать на этапе отладки программы, когда мы определили функцию, а тело решили дописать позже. Пример функции, которая ничего не делает:

  def  func(): pass

    Необязательная инструкция return позволяет вернуть из функции какое-либо значение в качестве результата. После исполнения этой инструкции выполнение функции будет остановлено. Это означает, что инструкции, следующие после оператора return, никогда не будут выполнены. Пример:

def func():
    print("Текст до инструкции return")
    return "Возвращаемое значение"
    print("Эта инструкция никогда не будет выполнена")

print(func()) # Вызываем функцию 

    Результат выполнения:

Текст до инструкции return
Возвращаемое значение 

    Инструкции return может не быть вообще. В этом случае выполняются все инструкции внутри функции, и в качестве результата возвращается значение None.

    Для примера создадим три функции:

def print_ok():
    """ Пример функции без параметров """
    print("Сообщение при удачно выполненной операции")

def echo(m):
    """ Пример функции с параметром """ 
    print(m)

def summa(x, у):
    """ Пример функции с параметрами,
         возвращающей сумму двух переменных """
    return х + у

    При вызове функции значения передаются внутри круглых скобок через запятую. Если функция не принимает параметров, то указываются только круглые скобки. Необходимо также заметить, что количество параметров в определении функции должно совпадать с количеством параметров при вызове, иначе будет выведено сообщение об ошибке. Вызвать созданные функции можно способами, указанными ниже:

print_ok()	# Вызываем функцию без параметров
echo("Сообщение")	#  Функция  выведет  сообщение
x = summa(5, 2) # Переменной х будет присвоено значение 7
a, b = 10, 50
y = summa(a, b) # Переменной y будет присвоено значение 60

    Как видно из последнего примера, имя переменной в вызове функции может не совпадать с именем переменной в определении функции. Кроме того, глобальные переменные x и y не конфликтуют с одноименными переменными в определении функции, т. к. они расположены в разных областях видимости. Переменные, указанные в определении функции, являются локальными и доступны только внутри функции. Более подробно области видимости мы рассмотрим в следующих шагах.

    Оператор +, используемый в функции summa(), применяется не только для сложения чисел, но и позволяет объединить последовательности. То есть, функция summa () может использоваться не только для сложения чисел. В качестве примера выполним конкатенацию строк и объединение списков:

def summa(х, у):
    return х + у

print(summa("str", "ing"))   # Выведет: string
print (summa ( [1, 2], [3, 4])) # Выведет: [1, 2, 3, 4]

    Как вы уже знаете, все в языке Python представляет собой объекты: строки, списки и даже сами типы данных. Не являются исключением и функции. Инструкция def создает объект, имеющий тип function, и сохраняет ссылку на него в идентификаторе, указанном после инструкции def. Таким образом, мы можем сохранить ссылку на функцию в другой переменной - для этого название функции указывается без круглых скобок. Сохраним ссылку в переменной и вызовем функцию через нее:

def summa (x, y) :
    return  x + y

f = summa # Сохраняем ссылку в переменной  f
v = f(10, 20) #   Вызываем функцию через переменную f

    Можно также передать ссылку на функцию в качестве параметра другой функции. Функции, передаваемые по ссылке, обычно называются функциями обратного вызова:

def  summa(x, у): 
    return x  +  у
def  func(f, a, b):
    """ Через переменную f будет доступна ссылка на
        функцию summa() """
    return f (a, b) # Вызываем функцию summa ()

# Передаем ссылку на функцию в качестве параметра
v = func(summa, 10, 20)

    Объекты функций поддерживают множество атрибутов, обратиться к которым можно, указав атрибут после названия функции через точку. Например, через атрибут __name__ можно получить название функции в виде строки, через атрибут __doc__ - строку документирования и т. д. Для примера выведем названия всех атрибутов функции с помощью встроенной функции dir():

>>> def summa(x, y) :
	""" Суммирование двух чисел """
               return x + y

>>> dir (summa)
['__annotations__', '__call__', '__class__', '__closure__', '__code__', 
'__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', 
'__format__', '__ge__', '__get__', '__getattribute__', '__globals__', 
'__gt__', '__hash__', '__init__', '__kwdefaults__', '__le__', '__lt__', 
'__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', 
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', 
'__subclasshook__']
>>> summa.__code__.co_varnames
('x', 'y')
>>> summa.__doc__
' Суммирование двух чисел '

    На следующем шаге мы рассмотрим расположение определений функций.




Предыдущий шаг Содержание Следующий шаг