Основы 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
              исправил.
              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безусловно. только к сожалению не могу ничего когнкретнго по срокам обещать, увы…

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

                          Самое читаемое