Основы Python — кратко. Часть 5. Определение функций, основы.

    Начав писать главу про ООП, понял что совсем забыл освятить такой большой и нужный раздел Пайтона как функции. Тема это большая и обширная, потому, чтобы не сильно растягивать паузу между уроками, решил разделить ее на 2 части. Сначала расскажу основы, потом уже углубленные особенности Пайтоновского функциестроения.

    Функции в Пайтоне объявляются не просто, а очень просто. Вот пример самой простой:

    def empty_func():
        pass

    Начинается объявление с ключевого слова def, что как не сложно догадаться является сокращением от define. После него идет имя функции. После имени в круглых скобках задается список параметров, в данном случае отсутствующих.
    Тело функции пишется с отступом со следующей строки. учтите, что в Пайтоне функции с пустым телом запрещены, потому в качестве тела приведенной выше функции используется «пустой оператор» pass.
    Теперь рассмотрим пример посерьезнее.

    def safe_div(x, y):
        """Do a safe division :-)
    for fun and profit"""
        if y != 0:
            z = x / y
            print z
            return z
        else:
            print "Yippie-kay-yay, motherf___er!"

    В этом примере есть несколько нововведений. первое, что бросается в глаза — это строка документации (docstring), идущая сразу после тела функции.
    Обычно эта строка занимает не одну строку исходного текста (простите за каламбур) и потому задается в тройных кавычках. Она предназначена для описания функции, ее предназначения, параметров и т.п. Все хорошие ИДЕ умеют с этой строкой работать. Получить к ней доступ можно и из самой программы, используя свойство __doc__:

    print safe_div.__doc__

    Этим свойством (да, да, именно свойством, в Пайтоне даже функции на самом деле — классы) удобно пользоваться во время сеансов работы интерактивной консоли.
    >>> from ftplib import FTP
    >>> print FTP.__doc__
    An FTP client class.
    
        To create a connection, call the class using these argument:
                host, user, passwd, acct
        These are all strings, and have default value ''.
        Then use self.connect() with optional host and port argument.
    # дальнейшее почикано мною :-)

    Вернемся к нашей исходной функции. Суть ее очень проста, она принимает 2 параметра: х и у. Если у не равен 0, она делит х на у, выводит результат на экран и возвращает свое частное в виде результата. Результат функции возвращают с помощью команды return. Благодаря механизму кортежей, описанному в прошлом уроке, функции в Пайтоне могут возвращать одновременно множество объектов.
    Если же делитель все-таки равен нулю, функция выводит сообщение об ошибке. Неверно было бы предположить что в этом случае функция ничего не вернет. Правильнее будет сказать что функция вернет «ничего» :) Иначе говоря, если в функции отсутствует оператор return, или же он вызван без параметров, то функция возвращает специальное значение None. В этом легко убедиться вызвав что-то типа print safe_div(10, 0).

    Вот пример слегка посложнее, он взят из доклада-презентации Гвидо ван Россума.

    def gcd(a, b):
       "Нахождение НОД"
       while a != 0:
          a,b = b%a,a # параллельное определение
       return b

    Данная функция находит наибольший общий делитель двух чисел.

    В общем, следует учитывать, что параметры в функции Пайтоном передаются по ссылке. Еще одним, возможно нетривиальным фактом к которому придется привыкать — является тот факт что сами функции являются значением, которое можно присваивать. Если воспользоваться нашей функцией safe_div для дальнейших экспериментов, то можно написать следующий код.

    mystic_function = safe_div
    print mystic_function(10, 4)

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

    Упражнения для проверки.
    1. На основе существующей функции нахождения НОД, напишите функцию поиска НОК двух чисел.
    2. Напишите подпрограмму табулирования функции, переданной в качестве аргумента. Так же аргументами задается начальное, конечное значение и шаг табуляции.

    PS кстати, каков оптимальный объем «урока»? Что лучше — реже выходящие большие главы, или «лучше меньше да чаще».
    Метки:
    Поделиться публикацией
    Похожие публикации
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 21
    • НЛО прилетело и опубликовало эту надпись здесь
      • +1
        Спасибо, но по поводу урока имею противоположное мнение: лучше меньше да чаще, с домашними заданиями :)
        • НЛО прилетело и опубликовало эту надпись здесь
          • 0
            Мне кажется, стоит писать меньшими объемами, но чаще, потому что между двумя «уроками» проходит много времени и можно легко успеть уйти далеко вперед. :)
            И, еще: в строке «print safe_div..__doc__» две точки и в заголовке слово «Определние».
          • 0
            вообще, самый лучший учебник по питону, который я видел - Dive Into Python ("Вглубь языка Python") http://diveintopython.org/ - там он есть и на русском.
            Вот самое начало: http://ru.diveintopython.org/odbchelper_…

            А задачки было бы неплохо!
            • 0
              ссылка на этот учебник всплывает почти в каждой "серии" моих статеек :) но все равно тем кто захочет уйти вперед - он однозначно понравится. жаль только что он недопереведен на русский...
              • 0
                Не хочу давать _лишних_ обещаний, но всё-таки: если б кто-то взялся за организацию - я бы сильно помог с переводом, тем более что около переведенных 8 уроков у меня уже есть.
                Если кому-то надо - пишите, договоримся.
                • 0

                  a = u'переведенных 8'
                  b = a[-1:]
                  print str(b) + ' ' + a[:-1]
                  • +1
                    можем попробовать вместе взяться...
                    • 0
                      Если возьметесь - готов помочь, чем могу.
              • 0
                "Определение функций", в заголовке.
                • 0
                  спасибо, исправил.
                • 0
                  "забыл освятить такой большой и нужный раздел Пайтона"
                  :)))
                  • 0
                    ..функции, переданной в качестве..
                    • 0
                      это урок по информатике в школе или все таки основы языка питон?
                      почему не сказано про такие прелести как значение аргументов по умолчанию, произвольный набор агрументов, именованые аргументы? это как раз интересные особенности языка!
                      • 0
                        я же ясно написал что тема про функции будет в двух частях. а может и в трех.
                        поэтому это - вынесено на след. занятие.
                      • 0
                        у меня книжка есть в pdf полностью на русском, от автора языка :)

                        Г.Россум, Ф.Л.Дж.Дрейк, Д.С.Откидач
                        Язык программирования Python

                        кому интересно - пишите, вышлю
                      • 0
                        А ожидается ли следующий урок?
                        • 0
                          lбезусловно. только к сожалению не могу ничего когнкретнго по срокам обещать, увы…

                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.