Функции.
Основы 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)