Изучаем Python. №9. Функции.


Итак. Доброе времени суток! Сегодняшняя тема функции и функциональное программирование на языке python.

Сперва хочу поделиться ссылками на замечательный сайт и видео лекции, которые помогут вам в изучении питона:
Сайт: http://pythontutor.ru/
Лекции: Видео лекции по python

Ну что ж, начнем…

Любая функция в питоне — это функция а не процедура. Т.к. у процедуры отсутствует возвращение значения.

Ключевое слово функции def

def empty_func(): #попределение функции
    pass         # pass указывает, что функция пустая

Пример простейшей функции с приемом аргументов:

def func(a,b):
    c = a+b
    print c
func(1,5)
>>6

Докстрока — служит для описания функции и пишется в трех скобочках после объявления функции

def fun(a,b):
    """ Greatest Common Division """ # Докстрока
    while a!=0:
        a,b = b%a,a
        return b # без return функциия вернет None
        
print fun.__doc__  #перед и после doc 2 нижних подчеркивания. Вызывает докстроку функции.
>>> Greatest Common Division

Функции являются объектами:

>>> fun #вывод информации о месте в памяти, которое занимает функция fun.
 >>><function fun at 0xb6d74b54>

Поскольку функция — это объект, то мы можем присвоить ее к чему-то:

>>> new_func = func
>>> new_func(2,18)
20

В каждую функцию можно передать параметр(ы). В языке питон всё передаётся по ссылке:

def num(v):
    v.append('ten')
my_list = ['one','seven']
num(my_list)
print my_list
>>>['one', 'seven', 'ten']

Возвращаем из функции несколько значений используя кортежы:

def multi():
    return 1,2,3
    
print multi()
>>>(1, 2, 3)

Область видимости (scope) — это текстовая область в программе на python, на которой прямым образом доступно пространство имен, здесб подразумевается, что явная ссылка на имя вынуждает интерпритатор искать это имя в пространстве имен.

Глобальные переменные внутри функции не переопределяются. Т.е. если внутри функции использованно уже занятое ранее имя переменной, то это ни на что не влияет.

var = 11
    
def per():
    var = 10
    print var

per()
print var

>>>10
>>>11

Если же нужно использовать и переопределить глобальную переменную, то для этого достаточно в функции перед переменной поставить ключ global:

gb = 20
def n():
global gb
gb = 15
print gb

n()
print gb
>>>15
>>>15

В питоне нельзя из нутри функции создать глобальную переменную.

ПЕРЕДАЧА ПАРАМЕТРОВ

1)Обычный вызов

def fun1(persona = 'mr.', name = 'X'):
    print "Hello, "+persona+name+' !'
fun1("mister ","Bond")
>>>Hello, mister Bond !

2)Именованный параметр

>>> fun1(name="Piterson")
Hello, mr.Piterson !

3)С параметрами по умолчанию:

>>> fun1()
Hello, mr.X !

Значения по умолчанию вычисляются в точке определения функции:

i = 10

def dr(arg1,arg2=i): #определило i = 5
    print arg1, arg2

i = 4 # присваиваем i другое значение

dr(5) # теперь arg1 = 5
>>>5 10 # Но функция запомнила i как 10 и игнорирует i=4

Чтобы это изменить, нужно в параметрах указать нужное значение:

>>> dr(1,2)
1 2

Нельзя указать второе значение, проигнорировав первое:

>>> dr(arg2 = 22)
Traceback (most recent call last):
  File "", line 1, in 
TypeError: dr() takes at least 1 argument (1 given)

Значение по умолчанию вычисляется лишь единожды:

def list(a,spisok=[]):
    spisok.append(a)
    return spisok

print list(1)
print '-------------'
print list(2)
print '-------------'
print list('slovo')

Результат:
[1]
-------------
[1, 2]
-------------
[1, 2, 'slovo']

Но и это можно обойти:

def obhod(a,spisok = None):
    if spisok is None:
        spisok = []

Передача неограниченного количества параметров в функцию.
Пример: среднее арефметическое

def sa(*args):
    s = 0.0
    for i in args:
        s+=i
    return s/len(args)
print sa(10,22,15)
>>>15.6666666667

Передача параметров в функцию с помощью словарей:

def users(ident,**info):
    print "user id: ",ident
    for key in info:
        print "info: %s %s" % (key, info[key])

users(ident =1, name = 'vitaliy', lastname = 'slusar')

Результат:
user id:  1
info: lastname slusar
info: name vitaliy

** — означает, что мы можем передавать в функцию целые словари. и обращатся к элементу по имени внутри функции.

Вызов функции с отдельными аргументами:

>>> range(3,6)
[3, 4, 5]

Вызов функции в питон с рапаковыннми аргументами:

>>> args = [3,6]
>>> range(*args)
[3, 4, 5]

______________________________________________
Функция проверки isinstance(), если условие верно, возвращает True или False, если нет:

>>> isinstance(2,int)
True

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.