Следующая тема: БРу. Словари

Вернуться в раздел: Базовый Python

Вернуться в оглавление: Я.Практикум

7. Функции.

 7.1 Введение

 7.2 Функции и высокая кухня

 7.3 Собственные функции

 7.4 Неповторимый код

 7.5 В поисках смысла

 7.6 Параметры: значения по умолчанию

Задача 1

Напишите функцию filter_by_year с двумя параметрами: data: список списков с данными о фильме; year: целое число, по умолчанию — 1990. Функция возвращает данные о фильмах, которые вышли после года year.

# функция печати таблицы, принимает на вход список списков, ничего не возвращает (неявно возвращается None)
def print_movie_table(data):
    for movie in data:
        for elem in movie:
            print(f'{elem:<45}', end='')
        print()


# определите функцию filter_by_year здесь

def filter_by_year(data, year=1990):
    data = []
    for movies in movies_table:
        if movies[2] > year:
            data.append(movies)
    return data


# название, страна, год, жанр, продолжительность (мин.), рейтинг "Кинопоиска" 
movies_table = [
    ['Побег из Шоушенка', 'США', 1994, 'драма', 142, 9.111],
    ['Крёстный отец', 'США', 1972, 'драма, криминал', 175, 8.730],
    ['Тёмный рыцарь', 'США', 2008, 'фантастика, боевик, триллер', 152, 8.499],
    ['Список Шиндлера', 'США', 1993, 'драма', 195, 8.818],
    ['Властелин колец: Возвращение Короля', 'Новая Зеландия', 2003, 'фэнтези, приключения, драма', 201, 8.625],
    ['Криминальное чтиво', 'США', 1994, 'триллер, комедия, криминал', 154, 8.619],
    ['Хороший, плохой, злой', 'Италия', 1966, 'вестерн', 178, 8.521],
    ['Бойцовский клуб', 'США', 1999, 'триллер, драма, криминал', 139, 8.644],
    ['Харакири', 'Япония', 1962, 'драма, боевик, история', 133, 8.106],
    ['Сталкер', 'СССР', 1979, 'фантастика, драма, детектив', 163, 8.083],
    ['Иди и смотри', 'СССР', 1985, 'драма, военный', 136, 8.094],
    ['Один дома', 'США', 1990, 'комедия, семейный', 103, 8.305]
]

movies_table_filtered = filter_by_year(movies_table)
print_movie_table(movies_table_filtered)

Задача 2

Напишите функцию filter_by_genre, которая принимает два аргумента:
data: список списков с информацией о фильмах;
genre: название жанра, по умолчанию — 'драма'.
Функция возвращает данные о фильмах в жанре 'драма'. Если жанров несколько — 'драма' будет среди них.

# функция печати таблицы, принимает на вход список списков, ничего не возвращает (неявно возвращается None)
def print_movie_table(data):
    for movie in data:
        for elem in movie:
            print(f'{elem:<45}', end='')
        print()


# определите функцию filter_by_genre здесь
def filter_by_genre(data, genre='драма'):
    filtered_data = []
    for row in data:
        if genre in row[3]:
            filtered_data.append(row) 
    return filtered_data

movies_table = [
    ['Побег из Шоушенка', 'США', 1994, 'драма', 142, 9.111],
    ['Крёстный отец', 'США', 1972, 'драма, криминал', 175, 8.730],
    ['Тёмный рыцарь', 'США', 2008, 'фантастика, боевик, триллер', 152, 8.499],
    ['Список Шиндлера', 'США', 1993, 'драма', 195, 8.818],
    ['Властелин колец: Возвращение Короля', 'Новая Зеландия', 2003, 'фэнтези, приключения, драма', 201, 8.625],
    ['Криминальное чтиво', 'США', 1994, 'триллер, комедия, криминал', 154, 8.619],
    ['Хороший, плохой, злой', 'Италия', 1966, 'вестерн', 178, 8.521],
    ['Бойцовский клуб', 'США', 1999, 'триллер, драма, криминал', 139, 8.644],
    ['Харакири', 'Япония', 1962, 'драма, боевик, история', 133, 8.106],
    ['Сталкер', 'СССР', 1979, 'фантастика, драма, детектив', 163, 8.083],
    ['Иди и смотри', 'СССР', 1985, 'драма, военный', 136, 8.094]
]

movies_table_filtered = filter_by_genre(movies_table)
print_movie_table(movies_table_filtered)

 7.7 Позиционные и именованные аргументы

 7.8 Результаты по ту сторону функции

 7.9 Лаборатория функций

  1. Определите функцию find_rect_square(side1, side2), которая: принимает в виде аргументов два целых числа — стороны прямоугольника; возвращает их произведение — площадь фигуры.
def find_rect_square(side1, side2):
    # напишите тело функции
    square = side1 * side2
    return square

print(find_rect_square(10, 12))
  1. Напишите функцию-предикат is_speed_ok для датчика превышения скорости. Она должна быть предикатом, который принимает аргумент со скоростью — speed. Если его значение меньше или равно 60, функция вернёт True, иначе — False. Постарайтесь использовать логическое выражение после ключевого слова return. Вспомните, что логические условия вроде a < 1 уже возвращают True или False и использование условного оператора здесь не требуется.
# определите функцию здесь
def is_speed_ok(speed):
    return speed<=60
        
current_speed = 46
print(is_speed_ok(current_speed))
current_speed = 70
print(is_speed_ok(current_speed))
current_speed = 60
print(is_speed_ok(current_speed))
  1. Напишите функцию get_hours_and_minutes(), которая принимает аргумент со строкой — временем в формате 'hh:mm'. C помощью метода split() и функции int() разбейте аргумент на два целых числа: часы и минуты. Верните их в том же порядке. Вспомните, что из функций можно возвращать более одного значения: нужно просто перечислить их через запятую после ключевого слова return.
def get_hours_and_minutes(time_string):
    #напишите ваш код здесь
    time_list = time_string.split(':')
    hh = int(time_list[0])
    mm = int(time_list[1]) 
    return hh, mm

time_str = '12:35'
hours, minutes = get_hours_and_minutes(time_str)
print(hours, minutes)
  1. На одной радиостанции ставят только песни короче 210 секунд. Напишите функцию-предикат check_song_duration(), которая: принимает аргумент-строку с длительностью трека в формате mm:ss; возвращает True, если длительность меньше 210 секунд. Иначе возвращает False. Внутри своей функции вызовите get_minutes_and_seconds(), чтобы извлечь количество минут и секунд из строки.
def get_minutes_and_seconds(time_string):
    time_list = time_string.split(':')
    m = int(time_list[0])
    s = int(time_list[1])
    return m, s


def check_song_duration(time_string):
    #напишите ваш код здесь
    m,s = get_minutes_and_seconds(time_string)
    return (m*60+s) < 210


print(check_song_duration('4:35'))
print(check_song_duration('2:10'))
  1. Создайте цикл, который проверит длительность треков из списка tracks. Цикл должен вывести на экран результат работы функции check_song_duration() для каждого элемента списка. Каждое значение выводите на новой строке.
def get_minutes_and_seconds(time_string):
    time_list = time_string.split(':')
    m = int(time_list[0])
    s = int(time_list[1])
    return m, s


def check_song_duration(time_string):
    minutes, seconds = get_minutes_and_seconds(time_string)
    seconds = minutes * 60 + seconds
    return seconds <= 210


tracks = ['2:25', '2:35', '3:45', '2:00', '5:10']

#напишите ваш код здесь
for row in tracks:
    print (check_song_duration(row))

 7.10 Заключение

В этой теме вы научились структурировать код с помощью собственных функций. Вы узнали, что: Функции позволяют выделить набор команд в отдельный именованный блок. Благодаря этому код можно переиспользовать несколько раз. У функций есть имя и внутренние переменные — параметры. При вызове функции передают значения — аргументы. В Python есть встроенные функции для распространённых задач, например sum() для расчёта суммы. Чтобы ничего не забыть, скачайте шпаргалку темы.

 7.11 Проверочные задания. Функции

Проверочные задания. Функции Чтобы пройти тест нужно правильно ответить на 5 вопросов из 10. Время на прохождение: 10 минут

Задание 1 из 10
С какого ключевого слова начинается объявление функции в Python?

Правильный ответ def

Ключевые слова приходится запоминать. Функцию начинают с def — так задают её заголовок. Ключевое слово return пишут в конце. Оно указывает на значение, которое вернёт функция.

Задание 2 из 10

Какой регистр лучше использовать для имени функции?

Правильный ответ “snake_case”

Как и в случае с переменными, имена функций лучше писать в «змеином регистре». Представьте, что вы работаете с кодом, который написали месяц назад. Вряд ли получится сразу вспомнить, как вы называли функции: имяФункции или ИмяФункции. Таких проблем не возникнет, если использовать только строчные буквы. Вы правильно вызовете все функции с первого раза.

Задание 3 из 10

Выберите все верные утверждения.

Правильный ответ Код с функциями проще редактировать.

Правильный ответ Функции позволяют переиспользовать код.

Правильный ответ В теле функции можно использовать другие функции.

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

Задание 4 из 10

Как называются значения, которые указывают при вызове функции?

Правильный ответ Аргументы

Такие значения называют аргументами. Их может быть несколько — это зависит от функции. Некоторые функции можно вызвать даже без аргумента. В уроке о параметрах был пример с print(). Но не с каждой функцией это сработает.

Задание 5 из 10

Как называются входные значения функции, которые указывают при её объявлении?

Правильный ответ Параметры

Может показаться, что термины — это условность. Бывает, что понятия «аргумент» и «параметр» путают и заменяют одно другим. Но знание терминологии вам пригодится: поможет разобраться в документации или чужом коде.

Задание 6 из 10

Функцию можно создать и без ключевого слова return. Какое значение вернёт такая функция?

Правильный ответ None

'' Казалось бы, какая разница, что писать в функции: print('Hello world') или return 'Hello world'. Обе функции напечатают строку 'Hello world'. Но если попытаться использовать результат функции с print(), код выдаст ошибку. Результатом такой функции всё равно будет None.

Задание 7 из 10

В каком месте программы можно обратиться к переменной just_number? def increment_number(number): just_number = 777 return number + 1

Правильный ответ Только в теле функции increment_number()

Переменная just_number — локальная. Она объявлена в теле функции и за её пределами неизвестна. То же самое с переменной number — обратиться к ней вне функции не получится. Чтобы получить результат, функцию нужно вызвать.

Задание 8 из 10

Что вернёт функция greeting? def greeting(): return 'Добро пожаловать!' print('Пожалуйста, подождите немного....')

Правильный ответ Добро пожаловать!

Ключевое слово return сработает раньше, чем функция print(), и остановит выполнение функции. После этого ключевого слова Python сразу завершает работу функции и выводит значение. Даже в том случае, если ключевое слово return встречается в теле функции несколько раз.

Задание 9 из 10

Что произойдёт, если вызвать функцию subtraction? def subtraction(minuend, subtrahend): result = minuend - subtrahend print(result)

Правильный ответ Произойдёт ошибка

Позиционные и именованные аргументы можно сочетать. Но не забудьте, что позиционный аргумент указывают первым. За ним следует именованный аргумент. Поэтому правильный вызов функции выглядит так: subtraction(5, subtrahend=6).

Задание 10 из 10

Сопоставьте вызовы функции send_message() и возвращаемые значения.

def send_message(text, source='email'):

    if source == 'email':

        return 'Message sent via email'

    elif source == 'sms':

        return 'Message sent via sms' else:

    return 'Unknown source'

send_message('Hello')

Message sent via email send_message('Hello', 'sms')

Message sent via sms send_message('Hello', 'email')

Message sent via email send_message('Hello', 'whatsapp') Unknown source

У функции send_message() два параметра. Но у параметра source указано значение по умолчанию. Значит, если вызвать функцию с одним аргументом, ошибки не произойдёт. Вместо этого функция вернёт Message sent via email. Вызов функции с аргументом whatsapp тоже не вернёт ошибки — этот случай предусмотрен третьей веткой условия.

Следующая тема: БРу. Словари

Вернуться в раздел: Базовый Python

Вернуться в оглавление: Я.Практикум