Skip to content

Latest commit

 

History

History
255 lines (159 loc) · 13.2 KB

File metadata and controls

255 lines (159 loc) · 13.2 KB

Урок 5. Все о функциях

Терминология на урок:

Функцией называется отдельный блок программы. У него может быть имя, он может принимать аргументы, с которыми потом будет работать, и может возвращать результат своей работы.

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

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

Литерал - фактическое значение, которое записывается в переменную или передается в функцию. К примеру, в записи x = 1 литералом является 1.

Функции

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

Создание, объявление функции (function declaration )

В Python функция определяется или декларируется так:

def say_hello():
    return "Hello"

Важнейшие элементы функции:

  • Ключевое слово def говорит о том, что дальше будет функция.
  • После def следует название функции, приведенная выше называется say_hello.
  • Затем следуют скобки с параметрами функции.
  • После закрывающей скобки идет двоеточие. Как мы знаем, двоеточие в Python обозначает, что далее будет некий блок кода, выделенный отступами. В случае с условием это блок условия, тело условия, в случае с циклом - тело цикла, в случае с функцией - тело функции или код функции.
  • Ключевое слово return используется в теле функции для того, чтобы завершить работу функции и вернуть ее результат. Если не написать return, функция вернет None. Хорошим тоном считается возвращать какое-нибудь значение явно.
  • Результат работы функции - результат выполнения функции, который она возвращает. В приведенном примере результатом работы функции будет строка "Hello", из функции она вернется благодаря ключевому слову return

В Python принято тело функции, как и тело любого блока, выделять отступом в 4 пробела.

Все, что мы обсуждаем - только лишь создание функции, но не использование ее. Для использования функции ее необходимо вызвать.

Вызов функции (call function)

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

Вызовем нашу функцию: say_hello()

Если просто написать функцию и вызвать ее, мы не увидим возвращаемый результат. Он вернется, но после этого потеряется. Для того, чтобы этот результат не потерять, его нужно передать в работу другой функции, сохранить в переменную или любым другим образом поймать обработать. К примеру, поместим ее в функцию print в качестве аргумента:

print(say_hello()) # Hello

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

Функции так же могут принимать параметры:

def plus(num1, num2):
    result = num1 + num2
    return result

Здесь num1 и num2 - параметры функции plus.

Аргументы или парметры?

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

В Python, если вы декларируете параметры, то вы обязаны их туда передать, иначе получите ошибку. Вызовем нашу функцию plus с двумя числами-аргументами - 10 и 5:

ten = 10
five = 5

plus(ten, five)
# функция вывела 15

plus(10, 5)
# функция вывела 15

В момент выполнения функции параметры num1 и num2 примут значения 10 и 5 соостветственно.

Так же в python можно передавать аргументы не по порядку, но с явным указанием аргумента и соответствию аргумента передаваемому значению

plus(num1=10, num2=5)

plus(num2=5, num1=10)

Как видно из примера выше, аргументы можно передавать и в переменных, и литералами.

Виды параметров функции

def func(positional, keyword=value, *args, **kwargs)
    pass

В Python можно различить 4 вида параметров у функции:

  1. Позиционные аргументы обязательны и не имеют значений по умолчанию.
  2. Аргументы с ключевым словом необязательны и имеют значения по умолчанию.
  3. Список с произвольным количеством аргументов необязателен и не имеет значений по умолчанию.
  4. Словарь с произвольным количеством аргументов с ключевым словом необязателен и не имеет значений по умолчанию.
def test(a, b=10, *c, **d):
    summa = a + b
    if c:
        summa += sum(c)
    if d:
        summa += sum(d.values())
    
    return summa


print(test(15))             # 25
print(test(15, 5))          # 20
print(test(15, 5, 1, 2, 3))     # 26
print(test(15, 5, 1, 2, 3, x=10, y=20)) # 56

Функция как тип данных

Все в Python является объектом. Функции не выделяются и тоже являются объектами. Как и любые други типы данных, функции можно хранить в переменных, передавать параметрами в другие функции и хранить в словарях, списках и кортежах:

Пример передачи функции в качестве параметра:

def run_operation(num1, num2, operation):
    return operation(num1, num2)

def plus(num1, num2):
    return num1 + num2

minus = lambda num1, num2: num1 - num2

run_operation(10, 5, plus)  # 15
run_operation(10, 5, minus) # 5

Хранение функции в словаре:

functions_dict = {
    'plus': plus,
    'minus': minus
}

def operation(num1, num2, func_dict, func_name):
    return func_dict[func_name](num1, num2)

operation(2, 3, function_dict, 'plus')

Лямбда выражения

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

Синтаксис у них следующий: ключевое слово lambda, затем перечень параметров, затем двоеточие - и в той же строке выражение, аналогичное выражению после ключевого слова return в обычной однострочной функции: lambda arguments : expression

Примеры:

lambda age: 'Senior' if age > 55 else 'Adult'

(lambda x, y: x + y)(2, 3)

Функции высшего порядка на примере Map, Filter, Reduce

Функция map принимает два параметра: функцию и итератор, например, список.

map применяет к каждому элементу списка переданную функцию.

string_numbers = ['1', '2', '3', '4', '5']
new_list = list(map(int, string_numbers))
print(new_list)
#  [1, 2, 3, 4, 5, 6, 7]

Еще один пример:

def my_square(num):
    return num ** 2

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

squared_numbers = list(map(my_square, numbers))

print(squared_numbers)

# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

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

Функция filter принимает два аргумента: какой функцией фильтровать итератор и сам итератор. Функция должна возвращать True или False. При помощи функции из первого параметра filter создает ленивый итератор из тех значений входящего итератора, которые прошли проверку. В примере ниже провкерку пройдут только нечетные числа:

filter(lambda x: x % 2, range(10))

Функция reduce при помощи первого параметра - функции сводит второй параметр - итератор к одному значению. Для применения функции нужно подключать библиотеку functools. Пример:

functools.reduce(lambda x, y: x+y, list_of_numbers)

Практика

Задание 1

Написать 2 функции. Первая функция будет принимать строку и приводить ее к нижнему регистру.

Вторая функция будет принимать строку и проводить ее к верхнему регистру.

После чего с помощью map применить ваши функции к списку строк. Отдельно каждую функцию к отдельному списку строк!

Задание 2

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

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

Задание 3

Вспоминаем работу с файлом. Есть файл, в котором много англоязычных текстовых строк. Считаем частоту встретившихся слов в файле, но через функции и map, без единого цикла!

Ссылки

ZIP

Map, Zip, Lambda

Lambda article

Домашка

Следующий урок