На прошлом занятии

  • Запись файлов

План этого занятия

  • Функции: начало

Функции

Часто бывает удобно один раз написать логически завершённый блок кода и при необходимости запускать его, а не копировать многократно.

Оформляется блок функции так:

def say_hello():
    print('Hello!')

Здесь: def — ключевое слово (сокр. define); say_hello — название функции; содержимое блока (в данном случае один вызов print()) — со стандартным отступом.

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

>>> say_hello()
'Hello!'

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

def say_hello(username, age):
    if len(username) > 0:
        print('Hello, ' + username)
    else:
        print('No username given...')
    if age > 0:
        print('age =', age)

Имена переменных, объявленные внутри функции, не будут видны в остальной программе. x в функции и x в остальной программе — это разные переменные.

Вызовем эту функцию дважды:

>>> say_hello("Vasya", 42)
Hello, Vasya
age = 42
>>> say_hello("", 8)
No usename given...
age = 8

Функции также могут возвращать результат выполненных операций с помощью оператора return:

def choose_max(a, b):
    if a > b:
        return a
    else:
        return b

Найдём максимальное из двух чисел:

>>> max_five_three = choose_max(5, 3)
>>> print(choose_max(13, 14))
14

return прекращает выполнения функции

def say_hello():
    print('Hello!')

Теперь все программы должны быть написаны так, чтобы код разбивался по функциям. Функции должны быть не длиннее примерно 10 строк. В практике написания кода на питоне принято, чтобы сначала определялись все функции, а потом последовательно вызывались внутри одной - главной - функции, которую обычно называют main()

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

if __name__ == '__main__':
    main()

Пример программы

Ниже представлена пример того, как обычно структурированы программы на питоне:

"""Простая программа-калькулятор"""


OPERATORS = ['+', '-', '*', '/']
OPS_STR = ', '.join(OPERATORS)


def get_number(nonzero):
    """Запросить у пользователя число и вернуть его

    nonzero : аргумент типа bool, если False то не проверять является ли число
        нулём, в обратном случае спрашивать до тех пор, пока не будет введено
        отличное от нуля число
    """
    x = float(input('Введите число: '))
    if not nonzero:
        return x
    while x == 0:
        x = float(input('На ноль делить нельзя, введите другое число: '))
    return x


def get_operator():
    """Запросить у пользователя оператор

    Спрашивает у пользователя оператор до тех пор, пока не будет введён один из
    поддерживаемых программой
    """
    while True:
        x = input('Введите оператор: ')
        if x in OPERATORS:
            return x
        print(x, ' - не оператор, выберите из списка:', OPS_STR)


def main():
    a = get_number(False)
    op = get_operator()
    b = get_number(True)
    print(a, op, b, '=', end=' ')
    if op == '+':
        print(a + b)
    elif op == '-':
        print(a - b)
    elif op == '*':
        print(a * b)
    else:
        # op == '/'
        print(a / b)


if __name__ == '__main__':
    main()

Домашнее задание

Вам нужно написать программу-гадалку. В этом задании вам нужно использовать в качестве основы файлы из специального репозитория. Файл book.txt содержит текст книги, а в fortuneteller.py написан скелет кода, который вам нужно дописать. Весь код, кроме уже написанного блока if __name__ == '__main__':, должен быть в функциях.

Программа предлагает пользователю ввести вопрос и переспрашивает до тех пока не будет введён текст, завершающийся знаком вопроса. Затем методом, зависящим от вашего варианта, выбирается ответ. Ответ нужно вывести вместе с красивой фразой, в духе «В своём хрустальном шаре я вижу ответ на твой вопрос: “огурец”»

  1. Пусть суммарное число букв «а» и «к» в вопросе равно c, число слов в нём — w, а x = c*w. Найдите в тексте x-ое с конца слово и используйте его в качестве ответа. Если x слишком большой, выдайте второе слово текста. Нумерация с нуля.

  2. Пусть число слов равно w. Начиная со строки под номером w (нумерация с нуля) найдите первое слово длинной хотя бы два символа, которое начинается с заглавной буквы. Выдайте это слово в качестве ответа. Если w слишком велико, то в качестве ответа используйте слово «начало».

  3. Пусть длина последнего слова вопроса равна c, а число строк в тексте, начинающихся с кавычки " равно n. Найдите в тексте c % n + 1 строку, начинающуюся с символа " (нумерация с нуля) и используйте её в качестве ответа.

  4. Пусть вопрос состоит из w слов, самое длинное слово в нём — из c букв. В качестве ответа выдайте первое слово из строки под номером w * c (нумерация с нуля). Если номер слишком большой, то в качестве ответа выдайте слово «джакузи».

  5. Разбейте вопрос на слова и проверьте, встречаются ли они в тексте. Если в тексте встречается хотя бы два из слов вопроса, то ответьте «да», если ровно одно слово, то ответьте «может быть», а если ни одного, то ответьте «нет». Строчные и заглавные буквы считать одинаковыми. Проверять уникальность слов вопроса не нужно.

  6. В качестве ответа на вопрос выведите последнее слово текста, начинающееся на ту же букву, что и вопрос. Строчные и заглавные буквы считать одинаковыми. Если вы не смогли найти такое слово, в качестве ответа используйте строку «42».

  7. Пусть число символов в вопросе равно c, а число строк в книге равно n. В качестве ответа выдайте самое длинное слово из строки под номером c % n (нумерация с нуля).

Выполните задание пройдя по ссылке в GitHub Classroom:


Улучшить эту страницу