Функции

Удобство: форматные строки

   1 a, b, c = 3, 4, 5
   2 print("a=", a, ", b=", b, ", c=", c, "; ", "a+b+c=", a+b+c, sep="")
   3 print(f"a={a}, b={b}, c={c}; a+b+c={a+b+c}")
   4 print(f"{a=}, {b=}, {c=}; {a+b+c=}")

Проблема повторного использования

Пример: сумма площадей двух треугольников по их сторонам.

Функция

Именованная запись алгоритма с параметрами и результатом:

   1 def функция(параметры):
   2     тело

Функция обычно возвращает результат, который можно использовать в выражениях. Результат возвращается из функции немедленно при выполнении оператора return в теле функции.

Вычислить площадь треугольника по трём сторонам, а если треугольника не существует, то вернуть 0

TODO

Именование параметров

Пример

Правило поиска имён внутри функции

  1. В локальном пространстве
  2. Если это имя не найдено, и не участвует в связывании (в функции не написано имя = что-то) — в глобальном

    • (Иначе — только в локальном). Например, c в примере

Пример с площадями треугольников

Duck typing

Собственно duck typing, она же утиная типизация, она же неявная динамическая типизация:

Пример:

   1 >>> def fun(a, b):
   2 ...     return a * 2 + b
   3 ...
   4 >>> fun(3, 4)
   5 10
   6 >>> fun("QWE", "xxcv")
   7 'QWEQWExxcv'
   8 >>> fun((1, 2, "QQ"), ((6, 7), "ZZ"))
   9 (1, 2, 'QQ', 1, 2, 'QQ', (6, 7), 'ZZ')
  10 >>> fun(23, "QW")
  11 Traceback (most recent call last):
  12   File "<stdin>", line 1, in <module>
  13   File "<stdin>", line 2, in fun
  14 TypeError: unsupported operand type(s) for +: 'int' and 'str'

Именные параметры и умолчания

Параметрам можно задать значения по умолчанию, тогда они становятся необязательными:

   1 def fun(x, a=2, b=2, c=1):
   2     print(f"\tDebug: {x=}, {a=}, {b=}, {c=}")
   3     return x * x * a - 4 * x * b + c
   4 
   5 print(fun(5, 4, 3, 2))
   6 print(fun(5, 4, 3, 2))
   7 print(fun(5))
   8 print(fun(5, 8, 9))
   9 print(fun(5, b=7))
  10 print(fun(5, c=7, a=1))

Функции как объекты

Введение в Tkinter

Принципы работы:

  1. Сначала открывается главное окно приложения — window = tkinter.Tk()

  2. Все элементы приложения — виджеты — располагаются в этом окне или друг в друге. При создании виджета его хозяин указывается первым параметром — L = tkinter.Label(window, другие_параметры…)

  3. Элементы приложения не отобразятся, пока их не разместили явно внутри хозяина в воображаемой прямоугольной сетке с помощью метода .grid()L.grid(column=0, row=0)

    • Параметры grid() необязательны

    • Вдобавок к явному указанию строки и столбца, есть columnspan=сколько-то и rowspan=сколько-то в случае, если виджет должен занимать более одного столбца и/или строки

    • Есть ещё всякое управление геометрией (например, резиновые столбцы с коэффициентом растяжения)
  4. Различные свойства элементов (например, надпись) можно задать тремя способами
    • При создании элемента — L = tkinter.Label(window, text="Надпись")

    • После создания элемента с помощью метода .configure()L.configure(text = "Надпись")

    • С помощью операции индексирования: L["text"] = "надпись"

  5. Для полноценного запуска приложения в конце программы должен стоять вызов метода .mainloop() из основного окна — window.mainloop()

У разных виджетов есть ещё разные свойства (например, .get() у tkinter.Entry или действие command для tkinter.Button

Пример: приложение с кнопкой, полем ввода и надписью, которое выводит на терминал содержимое поля ввода и надписи при нажатии на кнопку:

   1 import tkinter
   2 
   3 def showit():
   4     print(label["text"], entry.get())
   5 
   6 app = tkinter.Tk()
   7 app.title("Введите!")
   8 label = tkinter.Label(app, text="Введите что-то:")
   9 label.grid()
  10 entry = tkinter.Entry(app)
  11 entry.grid()
  12 button = tkinter.Button(app, text="Показать", command=showit)
  13 button.grid()
  14 app.mainloop()

Д/З

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

  1. Прочитать и прощёлкать:
  2. EJudge: DummyFunction 'Примитивная функция'

    Это примитивная задача типа «написать функцию». Она нужна для того, чтобы освоить такой тип задач. Написать функцию divides(a, b), которая для целых a и b возвращает целый результат деления a на b, если a делится на b, или же деления b на a, если b делится на a, или 0 в противном случае. На 0, понятно, ничего не делится.

    Input:

    print(divides(1000,10), divides(64, 32768), divides(1024, 12345))
    Output:

    100 512 0
  3. EJudge: ArsakSequence 'Конечная последовательность'

    (Ж. Арсак) Написать функцию seq(n), которая последовательно вычисляет значения последовательности $$ {P_i} $$ для натурального n по формуле ниже, до тех пор, пока очередной член этой последовательности не станет равен 1, и возвращает наибольший элемент такой последовательности. Формула:

    1. $$ P_0=n $$

    2. $$ P_(i+1)=P_i/2 $$, если $$ P_i $$ чётно

    3. $$ P_(i+1)=3P_i+1 $$, если $$ P_i $$ нечётно

    Input:

    print(seq(27), seq(1), seq(16), seq(101))
    Output:

    9232 1 16 304
  4. EJudge: LongRepeat 'Блаблабла'

    Написать функцию blah(S, P), которая проверяет, встречается ли в строке S шаблон P, и возвращает наибольшую длину подстроки, образованной повторением шаблона P, которая встречается в S. Если шаблон встречается в строке, но без повторений, возвращается 1, а если и шаблона нет — 0.

    Input:

    print(blah("Hey blah, blahblahblah, more than blahblah, blah-blah!", "blah"))
    Output:

    12
  5. EJudge: TkinterSum 'Сумматор'

    Пользуясь статьёй про Tkinter, написать простейшее приложение (программу), в котором будет два поля ввода A1 и A2 типа tkinter.Entry, одно текстовое поле L типа tkinter.Label и одна кнопка B типа tkinter.Button. При нажатии кнопки в текстовом поле должна появляться сумма чисел, находящихся в полях ввода. Если хотя бы одна из строк в полях ввода не является числом, содержимое L не меняется. С самого начала поля ввода пусты, а в L записана строка "0". Условие: функция, которая считывает значения из A, проверяет их правильность и записывает результат в L, должна быть зарегистрирована при создании кнопки B как её свойство command. Внимание!. Программа должна использовать оператор import tkinter, как в примере из лекции, (а не from tkinter import *, как в статье).

    Input:

    23 и 456 в полях ввода A1 и A2
    Output:

    479 в поле вывода L
    • Обратите также внимание на то, что тестированием такой программы (она ничего не вводит со стандартного ввода и ничего не выводит на стандартный вывод) занимается специальный робот. Робот тупой — мы с вами куда хитрее, так что если тесты не проходят, сигнальте мне: возможно, вы просто его перехитрили
    • Выглядеть должно примерно так: TkinterSum.mp4

Python/GeoPython2021/06_Functions (последним исправлял пользователь FrBrGeorge 2021-10-23 17:27:15)