Функции.

Basics of Python and Django. -> Функции и их аргуметы

Функции

Это элементы языка, принимающие аргументы и возвращающие значение.

Определяется функция с помощью конструкции def.

Пустая функция

def func():
    pass

Функция может принимать произвольное количество аргументов или не принимать их вовсе.

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

Функция с позиционными аргументами.

def add(x,y):
    print 'Result %s' % str(x+y)

Вызов функции.

add(2,4)

Функция с именоваными аргументами.

def add(x=1,y=4):
    print 'Result %s' % str(x+y)

В начале должны следовать неименованные аргументы.

Например.

def func(a, b, c=2): # c - необязательный аргумент
    return a + b + c

Значения по умолчанию.

def myf(x=1):
    print(x)

myf() 
>> 1

Функция может быть любой сложности и возвращать любые объекты (списки, кортежи, и даже функции!):

def outer_func(n):
    def inner_func(x):
        return x + n
    return inner_func

Клиентский код.

new = outer_func(100)  # new - это функция
new(200)

Функция может принимать переменное количество позиционных аргументов, тогда перед именем ставится *

def addAll(*args):
    rez = 0
    for i in args:
        rez = rez + i
    print 'Result %s' % str(rez)

addAll(2,3,4,5,67)

args - это кортеж из всех переданных аргументов функции

Функция может принимать и произвольное число именованных аргументов, тогда перед именем ставится **

def func(**kwargs):
    return kwargs

func(a=1, b=2, c=3)

>>{'a': 1, 'c': 3, 'b': 2}

Проход по именованным и позиционным аргументам.

def greet_me(**kwargs):
    for key, value in kwargs.items():
        print("{0} = {1}".format(key, value))

Напоминаю - позиционные аргументы идут первыми.

def universe(*args,**kwargs):
    for a in args:
        print 'List arg: %s' % a

    for k,v in kwargs.items():
        print 'key: %s  value: %s' % (k,v)


universe(1,2,3,name='Dima')

Конструкцию def func(args,*kwargs): используют для создания универсальных функций с единой сигнатурой (интерфейсом вызова) для того чтобы не зависеть от количества передаваемых параметров и избежать ошибок несоответствия количества переданных параметров с сигнатурой вызова функции.

Basics of Python and Django. -> Встроенные функции Python.

Встроенные функции Python.

Это функции, которые не требуют импорта и идут из коробки.

Рассмотрим некоторые из них.

map(function, iterable, …)

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

Возвращает результат в виде списка.

Например.

items = [1, 2, 3]
print items

def mf(x):
    return x**2

result = map(mf,items)
print result

Использование лямбда функции.

лямбда функция - это функция без названия (анонимная).

Формат определения

lambda <переменная, передаваемая параметром ф-ции> : <операция, возвращаемая функцией>

Применяется для более короткой записи для улучшения читабельности кода т.к. при такой конструкции нет необходимости определять функцию под каким то именем потому что она используется только в одном месте.

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

items = [1, 2, 3]
lm = lambda x: x**2
l = map(lm, items)
print l

l = map(lambda x: x**2, items)
print l

Вывод

[1, 2, 3]
[1, 4, 9]


words = ['It', 'is', 'raining', 'cats', 'and', 'dogs'] 
lengths = map(lambda word: len(word), words)

>> [2, 2, 7, 4, 3, 4]

filter(function, iterable)

Похоже на предыдущую тем, что тоже принимает два аргумента и применяет функцию к каждому элементу переданного списка, но filter формирует и возвращает список из тех элементов списка для которых функция возвращает True.

Для этого каждый элемент списка будет передан в функцию-обработчик в качестве параметра.

lst = [1,2,3,4,5,6,7,8,9]
def myf(x):
    if x%2 == 0:
        return True
    else:
        return False

res = filter(myf,lst)
print res

>> [2, 4, 6, 8]

enumerate(sequence, start=0)

Применяется для коллекций (строки, списки, словари и или любым другим объектом, поддерживающим итерацию и

создает объект, который генерирует кортежи, состоящие из двух элементов - индекса элемента и самого элемента.

>>> a = [10, 20, 30, 40]
>>> for i in enumerate(a):
...     print(i)
... 
(0, 10)
(1, 20)
(2, 30)
(3, 40)

Пример аналога работы без применения enumerate:

lst = ['one','two','three']

for i in range(len(lst)):
    print '%s-%s' % (i,lst[i])


for i,x in enumerate(lst):
    print '%s-%s' % (i,x)

В случае словарей нумеруются ключи:

>>> c = {1: 'a', 2: 'b', 3: 'c'}
>>> for i in enumerate(c):
...     print(i)
... 
(0, 1)
(1, 2)
(2, 3)

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

Функция list([iterable])

Создает список из того, что ей передано.

Если передан словарь то создается список из его ключей.

print list() >> []
print list('abc') >> ['a','b','c']
print list((5,6,7)) >> [5,6,7]
print list({'1':'hi', '2': 'bye'}) >> ['1', '2']

Функция dict()

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

pairs = [("cat", "meow"), ("dog", "bark"), ("bird", "chirp")]

# Преобразование
lookup = dict(pairs)

Output

{'bird': 'chirp', 'dog': 'bark', 'cat': 'meow'}

Функция tuple([iterable])

Возвращает кортеж с элементами в таком же порядке, каким он был в переданном списке.

tuple([1, 2, 3]) returns (1, 2, 3)