Академический Документы
Профессиональный Документы
Культура Документы
#
#
#
# ОПРЕДЕЛЕНИЕ ФУНКЦИИ
#
# Функция в python - объект, принимающий аргументы и возвращающий значение.
# Обычно функция определяется с помощью инструкции def.
# Для определения функции нужно всего лишь написать ключевое слово def перед ее
именем, а после — поставить двоеточие.
# Следом идет блок инструкций.
#
# пример простой функции:
#
def compute_surface(radius):
from math import pi
return pi * radius * radius
#
#
def add(x, y):
return x + y
#
# Последняя строка в блоке инструкций может начинаться с return, если нужно вернуть
какое-то значение.
# Если инструкции return нет, тогда по умолчанию функция будет возвращать объект
None.
# пример:
#
i = 0
def increment():
global i
i += 1
#
# Функция инкрементирует глобальную переменную i и возвращает None (по умолчанию).
#
#
# ВЫЗОВ ФУНКЦИИ
def inner_func(x):
return x*x*x
d = func(1,2,3,4,5,6,7,8,9)
print(d) # (1, 2, 3, (4, 5, 6, 7, 8, 9))
#
#
def add_func(x, *args):
return x + sum(data)/float(len(data))
res = add_func(1,2,3,4,5,6,7,8,9)
print(res) # 6.5
#
res = add_func(10,0,1,2,-1,0,-1,1,2)
print(res) # 10.5
#
# Функция может принимать и произвольное число именованных аргументов,
# тогда перед именем ставится **
# Передавать функции неограниченное количество именованных аргументов :
def func(**args):
return args
print_mean_sequences(x=[1,2,3], y=[3,3,0])
#
#
# ДОКУМЕНТИРОВАНИЕ ФУНКЦИЙ
#
# Определим функцию:
def sum(s,y): return x + y
#
# Если написать и нажать точку в выпадающем списке обнаружится скрытый метод
# (который начинается с двух знаков нижнего подчеркивания), __doc__
# Он нужен для настройки документации функции.
# Документация в Python называется docstring
# и может быть объединена с функцией следующим образом:
def sum(x, y):
"""Первая срока - заголовок
print(sum.__doc__)
#
# Команда docstring должна быть первой инструкцией после объявления функции.
# Ее потом можно будет извлекать или дополнять:
sum.__doc__ += "some additional text"
print(sum.__doc__)
Есть и другие :
print(sum.__name__)
print(sum.__module__)
print(sum.__class__)
print(sum.__dir__)
print(sum.__repr__)
print(sum.__sizeof__)
#
#
# АНОНИМНЫЕ ФУНКЦИИ ( lambda )
#
# Прежде чем переходить как разбору понятия лямбда в Python,
# попробуем понять, чем является обычная функция Python на более глубоком уровне.
# Как вы знаете, все в Python является объектом.
# Например, когда мы запускаем эту простейшую строку кода:
x = 5
# Создается объект Python типа int, который сохраняет значение 5.
# x же является символом, который ссылается на объект.
#
# Теперь проверим тип x и адрес, на которой он ссылается.
# Это можно сделать с помощью встроенных функций type и id.
print( type(x) ) # <class 'int'>
print( id(x) ) # 1631430640
# В итоге x ссылается на объект типа int,
# а расположен он по адресу, который вернула функция id.
#
# А что происходит при определении вот такой функции:
def f(x):
return x * x
# Повторим упражнение и узнаем type и id объекта f.
print( type(f) ) # <class 'function'>
print( id(f) ) # 46539944
#
# Оказывается, в Python есть класс function,
# а только что определенная функция f — это его экземпляр.
# Так же как x был экземпляром класса integer.
# Другими словами, о функциях можно думать как о переменных.
# Разница лишь в том, что переменные хранят данные, а функции — код.
# Это же значит, что функции можно передать в качестве аргументов другим функциям
# или даже использовать их как тип возвращаемого значения.
#
# Рассмотрим простой пример, где функция f передается другой функции.
def modify_list(L, fn):
for idx, v in enumerate(L):
L[idx] = fn(v)
# Итак, modify_list — это функция, которая принимает список L и функцию fn в
качестве аргументов.
# Затем она перебирает список элемент за элементом и применяет функцию к каждому из
них.
# Так, если передать в modify_list функцию f,
# то результатом станет список, где все значения будут возведены в квадрат.
L = [1, 3, 2]
modify_list(L, f)
print(L) # [1, 9, 4]
# Но можно передать и любую другую, которая изменит оригинальный список другим
способом.
# Это очень мощный инструмент.
#
# points = defaultdict(lambda: (0, 0), dict()) так тоже работает
points = defaultdict(lambda: (0, 0))
print( points )
points['first'] = 1, 2
points['second'] = 2, 3
points['third'] = 3, 4
points['fourth'] = 4, 5
points['fifth'] = 5, 6
points['sixth'] = 6, 7
points['seventh'] = 7, 8
points['eighth'] = 8, 9
points['ninth'] = 9, 10
points['tenth'] = 10, 1
print( ' ' )
print( points['first'] )
print( points['second'] )
print( points['fourth'] )
print( points['eighth'] )
print( points['tenth'] )
#
# Обратите внимание, что в качестве default_factory
# была установлена лямбда lambda: (0, 0).
# Таким образом, если defaultdict не имеет конкретного ключа,
# она вызывает лямбда-функцию и возвращает значение по умолчанию (0, 0).
#
#
#
# 4. Использование лямбда с функциями высшего порядка
# Важно помнить, что всё в Python является объектом, включая функции.
# Функции, принимающие другие функции в качестве аргументов
# или возвращающие их в качестве результата, называются функциями высшего порядка.
# map() принимает отображающую функцию и применяет ее к одному или более
итерируемым объектам.
# filter() принимает функцию фильтрации и применяет ее к только одному итерируемому
объекту.
#
# Создание списка чисел
def f(x):
return x * x
num1 = [1, 2, 3, 4]
num2 = [5, 6, 7, 8, 9]
# print(num1)
# print(num2)
# Создание списка чисел, каждое из которых умножается на 3
# print(list(map(lambda x: x * 3, num1 )) )
# print(list(map(lambda x: x * 3, num2 )) )
#
# эначения списка num1 умножается на значения списка num2
# print(list(map(lambda x,y: x * y, num1,num2)))
#
# варианты использования функции def f(x) в лямбда
# print( list( map( lambda x:f(x),num2 ) ) ) # [25, 36, 49, 64, 81]
# print( list( map( lambda x,y: y+f(x), num1,num2 ) ) ) # [6, 10, 16, 24]
# print( list( map( lambda x:f(x),num1 ) ) ) # [1, 4, 9, 16]
# print( list( map( lambda x:f(x),num2 ) ) ) # [25, 36, 49, 64,
81]
# print( list( map( lambda x,y:f(x)+f(y),num1 ,num2 ) ) ) # [26, 40, 58, 80]
#
#
# результат v % 2 равен 0 (ноль) число чётное / равен 1 (один) число не чётное
# Создание списка четных чисел if x % 2 == 0
# Создание списка нечетных чисел if x % 2 == 1
def evenness(x):
g = lambda x: (x % 2 and False )or(x % 2 and True )
return g(x)
#
print("Создание списка не четных чисел")
odd_numbers = list(n for n in num1 if n % 2 == 1)
print(odd_numbers)
d = sum( 3, 5 )
print(d) # 8
#
func = lambda x, y: x + y
print( func( 3, 5 ) ) # 8
#
# С помощью type() можно проверить тип:
print( type(func) ) # <class 'function'>
#
# В отличие от функций, здесь не используется ключевое слово return.
# Результат работы и так возвращается.
# lambda функции, в отличие от обычной, не требуется инструкция return,
# а в остальном, ведет себя точно так же:
func = lambda *args: args
print( func(1, 2, 3, 4) ) # (1, 2, 3, 4)
#
# Переменным также можно присваивать встроенные функции.
# Таким образом позже есть возможность вызывать функцию другим именем.
# Такой подход называется непрямым вызовом функции.
# С существующей функцией func синтаксис максимально простой: variable = func
power = lambda x=1, y=2: x**y
square = power # переменнной присвоили функцию
square(5.)
print( square(5.) ) # 25.0
print( square(5) ) # 25
#
power = lambda x,y,pow=2: x**pow + y
A = [power(x,2, 3) for x in [0,1,2]]
print(area_of_circle_simple(5)) # 78.5
print(area_of_circle_simple(12)) # 452.16
print(area_of_circle_simple(26)) # 2122.64
#
# это всё может выглядеть куда круче, если записывать это через lambda:
#
print((lambda radius: pi_const*(radius**2))(5)) # 78.5
print((lambda radius: pi_const*(radius**2))(12)) # 452.16
print((lambda radius: pi_const*(radius**2))(26)) # 2122.64
#
# анонимный вызов функции подразумевает то, что вы используете её, нигде не
объявляя
# print( (lambda перечисляются аргументы через запятую : что то с ними делается)
(передаем аргументы) )
#
#
# пример с двумя входными аргументами.
# Например, нам надо посчитать объем конуса по следующей формуле:
# V = (height*pi_const*(radius**2))/3
#
import math #Подключаем библиотеку math
# Сортируем по названию
for book in sorted(asoiaf_books, key=lambda book: book.get('title')):
print(book)
print('-------------')
#
# Сортируем по датам
for book in sorted(asoiaf_books, key=lambda book: book.get('published')):
print(book)
print('-------------')
#
# Сортируем по количеству страниц
for book in sorted(asoiaf_books, key=lambda book: book.get('pages')):
print(book)
#
# результат в обоих случаях
# Таким образом, lambda функция хорошо подходит для сортировки многомерных списков
по разным параметрам.
#
#
# Как уже упоминалось, лямбда могут иметь только одно выражение (expression) в
теле.
# Обратите внимание, что речь идет не об инструкции (statement).
# Выражение и инструкции — две разные вещи, в которых часто путаются.
# В программировании инструкцией является строка кода, выполняющая что-то, но не
генерирующая значение.
# Например, инструкция if или циклы for и while являются примерами инструкций.
# Заменить инструкцию на значение попросту невозможно.
# А вот выражения — это значения.
# Запросто можно заменить все выражения в программе на значения, и программа
продолжит работать корректно.
# Например:
# 3 + 5 — выражение со значением 8
# 10 > 5 — выражение со значением True
# True and (5 < 3) — выражение со значением False
#
# Тело лямбда-функции должно являться выражением, поскольку его значение будет
тем, что она вернет.
# Обязательно запомните это для работы с лямбда-функциями в будущем.
#
# Основная причина применения лямбда функций — создание функции, которая
используется в коде единожды.
# Использование таких функций позволяет снизить число строк кода, которые вам
придется написать.
# Также лямбда функции известны как throw-away функции, которые используются
вместе с filter(), map() и т. п.
#
#
#
# ИСПОЛЬЗОВАНИЕ ЛЯМБДА ФУНКЦИЙ В filter(), map(), reduce()
#
# Функция filter() в Python
#
# Функция filter() в Python применяет другую функцию к заданному итерируемому
объекту
# (список, строка, словарь и так далее), проверяя, нужно ли сохранить конкретный
элемент или нет.
# Простыми словами, она отфильтровывает то, что не проходит и возвращает все
остальное.
#
# Объект фильтра — это итерируемый объект.
# Он сохраняет те элементы, для которых функция вернула True.
# Также можно конвертировать его в list, tuple или другие типы последовательностей
с помощью фабричных методов.
#
# Функция filter() принимает два параметра.
# Первый — имя созданной пользователем функции,
# а второй — итерируемый объект (список, строка, множество, кортеж и так далее).
#
# Она вызывает заданную функцию для каждого элемента объекта как в цикле.
# Синтаксис следующий: filter(in_function|None, iterable)
# возвращаемое значение: filter object
#
# Первый параметр — функция, содержащая условия для фильтрации входных значений.
# Она возвращает True или False.
# Если же передать None, то она удалит все элементы кроме тех, которые вернут True
по умолчанию.
#
# Второй параметр — итерируемый объект, то есть последовательность элементов,
# которые проверяются на соответствие условию.
# Каждый вызов функции использует один из объектов последовательности для
тестирования.
#
# Возвращаемое значение — объект filter,
# который представляет собой последовательность элементов, прошедших проверку.
#
#
# Примеры функции filter()
#
# Функция filter предлагает элегантный вариант фильтрации элементов
последовательности.
# Принимает в качестве аргументов функцию и последовательность, которую необходимо
отфильтровать
# Обратите внимание, что функция, передаваемая в filter должна возвращать значение
True / False,
# чтобы элементы корректно отфильтровались.
#
# Фильтр нечетных чисел
#
# список чисел
numbers = [1, 2, 4, 5, 7, 8, 10, 11]
# функция, которая проверяет числа
def filter_odd_num(in_num):
if(in_num % 2) == 0:
return True
else:
return False
# Применение filter() для удаления нечетных чисел
out_filter = filter(filter_odd_num, numbers)
# -------
# Например, с помощью map можно выполнять преобразования элементов.
# Перевести все строки в верхний регистр:
list_of_words = ['one', 'two', 'list', '', 'dict']
print( map(str.upper, list_of_words) )
# <map object at 0x02C49028>
print( list(map(str.upper, list_of_words)) )
# ['ONE', 'TWO', 'LIST', '', 'DICT']
# -------
# Конвертация в числа :
list_of_str = ['1', '2', '5', '10']
print( list(map(int, list_of_str)) )
# [1, 2, 5, 10] числа
# -------
# -------
# Например, вы прочитали из файла список чисел,
# изначально все эти числа имеют строковый тип данных,
# чтобы работать с ними - нужно превратить их в целое число:
old_list = ['1', '2', '3', '4', '5', '6', '7']
new_list = []
for item in old_list:
new_list.append(int(item))
print (new_list)
# [1, 2, 3, 4, 5, 6, 7]
L1 = [1,2,3]
L2 = [4,5,6]
new_list = list(map(lambda x,y: x + y, L1, L2))
print (new_list)
# [5, 7, 9]
# Если же количество элементов в списках совпадать не будет,
# то выполнение закончится на минимальном списке:
L1 = [1,2,3]
L2 = [4,5]
new_list = list(map(lambda x,y: + y, L1, L2))
print (new_list)
# [5,7]
def miles_to_kilometers(num_miles):
""" Converts miles to the kilometers """
return num_miles * 1.6