Курс: Python

Лекция: Функции

Именные функции, инструкция def

Функция в python - объект, принимающий аргументы и возвращающий значение. Обычно функция определяется с помощью инструкции def. Определим простейшую функцию:

def add(x, y):
    return x + y
print(add(5,5)) # 10
print(add('мя','со')) # мясо

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

def foo(t):
    def moo1(x):
        return (x**2)
    def moo2(x):
        return (x*2)
    if (t>1):
        return moo1
    else:
        return moo2
boo = foo(2)
print (boo(7))

Аргументы функции

Функция может и не заканчиваться инструкцией return, при этом функция вернет значение None.

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

def func(a, b, c=2): # c - необязательный аргумент
    return a + b + c
print(func(1, 2))  # a = 1, b = 2, c = 2 (по умолчанию), вернет 5
print(func(1, 2, 3))  # a = 1, b = 2, c = 3, вернет 6
print(func(a=1, b=3))  # a = 1, b = 3, c = 2 вернет 6
print(func(a=3, c=6))  # a = 3, c = 6, b не определен вызовет ошибку

Задание 3.1. Дружные несчастные

Назовем автобусный билет несчастливым, если сумма цифр его шестизначного номера делится на 13. Могут ли два идущих подряд билета оказаться несчастливыми?

Локальные переменные

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

Чтобы присвоить некоторое значение переменной, определённой на высшем уровне программы (т.е. не в какой-либо области видимости, как то функции или классы), необходимо указать Python, что её имя не локально, а глобально. Сделаем это при помощи зарезервированного слова global. Без применения зарезервированного слова globalневозможно присвоить значение переменной, определённой за пределами функции.

Можно использовать уже существующие значения переменных, определённых за пределами функции (при условии, что внутри функции не было объявлено переменной с таким же именем). Однако, это не приветствуется, и его следует избегать, поскольку человеку, читающему текст программы, будет непонятно, где находится объявление переменной. Использование зарезервированного слова global достаточно ясно показывает, что переменная объявлена в самом внешнем блоке.

x = 50
def func():
    global x
    print('x равно', x)
    x = 2
    print('Заменяем глобальное значение x на', x)
func()
print('Значение x составляет', x)

Мы увидели, как получать доступ к переменным в локальной и глобальной области видимости. Есть ещё один тип области видимости, называемый "нелокальной" (nonlocal) областью видимости, который представляет собой нечто среднее между первыми двумя. Нелокальные области видимости встречаются, когда вы определяете функции внутри функций. Поскольку в Python всё является выполнимым кодом, вы можете определять функции где угодно.

def func_outer():
    x = 2
    print('x равно', x)

    def func_inner():
        nonlocal x
        x = 5

    func_inner()
    print('Локальное x сменилось на', x)

func_outer()

Задание 3.2. Римский ужас

Пользователь вводит римское число меньше 500. Нужно вывести его привычное десятичное представление.

Переменное число параметров

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

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)

total(10,1,2,3,Jack=1123,John=2231,Inge=1560)

программа выведет:

a 10
single_item 1
single_item 2
single_item 3
Inge 1560
John 2231
Jack 1123

Строки документации

Python имеет остроумную особенность, называемую строками документации, обычно обозначаемую сокращённо docstrings. Это очень важный инструмент, которым вы обязательно должны пользоваться, поскольку он помогает лучше документировать программу и облегчает её понимание. Поразительно, но строку документации можно получить, например, из функции, даже во время выполнения программы!

def printMax(x, y):
    '''Выводит максимальное из двух чисел.

       Оба значения должны быть целыми числами.'''
    x = int(x) # конвертируем в целые, если возможно
    y = int(y)

    if x > y:
        print(x, 'наибольшее')
    else:
        print(y, 'наибольшее')

printMax(3, 5)
print(printMax.__doc__)

Анонимные функции, инструкция lambda

Анонимные функции могут содержать лишь одно выражение, но и выполняются они быстрее. Анонимные функции создаются с помощью инструкции lambda. Кроме этого, их не обязательно присваивать переменной, как делали мы инструкцией def func():

func = lambda x, y: x + y
print( func(1, 2) ) # выведет 3
print( func('a', 'b') ) # выведет 'ab'
print( (lambda x, y: x + y)(1, 2) ) # выведет 3
print( (lambda x, y: x + y)('a', 'b') ) # выведет 'ab'

Задание 3.3. Сумма убывающих чисел

Для любого целого числа введем понимание "убывающей пары" - числа в котором цифры отсортированы в порядке убывания. Например, для числа 71801 убывающей парой будет 87110. Нужно запросить у пользователя два целых числа, определяющих диапазон, и вывести сумму "убывающих пар" для этих чисел в диапазоне.

Задание 3.4. Единицы измерения

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

print(MyF(12,'штука')) #12 штук
print(MyF(152,'нога')) #152 ноги
print(MyF(0,'рубль')) #0 рублей

Задание 3.5. Симметричная троичная система счисления

В симметричной троичной системе счисления имеется три цифры: -1,0,1. Для упрощеня будем отображат их знаками{-,0,+}. Основание системы равно 3 и преобразование в десятичную систему счисления происходит по простому правилу: нужно взять сумму цифр умноженных на степень основания позиции.

-0+ = -1*32+0*31+1*30 = -9+0+1 = -8

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

Таблица для проверки результатов:

DTDT
-5-++4++
-4--5+--
-3-06+-0
-2-+7+-+
-1-8+0-
009+00
1+10+0+
2+-11++-
3+012++0