Функції.

Основи Python и 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): використовують для створення універсальних функцій з єдиною сигнатурою (інтерфейсом виклику) для того щоб не залежати від кількості параметрів, що передаються і уникнути помилок невідповідності кількості переданих параметрів із сигнатурою виклику функції.

Основи Python и 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)