Функции

Функции – это многократно используемые фрагменты программы. Они позволяют дать имя определенному блоку команд для того, чтобы выполнять этот блок по указанному имени в любом месте программы и сколь угодно много раз. Это называется вызовом функции. Мы уже использовали встроенные функции: print, input, len, range;

Пример:

def say_hello():
    print('Hello')

say_hello()  # вызов функции
say_hello()  # ещё один вызов функции

Параметры функций

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

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

Пример:

def print_max(a, b):
    if a > b:
        print(a, 'максимально')
    elif a == b:
        print(a, 'равно', b)
    else:
        print(b, 'максимально')

print_max(3, 4)  # прямая передача значений

x = 5
y = 7

print_max(x, y)  # передача переменных в качестве аргументов

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

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

Пример:

x = 50

def func(x):
    print('x равен', x)
    x = 2
    print('Замена локального x на', x)

func(x)
print('x по-прежнему', x)

Значения аргументов по умолчанию

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

Обратите внимание, что значение по умолчанию должно быть неизменным.

Пример:

def say(message, times=1):
    print(message * times)

say('Hello')
say('World', 5)

Ключевые аргументы

Если имеется некоторая функция с большим числом параметров, и при её вызове требуется указать только некоторые из них, значения этих параметров могут задаваться по их имени – это называется ключевые параметры. В этом случае для передачи аргументов функции используется имя (ключ) вместо позиции (как было до сих пор).

Пример:

def func(a, b=5, c=10):
    print('a равно', a, ', b равно', b, ', а c равно', c)

func(3, 7)
func(25, c=24)
func(c=50, a=100)

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

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

def mysum(*numbers):
    s = 0
    for n in numbers:
        s += n

    print(f'sum = {s}')

mysum(1)
mysum(1, 2, 3)

Оператор return

Оператор return используется для возврата из функции, т.е. для прекращения её работы и выхода из неё. При этом можно также вернуть некоторое значение из функции:

def maximum(x, y):
    if x > y:
        return x
    elif x == y:
        return 'Числа равны.'
    else:
        return y

print(maximum(2, 3))

Из функции можно вернуть только одно значение. Если все-таки необходимо вернуть несколько значений, то для этого можно использовать кортеж:

def div_mod(a, b):
    return a // b, a % b

r1 = div_mod(11, 2)  # r1 - кортеж (5, 1)
d, m = div_mod(11, 2)  # деструктурирование кортежа

Задачи

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

assert add(40, 2) == 42
assert add(0, -1) == -1

то ваш файл с исходным кодом должен выглядеть так:

def add(a, b):
    return a + b


assert add(40, 2) == 42
assert add(0, -1) == -1
  1. Прочитайте документацию на функцию print: https://docs.python.org/3/library/functions.html#print

    Расскажите о назначении каждого параметра.

  2. Реализовать функцию is_sorted. Функция принимает на вход список и возвращает True, если элементы в нем упорядочены по возрастанию.

    assert is_sorted([]) == True
    assert is_sorted([42]) == True
    assert is_sorted([3, 14, 15, 92]) == True
    assert is_sorted([1, 1, 1]) == True
    assert is_sorted([1, 1, 2, 2, 3, 3, 3]) == True
    assert is_sorted([2, 1]) == False
    assert is_sorted([1, 2, 1]) == False
    
  3. Реализовать функцию find_longest. Функция принимает на вход список строк и возвращает строку с максимальной длиной. Если таких строк несколько, то возвращает первую из них.

    assert find_longest([]) == None
    assert find_longest([""]) == ""
    assert find_longest(["42"]) == "42"
    assert find_longest(["uno", "dos", "tre"]) == "uno"
    assert find_longest(["a", "bb", "ccc"]) == "ccc"
    assert find_longest(["a", "ccc", "bb"]) == "ccc"
    
  4. Реализовать функцию min_max. Функция принимает на вход список чисел и возвращает пару: минимальное и максимальное число. Алгоритм должен выполнять не более одного прохода по списку.

    assert min_max([]) == (None, None)
    assert min_max([1]) == (1, 1)
    assert min_max([1, 1]) == (1, 1)
    assert min_max([1, 2]) == (1, 2)
    assert min_max([2, 1]) == (1, 2)
    assert min_max([14, 3, 14, 92, 15]) == (3, 92)
    
  5. Реализовать функцию zip_longest_sum. Функция принимает на вход два списка и возвращает новый список, полученный сложением соответствующих элементов входных списков.

    assert zip_sum_longest([], []) == []
    assert zip_sum_longest([1], []) == [1]
    assert zip_sum_longest([], [1]) == [1]
    assert zip_sum_longest([1], [2]) == [3]
    assert zip_sum_longest([1], [2, 1]) == [3, 1]
    assert zip_sum_longest([2, 1], [1]) == [3, 1]
    
  6. Реализовать функцию is_prime. Функция принимает на вход целое число и возвращает True, если число простое. Простым называется число, которое делится без остатка только на 1 и на себя.

    assert is_prime(5) == True
    assert is_prime(113) == True
    assert is_prime(12) == False
    
  7. Реализовать функцию join. Функция принимает разделитель и список строк, возвращает строку, в которой элементы списка чередуются с разделителем.

    assert join(' ', []) == ''
    assert join(', ', ['one']) == 'one'
    assert join(', ', ['one', 'two', 'three']) == 'one, two, three'