Следующая: , Предыдущая: strings, Вверх: Top


11 Функции

В одном из первых листочков мы писали программы, вычисляющую число сочетаний из n элементов по k по данным n и k, то есть вычисляющую n!/k!(n-k)!. В этой программе необходимо три раза вычислять факториал, то есть трижды повторять одну и ту же последовательность действий. Эту последовательность лучше не повторять в программе трижды, а оформить в виде отдельной функции, которая по данной величине n вычисляет значение n!, а затем трижды использовать эту функцию. Это приводит к уменьшению размера исходного кода программы, упрощению ее разработке и улучшению читаемости.

В языке Питон функция, вычисляющая n! может выглядеть следующим образом:

     def factorial(n):
       f=1
       for i in range(1,n+1):
         f=f*i
       return f

Первая строка содержит объявление функции, состоящее из ключевого слова def (аббревиатура от define – определять), идентификатор функции и в скобках – список параметров, получаемых функцией. В нашем случае функция получает единственный параметр – число n. Завершается определение функции двоеточием. Далее идет тело функции, как и любой блок, выделенной при помощи отступа. В теле нашей фунции мы объявляем переменную f, присвоив ей первоначальное значение, равное единице, затем в цикле умножаем значение f на все числа от 1 до n. После окончание цикла наша функция возвращает значение f при помощи инструкции return.

Теперь мы можем в любом месте нашей программы вызвать функцию factorial для вычисления факториала произвольного числа. С ее помощью мы можем записать программу вычисления числа сочетаний следующим образом:

     print "Введите значения n и k:"
     n=input()
     k=input()
     print factorial(n)/(facorial(k)*factorial(n-k))

Функции могут принимать несколько параметров, тогда их необходимо перечислять через запятую. Также функции могут вызывать другие функции (и даже сами себя). Например, мы можем реализовать функцию binomial, принимающую два параметра n и k, возвращающую число сочетаний из n по k и трижды вызывающую функцию factorial:

     def binomial(n,k):
       return factorial(n)/(factorial(k)*factorial(n-k))

Функция может и не возвращать никаких значений, а просто выполнять последовательность действий. Такие функции нельзя использовать в арифметических выражениях, и они могут не содержать инструкции return. В ряде языков, например, в Паскале, такие функции называются процедурами. Еще процедуры и функции называют подпрограммами.

Функция может не принимать ни одного параметра, тогда список ее параметров будет пустым (и будет иметь вид пары круглых скобок).

Упражнения

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

  1. Напишите функцию IsUpper(c), которая по данному символу c определяет, является он заглавной буквой латинского алфавита. Функция должна возвращать 1, если c является заглавной буквой и 0 в противном случае.
  2. Напишите функцию IsDigit(c), которая определяет, является ли входной символ c цифрой.
  3. Напишите функцию ToUpper(c), которая переводит один строчный символ c латинского алфавита в аналогичный заглавный.
  4. Напишите функции ToUpper(s) и ToLower(s), которая переводит строку из нижнего регистра в верхний и наоборот. Символы, не являющиеся латинскими буквами не меняются. Фунция получает на вход текстовую строку s и возвращает текстовую строку такой же длины.
  5. В шифре Цезаря каждая буква заменяется на третью по счету букву латинского алфавита с циклическим сдвигом (то есть A меняется на D, B на E, ..., Z на C). Напишите функции CaesarCrypt(s) и CaesarDecrypt(s), осуществляющие шифрование и дешифрование строки при помощи шифра Цезаря. Функция получает на вход строку s и возвращает строку такой же длины.
  6. Напишите функцию, шифрующую строку по следующему принципу: строка разбивается на пары символов, два символа в паре переставляются местами (то есть строка "abcdef" будет зашифрована, как "badcfe").