Пользователь
0,0
рейтинг
5 августа 2008 в 16:14

Разработка → Основы 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 кстати, каков оптимальный объем «урока»? Что лучше — реже выходящие большие главы, или «лучше меньше да чаще».
Павел Дмитриев @cleg
карма
149,8
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

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

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