SlideShare uma empresa Scribd logo
1 de 48
Функции
Технологии и языки программирования
Юдинцев В. В.
Кафедра теоретической механики
Самарский университет
21 октября 2016 г.
Содержание
1 Объявление функций
2 Пространство имён
3 Функциональное программирование
4 Списочные выражения и генераторы
5 Задание
Кафедра Теоретической механики Функции 2 / 39
Объявление функций
Объявление функции
1 def spring_fo rc e ( f0 , fk , h , x ) :
2 i f 0 < x < h :
3 res = 0
4 else :
5 res = f0 −(f0−fk ) * x / h
6 return res
Ключевое слово def, имя функции, список аргументов
Результат возвращается при помощи оператора return
Если оператор return отсутствует, то функция возвращает
None
spring_forc e (10 , 2 , 0.1 , 0.05)
6
Кафедра Теоретической механики Функции 4 / 39
Позиционные аргументы
Объявление функции:
1 def spring_fo rc e ( f0 , fk , h , x ) :
2 . . .
Вызов функции:
spring_forc e ( 1 0 . 0 , 2.0 , 0.1 , 0.05) :
Аргументы функции spring_force должны передаваться в
том порядке, в котором это задумано автором функции
При вызове функции необходимо помнить смысловой
порядок аргументов
Кафедра Теоретической механики Функции 5 / 39
Именованные аргументы
Объявление функции:
1 def spring_fo rc e ( f0 , fk , h , x ) :
2 . . .
Возможна передача функции именованных аргументов:
1 f = spring_fo rc e ( h =0.3 , f0 =10 , fk =2 ,x =0.15)
Порядок аргументов может быть произвольным
Такой способ вызова позволяет исключить ошибки
Кафедра Теоретической механики Функции 6 / 39
Параметры по умолчанию
1 def height_max ( v0 , g = 9.81) :
2 ”’
3 Максимальная высота подъёма груза, брошенного вверх
4 с начальной скоростью v0 (м/с),
5 при ускорении свободного падения g (м/с**2)
6 ”’
7 return 0.5* v0 * * 2 / g
Высота подъёма груза на Земле, g ≈ 9.81 м/с2
>> height_max (10 )
5.098399102681758
Высота подъёма груза на Луне, g ≈ 1.62 м/с2
>> round ( height_max ( 1 0 , 1 . 6 2 ) ,1)
30.9
Кафедра Теоретической механики Функции 7 / 39
Параметры по умолчанию
При использовании ссылочных типов в параметрах по
умолчанию их значение при изменении внутри функции
сохраняется и до следующего вызова этой функции:
1 def add_element_to_b ( a , b = [ ] ) :
2 b . append ( a )
3 return b
При первом вызове функции: b – пустой список
add_element_to_b ( 4 )
[ 4 ]
При втором вызове функции: b “вспомнит” последнее значение
add_element_to_b ( 5 )
[4 , 5]
Кафедра Теоретической механики Функции 8 / 39
Параметры по умолчанию
Исправленный вариант
1 def add_element_to_b ( a , b=None ) :
2 i f b == None :
3 b = [ ]
4 b . append ( a )
5 return b
>> add_element_to_b ( 4 )
[ 4 ]
>> add_element_to_b ( 5 )
[ 5 ]
Кафедра Теоретической механики Функции 9 / 39
Переменное число аргументов
Позиционные аргументы
Упаковка позиционных аргументов в кортеж args
1 def zeros ( * args ) :
2 p r i n t ( ’Аргументы : ’ , args )
3 i f len ( arg ) == 1:
4 return [ 0 ] * args [ 0 ]
5 i f len ( arg ) == 2:
6 return [ [ 0 ] * args [ 0 ] ] * args [ 1 ]
Переданные аргументы будут собраны в кортеж args
>> zeros ( 3 , 3 )
Аргументы: (3 , 3)
[ [ 0 , 0 , 0] ,
[0 , 0 , 0] ,
[0 , 0 , 0 ] ]
Кафедра Теоретической механики Функции 10 / 39
Переменное число аргументов
Позиционные аргументы
1 def zeros ( n1 , * args ) :
2 i f len ( args ) == 0:
3 return [ 0 ] * n1
4 i f len ( args ) == 1:
5 return [ [ 0 ] * n1 ] * args [ 0 ]
>> zeros ( )
TypeError : zeros ( ) missing 1 required p o s i t i o n a l
argument : ’ n1 ’
Кафедра Теоретической механики Функции 11 / 39
Переменное число аргументов
Позиционные аргументы
1 def zeros ( n1 , * args ) :
2 i f len ( args ) == 0:
3 return [ 0 ] * n1
4 i f len ( args ) == 1:
5 return [ [ 0 ] * n1 ] * args [ 0 ]
>> zeros ( )
TypeError : zeros ( ) missing 1 required p o s i t i o n a l
argument : ’ n1 ’
>> zeros ( 3 )
[0 , 0 , 0]
Кафедра Теоретической механики Функции 11 / 39
Переменное число аргументов
Именованные аргументы
1 def zeros ( * * kwargs ) :
2 i f kwargs . get ( ’ dim1 ’ ) :
3 res = [ 0 ] * kwargs [ ’ dim1 ’ ]
4 i f kwargs . get ( ’ dim2 ’ ) :
5 res = [ res ] * kwargs [ ’ dim2 ’ ]
6 return res
Переданные аргументы будут собраны в словарь kwargs
>> zeros ( dim1 =3)
[0 , 0 , 0]
>> zeros ( dim1=2 , dim2 =2)
[ [ 0 , 0] , [0 , 0 ] ]
Кафедра Теоретической механики Функции 12 / 39
Распаковка позиционных аргументов
1 def zeros ( n1 , * args ) :
2 row = [ 0 ] * n1
3 i f len ( args ) == 0:
4 return row
5 i f len ( args ) == 1:
6 return [ row ] * args [ 0 ]
Вызвать функцию zeros можно, передав два параметра
>> zeros ( 2 , 2 )
[ [ 0 , 0] , [0 , 0 ] ]
или один список или кортеж из двух элементов с
модификатором *
>> dim = ( 2 , 2 )
>> zeros ( * dim )
[ [ 0 , 0] , [0 , 0 ] ]
Кафедра Теоретической механики Функции 13 / 39
Распаковка именованных аргументов
1 def zeros ( * * kwargs ) :
2 i f kwargs . get ( ’ dim1 ’ ) :
3 res = [ 0 ] * kwargs [ ’ dim1 ’ ]
4 i f kwargs . get ( ’ dim2 ’ ) :
5 res = [ res ] * kwargs [ ’ dim2 ’ ]
6 return res
Вызвать функцию zeros можно, передав два параметра
>> zeros ( dim1=2 , dim1 =2)
[ [ 0 , 0] , [0 , 0 ] ]
или один словарь с модификатором **
>> dims = ( ’ dim1 ’ : 2 , ’ dim2 ’ : 2)
>> zeros ( * * dims )
[ [ 0 , 0] , [0 , 0 ] ]
Кафедра Теоретической механики Функции 14 / 39
Документирование функции
1 import numpy as np
2
3 def o r b i t a l _ v e l o c i t y ( height ) :
4 ”’ Скорость движения по круговой орбите вокруг Земли км/с
5 height - высота орбиты в км ”’
6 Rz = 6371
7 mu = 398600.4418
8 return np . sqrt (mu/ ( Rz+ height ) )
>> help ( o r b i t a l _ v e l o c i t y )
Help on function orbital_velocity in module __main__:
orbital_velocity(height)
Скорость движения по круговой орбите вокруг Земли км/с
height - высота орбиты в км
Кафедра Теоретической механики Функции 15 / 39
Имя функции как переменная. Замыкания
1 def step_function ( x0 , y0 , y1 ) :
2 def step ( x ) :
3 i f x<x0 :
4 return y0
5 else :
6 return y1
7 return step
Вызов функции step_function создает объект функцию
step c заданными значениями x0, y0, y1:
unit_step = step_function ( 0 . 0 , 0.0 , 1 . 0 )
>> unit_step ( −2)
0
>> unit_step ( 1 )
1
Кафедра Теоретической механики Функции 16 / 39
Замыкание
Функция (внутренняя), определяемая в теле другой
(внешней) функции и создаваемая каждый раз во время
выполнения внешней функции
Внутренняя функция содержит ссылки на локальные
переменные внешней функции
Кафедра Теоретической механики Функции 17 / 39
Пространство имён
Локальные переменные
При каждом вызове функции создаётся новое локальное
пространство имён
1 a = 1 # Глобальная переменная модуля
2
3 def fun ( x ) :
4 a = 2 # Локальная переменная
5 return x + a
>> fun ( 3 )
5
>> a
1
Кафедра Теоретической механики Функции 19 / 39
Области видимости. Правило LEGB
При использовании имени переменной внутри функции
интерпретатор последовательно ищет соответствующий этому
имени объект в локальной (L) области, в объемлющей (E)
области, в глобальной (G) области, а затем во встроенной (B)
1 a = 1 # Глобальная переменная модуля
2
3 def parent_fun ( x ) :
4 b = 10
5 def fun ( x ) :
6 return x + a + b
7 return fun ( x )
>> parent_fun ( 7 )
18
Кафедра Теоретической механики Функции 20 / 39
Инструкция global
1 a = 1 # Глобальная переменная модуля
2 def fun ( x ) :
3 b = 10 + a # a из глобальной области
4 a = 1 # ОШИБКА!
5 return b
Local variable ’a’ referenced before assignment
Изменить глобальную переменную можно, объявив её
глобальной:
1 a = 1 # Глобальная переменная модуля
2 def fun ( x ) :
3 global a
4 a = 3
5 b = 10 + a
6 return b
Кафедра Теоретической механики Функции 21 / 39
Инструкция nonlocal
При необходимости изменить переменную объемлющей
области её необходимо объявить nonlocal
1 a = 1 # Глобальная переменная модуля
2 def fun ( x ) :
3 a = 10 # Локальная переменная модуля функции fun
4 def inner_fun ( x ) :
5 nonlocal a # Переменная из объемлющей области
6 a = a + 5 # Было 10, стало 15
7 b = a + x
8 return b
9 res = inner_fun ( x )
10 return ( a , res )
>> fun ( 1 )
(15 , 16)
Кафедра Теоретической механики Функции 22 / 39
Функциональное программирование
Анонимная (лямбда) функция
Короткие однострочные функции могут быть объявлены
при помощи lambda-функций
1 mean = lambda x , y : ( x + y ) *0.5
Вызов функции
mean ( 1 , 6 )
3.5
Лямбда-функция обычно используется в паре с функциями
filter, map, sort
Кафедра Теоретической механики Функции 24 / 39
Функция filter
Применение лямбда-функции с функцией filter
1 >> data = {1 , 7 , 3 , 2 , 6 , 8}
2
3 >> f i l t e r ( lambda x : x % 2 == 0 , data )
4
5 {2 , 6 , 8}
Кафедра Теоретической механики Функции 25 / 39
Функция filter
Применение лямбда-функции с функцией filter
data = {1 , 7 , 3 , 2 , 6 , 8}
def less_than_5 ( x ) : return x < 5
>> f i l t e r ( less_than_5 , data )
{1 , 3 , 2}
Кафедра Теоретической механики Функции 26 / 39
Функция filter
Применение лямбда-функции с функцией filter
data = {1 , 7 , 3 , 2 , 6 , 8}
def less_than_5 ( x ) : return x < 5
>> f i l t e r ( less_than_5 , data )
{1 , 3 , 2}
но лучше:
def less_than ( value ) : return lambda x : x < value
>> f i l t e r ( less_than ( 5 ) , data )
{1 , 3 , 2}
или совсем просто:
>> f i l t e r ( lambda x : x < 5 , data )
Кафедра Теоретической механики Функции 26 / 39
Функция map
Функция map(function, data) применяет function к
каждому элементу последовательности data:
1 data = [4 ,5 ,6 ,7]
2
3 >> map( lambda x : x * * 2 , data )
4 < b u i l t i n s . map at 0xa8d36bcc >
Функция map – ленивая функция. Функция возвращает не весь
обработанный список, а ссылку на функцию-генератор, которая
вычисляет значения по мере необходимости, подобно функции
range:
1 >> l i s t (map( lambda x : x * * 2 , data ) )
2 [16 , 25 , 36 , 49]
Кафедра Теоретической механики Функции 27 / 39
Функция map
Функцию map можно использовать для обработки нескольких
списков:
1 vec1 = [1 ,4 ,3 ,7]
2
3 vec2 = [8 ,5 ,1 ,3]
4
5 prod = map( lambda x , y : x * y , vec1 , vec2 )
>> scalar_product = sum ( prod )
52
Кафедра Теоретической механики Функции 28 / 39
Списочные выражения и генераторы
Списочные выражения
Вместо функции map
1 data = [10 , 12 , 13 , 14]
2
3 >> l i s t (map( lambda x : x * * 2 , data ) )
4 [16 , 25 , 36 , 49]
можно использовать списочные выражения
1 res = [ x **2 f o r x in data ]
2 p r i n t ( res )
3
4 [16 , 25 , 36 , 49]
Кафедра Теоретической механики Функции 30 / 39
Дополнительные условия
Выражение формирует список квадратов только чётных
элементов из range(10):
1 [ x **2 f o r х in range (10) i f х % 2 == 0 ]
2
3 [0 , 4 , 16 , 36 , 64]
Эту же последовательность можно сгенерировать при помощи
функций map и filter:
1 l i s t ( map( lambda x : x * * 2 ,
2 f i l t e r ( lambda x : x%2==0, range (10 ) ) ) )
3
4 [0 , 4 , 16 , 36 , 64]
Кафедра Теоретической механики Функции 31 / 39
Выражения с вложенными циклами
Списочные выражения могут содержать несколько вложенных
циклов:
1 [ x+ ’− ’ +y f o r x in ( ’A ’ , ’B ’ ) f o r y in ( ’ 1 ’ , ’ 2 ’ ) ]
2
3 [ ’A−1 ’ , ’A−2 ’ , ’B−1 ’ , ’B−2 ’ ]
Кафедра Теоретической механики Функции 32 / 39
Функции-генераторы
При помощи ключевого слова yield создаются функции,
“лениво” генерирующие последовательности, подобно
функции range
В определении такой функции return заменяется на
yield:
1 def progression ( a1 , d , n = 5) :
2 # an = a1 + d ( n−1)
3 f o r i in range ( n ) :
4 y i e l d a1+d * i
>> progression (1 , 3)
< generator object progression at 0xa8dc68c4 >
>> l i s t ( progression (1 , 3) )
[1 , 4 , 7 , 10 , 13]
Кафедра Теоретической механики Функции 33 / 39
Функции-генераторы
Функция-генератор чисел Фибоначчи
1 def f i b ( count ) :
2 n0 , n1 = 0 , 1
3 f o r i in range ( count ) :
4 n0 , n1 = n1 , n0+n1
5 y i e l d n0
Вызов функции fib(10) вернёт ссылку на эту функцию,
которая будет работать как итератор, а само выполнение
функции “приостановится” на операторе yield.
Кафедра Теоретической механики Функции 34 / 39
Функции-генераторы
Функция-генератор чисел Фибоначчи
1 def f i b ( count ) :
2 n0 , n1 = 0 , 1
3 f o r i in range ( count ) :
4 n0 , n1 = n1 , n0+n1
5 y i e l d n0
Все элементы можно получить создав список по этому
итератору
1 >> l i s t ( f i b (10) )
2
3 [1 , 1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , 55]
Кафедра Теоретической механики Функции 34 / 39
Функции-генераторы
Функция-генератор чисел Фибоначчи
1 def f i b ( count ) :
2 n0 , n1 = 0 , 1
3 f o r i in range ( count ) :
4 n0 , n1 = n1 , n0+n1
5 y i e l d n0
Последовательно получить элементы можно при помощи
функции next:
1 a = f i b (10 )
2 >> next ( a )
3 1
4 >> next ( a )
5 1
6 >> next ( a )
7 2
Кафедра Теоретической механики Функции 34 / 39
Функции-генераторы
Функция-генератор чисел Фибоначчи
1 def f i b ( count ) :
2 n0 , n1 = 0 , 1
3 f o r i in range ( count ) :
4 n0 , n1 = n1 , n0+n1
5 y i e l d n0
yeld возвращает не результат работы функции а объект
типа итератор, для получения результата, поэтому этот
итератор можно использовать внутри конструкции for:
6 f o r i in f i b (10) :
7 p r i n t ( i , end= ’ , ’ )
8
9 1 ,1 ,2 ,3 ,5 ,8 ,13 ,21 ,34 ,55 ,
Кафедра Теоретической механики Функции 34 / 39
Пример
1 text = ” Feci quod potui , f a c i a n t meliora potentes ”
Формирование множества букв предложения:
2 l e t t e r s _ s e t = set ( text )
3 l e t t e r s _ s e t . remove ( ’ ’ )
4 l e t t e r s _ s e t . remove ( ’ , ’ )
Кафедра Теоретической механики Функции 35 / 39
Пример
1 text = ” Feci quod potui , f a c i a n t meliora potentes ”
Формирование множества букв предложения:
2 l e t t e r s _ s e t = set ( text )
3 l e t t e r s _ s e t . remove ( ’ ’ )
4 l e t t e r s _ s e t . remove ( ’ , ’ )
Формирование списка пар (буква, частота):
6 res = [ ( x , text . count ( x ) ) f o r x in l e t t e r s _ s e t ]
Кафедра Теоретической механики Функции 35 / 39
Пример
1 text = ” Feci quod potui , f a c i a n t meliora potentes ”
Формирование множества букв предложения:
2 l e t t e r s _ s e t = set ( text )
3 l e t t e r s _ s e t . remove ( ’ ’ )
4 l e t t e r s _ s e t . remove ( ’ , ’ )
Формирование списка пар (буква, частота):
6 res = [ ( x , text . count ( x ) ) f o r x in l e t t e r s _ s e t ]
Сортировка по второму элементу пары:
7 res . sort ( key = lambda pair : pair [ 1 ] , reverse = True )
Вывод первых пяти наиболее встречающихся букв:
8 p r i n t ( res [ : 5 ] )
[ ( ’ o ’ , 4) , ( ’ t ’ , 4) , ( ’ e ’ , 4) , ( ’ i ’ , 4) , ( ’ a ’ , 3) ]
Кафедра Теоретической механики Функции 35 / 39
Списочные выражения и генераторы
Списочное выражение формирует сразу весь список (list):
1 res = [ ( x , text . count ( x ) ) f o r x in l e t t e r s _ s e t ]
>> type ( res )
l i s t
Это выражение создаёт итератор, который будет вычислять
следующее значение по требованию:
1 res = ( ( x , text . count ( x ) ) f o r x in l e t t e r s _ s e t ] )
>> type ( res )
i t e r a t o r
Итератор можно пройти только один раз!
Кафедра Теоретической механики Функции 36 / 39
Функция zip
Функция zip(i1, i2, ...) объединяет
итераторы-аргументы и создаёт итератор по кортежам
элементов аргументов:
1 word = ” Qapla ”
2 f o r i , j in zip ( range ( len ( word ) ) , word ) :
3 p r i n t ( i +1 , ”буква” , j )
1 буква Q
2 буква a
3 буква p
4 буква l
5 буква a
Если аргументы-итераторы (последовательности) разной длины,
то результирующий итератор будет иметь длину минимального
аргумента.
Кафедра Теоретической механики Функции 37 / 39
Задание
Игра “Жизнь”
Колония клеток заданна множеством пар координат
(множество кортежей), например:
1 colony = { ( 1 , 1 ) , ( 2 , 1 ) , ( 3 , 1 ) , ( 3 , 2 ) , ( 2 , 3 ) }
Напишите функцию count_neighbors(x, y):
функция возвращает количество соседей клетки с
координатами x, y
Напишите функцию get_colony_area(colony):
функция возвращает множество клеток, граничащих с
колонией, включая клетки, занятые колонией
Кафедра Теоретической механики Функции 39 / 39
Игра “Жизнь”
Колония клеток заданна множеством пар координат
(множество кортежей), например:
1 colony = { ( 1 , 1 ) , ( 2 , 1 ) , ( 3 , 1 ) , ( 3 , 2 ) , ( 2 , 3 ) }
Напишите функцию next_generation(colony):
функция возвращает множество клеток следующего
поколения, количество умерших и родившихся клеток
Кафедра Теоретической механики Функции 39 / 39
Игра “Жизнь”
Колония клеток заданна множеством пар координат
(множество кортежей), например:
1 colony = { ( 1 , 1 ) , ( 2 , 1 ) , ( 3 , 1 ) , ( 3 , 2 ) , ( 2 , 3 ) }
Напишите функцию
def game_life ( born = ( 3 , ) , survives = ( 2 , 3 ) ) :
. . .
return next_generation
возвращающую функцию типа
next_generation(colony), которую можно
использовать для исследования эволюции колонии по
различным правилам, задаваемым параметрами born и
survives.
Кафедра Теоретической механики Функции 39 / 39

Mais conteúdo relacionado

Mais procurados

Лекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмовЛекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмовMikhail Kurnosov
 
Лекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьЛекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьMikhail Kurnosov
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиMikhail Kurnosov
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаMikhail Kurnosov
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиMikhail Kurnosov
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPython Meetup
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
Красота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonКрасота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonPython Meetup
 
Олег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и PythonОлег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и PythonYandex
 
Лекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовЛекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовMikhail Kurnosov
 
Лекция 4. Стеки и очереди
Лекция 4. Стеки и очередиЛекция 4. Стеки и очереди
Лекция 4. Стеки и очередиMikhail Kurnosov
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиMikhail Kurnosov
 
Лекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиЛекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиMikhail Kurnosov
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Mikhail Kurnosov
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Mikhail Kurnosov
 

Mais procurados (20)

Лекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмовЛекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмов
 
Лекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьЛекция 4: Стек. Очередь
Лекция 4: Стек. Очередь
 
Python
PythonPython
Python
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировка
 
Основы MATLAB. Лекция 1.
Основы MATLAB. Лекция 1.Основы MATLAB. Лекция 1.
Основы MATLAB. Лекция 1.
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
Алгоритмы сортировки
Алгоритмы сортировкиАлгоритмы сортировки
Алгоритмы сортировки
 
Красота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonКрасота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки Python
 
Олег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и PythonОлег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и Python
 
Лекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовЛекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмов
 
Лекция 4. Стеки и очереди
Лекция 4. Стеки и очередиЛекция 4. Стеки и очереди
Лекция 4. Стеки и очереди
 
Основы MATLAB. Программирование
Основы MATLAB. ПрограммированиеОсновы MATLAB. Программирование
Основы MATLAB. Программирование
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
 
Лекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиЛекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировки
 
Алгоритмы поиска
Алгоритмы поискаАлгоритмы поиска
Алгоритмы поиска
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)
 

Semelhante a Основы Python. Функции

Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Roman Brovko
 
Лекция 3. Декораторы и модуль functools.
Лекция 3. Декораторы и модуль functools.Лекция 3. Декораторы и модуль functools.
Лекция 3. Декораторы и модуль functools.Roman Brovko
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программированияAlex.Kolonitsky
 
Лекция 8. Итераторы, генераторы и модуль itertools.
 Лекция 8. Итераторы, генераторы и модуль itertools. Лекция 8. Итераторы, генераторы и модуль itertools.
Лекция 8. Итераторы, генераторы и модуль itertools.Roman Brovko
 
Matematicheskie trenazhery
Matematicheskie trenazheryMatematicheskie trenazhery
Matematicheskie trenazheryssusera868ff
 
Лекция о языке программирования Haskell
Лекция о языке программирования HaskellЛекция о языке программирования Haskell
Лекция о языке программирования Haskellhusniyarova
 
Использование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовИспользование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовТранслируем.бел
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)Smolensk Computer Science Club
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
 
Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.Roman Brovko
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотекPyNSK
 
Functional Programming in Python
Functional Programming in PythonFunctional Programming in Python
Functional Programming in Pythondudarev
 

Semelhante a Основы Python. Функции (20)

Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.
 
Decorators' recipes
Decorators' recipesDecorators' recipes
Decorators' recipes
 
Лекция 3. Декораторы и модуль functools.
Лекция 3. Декораторы и модуль functools.Лекция 3. Декораторы и модуль functools.
Лекция 3. Декораторы и модуль functools.
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программирования
 
Лекция 8. Итераторы, генераторы и модуль itertools.
 Лекция 8. Итераторы, генераторы и модуль itertools. Лекция 8. Итераторы, генераторы и модуль itertools.
Лекция 8. Итераторы, генераторы и модуль itertools.
 
Урок 3. Карринг и ленивые вычисления.
Урок 3. Карринг и ленивые вычисления.Урок 3. Карринг и ленивые вычисления.
Урок 3. Карринг и ленивые вычисления.
 
Matematicheskie trenazhery
Matematicheskie trenazheryMatematicheskie trenazhery
Matematicheskie trenazhery
 
Лекция о языке программирования Haskell
Лекция о языке программирования HaskellЛекция о языке программирования Haskell
Лекция о языке программирования Haskell
 
Scala on android
Scala on androidScala on android
Scala on android
 
Java. Методы
Java. Методы Java. Методы
Java. Методы
 
Использование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовИспользование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетов
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
 
8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)8 встреча — Язык программирования Python (В. Ананьев)
8 встреча — Язык программирования Python (В. Ананьев)
 
Charming python sc2-8
Charming python sc2-8Charming python sc2-8
Charming python sc2-8
 
Урок 6. Чистое лямбда-исчисление.
Урок 6. Чистое лямбда-исчисление. Урок 6. Чистое лямбда-исчисление.
Урок 6. Чистое лямбда-исчисление.
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотек
 
Functional Programming in Python
Functional Programming in PythonFunctional Programming in Python
Functional Programming in Python
 
Clojure #1
Clojure #1Clojure #1
Clojure #1
 

Mais de Theoretical mechanics department

Машинная арифметика. Cтандарт IEEE-754
Машинная арифметика. Cтандарт IEEE-754Машинная арифметика. Cтандарт IEEE-754
Машинная арифметика. Cтандарт IEEE-754Theoretical mechanics department
 
Docking with noncooperative spent orbital stage using probe-cone mechanism
Docking with noncooperative spent orbital stage using probe-cone mechanismDocking with noncooperative spent orbital stage using probe-cone mechanism
Docking with noncooperative spent orbital stage using probe-cone mechanismTheoretical mechanics department
 
Chaotic Behavior of a Passive Satellite During Towing by a Tether
Chaotic Behavior of a Passive Satellite During Towing by a TetherChaotic Behavior of a Passive Satellite During Towing by a Tether
Chaotic Behavior of a Passive Satellite During Towing by a TetherTheoretical mechanics department
 
Транспортно-пусковой контейнер для наноспутников типоразмера 3U, 3U+
Транспортно-пусковой контейнер для наноспутников типоразмера 3U, 3U+Транспортно-пусковой контейнер для наноспутников типоразмера 3U, 3U+
Транспортно-пусковой контейнер для наноспутников типоразмера 3U, 3U+Theoretical mechanics department
 
On problems of active space debris removal using tethered towing
On problems of active space debris removal using tethered towingOn problems of active space debris removal using tethered towing
On problems of active space debris removal using tethered towingTheoretical mechanics department
 
Методы решения нелинейных уравнений
Методы решения нелинейных уравненийМетоды решения нелинейных уравнений
Методы решения нелинейных уравненийTheoretical mechanics department
 
Отделение створок головного обтекателя
Отделение створок головного обтекателяОтделение створок головного обтекателя
Отделение створок головного обтекателяTheoretical mechanics department
 
The Dynamics of Tethered Debris With Flexible Appendages and Residual Fuel
The Dynamics of Tethered Debris With Flexible Appendages and Residual FuelThe Dynamics of Tethered Debris With Flexible Appendages and Residual Fuel
The Dynamics of Tethered Debris With Flexible Appendages and Residual FuelTheoretical mechanics department
 
Метод Й. Виттенбурга (Универсальные и цилиндрические шарниры)
Метод Й. Виттенбурга (Универсальные и цилиндрические шарниры)Метод Й. Виттенбурга (Универсальные и цилиндрические шарниры)
Метод Й. Виттенбурга (Универсальные и цилиндрические шарниры)Theoretical mechanics department
 

Mais de Theoretical mechanics department (20)

Космический мусор
Космический мусорКосмический мусор
Космический мусор
 
Модификация механизма Йо-Йо
Модификация механизма Йо-ЙоМодификация механизма Йо-Йо
Модификация механизма Йо-Йо
 
Python. Обработка ошибок
Python. Обработка ошибокPython. Обработка ошибок
Python. Обработка ошибок
 
Машинная арифметика. Cтандарт IEEE-754
Машинная арифметика. Cтандарт IEEE-754Машинная арифметика. Cтандарт IEEE-754
Машинная арифметика. Cтандарт IEEE-754
 
Chaotic motions of tethered satellites with low thrust
Chaotic motions of tethered satellites with low thrust Chaotic motions of tethered satellites with low thrust
Chaotic motions of tethered satellites with low thrust
 
Docking with noncooperative spent orbital stage using probe-cone mechanism
Docking with noncooperative spent orbital stage using probe-cone mechanismDocking with noncooperative spent orbital stage using probe-cone mechanism
Docking with noncooperative spent orbital stage using probe-cone mechanism
 
Deployers for nanosatellites
Deployers for nanosatellitesDeployers for nanosatellites
Deployers for nanosatellites
 
CubeSat separation dynamics
CubeSat separation dynamicsCubeSat separation dynamics
CubeSat separation dynamics
 
Chaotic Behavior of a Passive Satellite During Towing by a Tether
Chaotic Behavior of a Passive Satellite During Towing by a TetherChaotic Behavior of a Passive Satellite During Towing by a Tether
Chaotic Behavior of a Passive Satellite During Towing by a Tether
 
Основы MATLAB. Численные методы
Основы MATLAB. Численные методыОсновы MATLAB. Численные методы
Основы MATLAB. Численные методы
 
Транспортно-пусковой контейнер для наноспутников типоразмера 3U, 3U+
Транспортно-пусковой контейнер для наноспутников типоразмера 3U, 3U+Транспортно-пусковой контейнер для наноспутников типоразмера 3U, 3U+
Транспортно-пусковой контейнер для наноспутников типоразмера 3U, 3U+
 
On problems of active space debris removal using tethered towing
On problems of active space debris removal using tethered towingOn problems of active space debris removal using tethered towing
On problems of active space debris removal using tethered towing
 
Методы решения нелинейных уравнений
Методы решения нелинейных уравненийМетоды решения нелинейных уравнений
Методы решения нелинейных уравнений
 
Наноспутники формата кубсат
Наноспутники формата кубсатНаноспутники формата кубсат
Наноспутники формата кубсат
 
Отделение створок головного обтекателя
Отделение створок головного обтекателяОтделение створок головного обтекателя
Отделение створок головного обтекателя
 
1U-3U+ Cubesat Deployer by JSC SRC "Progress"
1U-3U+ Cubesat Deployer by JSC SRC "Progress"1U-3U+ Cubesat Deployer by JSC SRC "Progress"
1U-3U+ Cubesat Deployer by JSC SRC "Progress"
 
The Dynamics of Tethered Debris With Flexible Appendages and Residual Fuel
The Dynamics of Tethered Debris With Flexible Appendages and Residual FuelThe Dynamics of Tethered Debris With Flexible Appendages and Residual Fuel
The Dynamics of Tethered Debris With Flexible Appendages and Residual Fuel
 
Метод Кейна
Метод КейнаМетод Кейна
Метод Кейна
 
Метод отдельных тел
Метод отдельных телМетод отдельных тел
Метод отдельных тел
 
Метод Й. Виттенбурга (Универсальные и цилиндрические шарниры)
Метод Й. Виттенбурга (Универсальные и цилиндрические шарниры)Метод Й. Виттенбурга (Универсальные и цилиндрические шарниры)
Метод Й. Виттенбурга (Универсальные и цилиндрические шарниры)
 

Основы Python. Функции

  • 1. Функции Технологии и языки программирования Юдинцев В. В. Кафедра теоретической механики Самарский университет 21 октября 2016 г.
  • 2. Содержание 1 Объявление функций 2 Пространство имён 3 Функциональное программирование 4 Списочные выражения и генераторы 5 Задание Кафедра Теоретической механики Функции 2 / 39
  • 4. Объявление функции 1 def spring_fo rc e ( f0 , fk , h , x ) : 2 i f 0 < x < h : 3 res = 0 4 else : 5 res = f0 −(f0−fk ) * x / h 6 return res Ключевое слово def, имя функции, список аргументов Результат возвращается при помощи оператора return Если оператор return отсутствует, то функция возвращает None spring_forc e (10 , 2 , 0.1 , 0.05) 6 Кафедра Теоретической механики Функции 4 / 39
  • 5. Позиционные аргументы Объявление функции: 1 def spring_fo rc e ( f0 , fk , h , x ) : 2 . . . Вызов функции: spring_forc e ( 1 0 . 0 , 2.0 , 0.1 , 0.05) : Аргументы функции spring_force должны передаваться в том порядке, в котором это задумано автором функции При вызове функции необходимо помнить смысловой порядок аргументов Кафедра Теоретической механики Функции 5 / 39
  • 6. Именованные аргументы Объявление функции: 1 def spring_fo rc e ( f0 , fk , h , x ) : 2 . . . Возможна передача функции именованных аргументов: 1 f = spring_fo rc e ( h =0.3 , f0 =10 , fk =2 ,x =0.15) Порядок аргументов может быть произвольным Такой способ вызова позволяет исключить ошибки Кафедра Теоретической механики Функции 6 / 39
  • 7. Параметры по умолчанию 1 def height_max ( v0 , g = 9.81) : 2 ”’ 3 Максимальная высота подъёма груза, брошенного вверх 4 с начальной скоростью v0 (м/с), 5 при ускорении свободного падения g (м/с**2) 6 ”’ 7 return 0.5* v0 * * 2 / g Высота подъёма груза на Земле, g ≈ 9.81 м/с2 >> height_max (10 ) 5.098399102681758 Высота подъёма груза на Луне, g ≈ 1.62 м/с2 >> round ( height_max ( 1 0 , 1 . 6 2 ) ,1) 30.9 Кафедра Теоретической механики Функции 7 / 39
  • 8. Параметры по умолчанию При использовании ссылочных типов в параметрах по умолчанию их значение при изменении внутри функции сохраняется и до следующего вызова этой функции: 1 def add_element_to_b ( a , b = [ ] ) : 2 b . append ( a ) 3 return b При первом вызове функции: b – пустой список add_element_to_b ( 4 ) [ 4 ] При втором вызове функции: b “вспомнит” последнее значение add_element_to_b ( 5 ) [4 , 5] Кафедра Теоретической механики Функции 8 / 39
  • 9. Параметры по умолчанию Исправленный вариант 1 def add_element_to_b ( a , b=None ) : 2 i f b == None : 3 b = [ ] 4 b . append ( a ) 5 return b >> add_element_to_b ( 4 ) [ 4 ] >> add_element_to_b ( 5 ) [ 5 ] Кафедра Теоретической механики Функции 9 / 39
  • 10. Переменное число аргументов Позиционные аргументы Упаковка позиционных аргументов в кортеж args 1 def zeros ( * args ) : 2 p r i n t ( ’Аргументы : ’ , args ) 3 i f len ( arg ) == 1: 4 return [ 0 ] * args [ 0 ] 5 i f len ( arg ) == 2: 6 return [ [ 0 ] * args [ 0 ] ] * args [ 1 ] Переданные аргументы будут собраны в кортеж args >> zeros ( 3 , 3 ) Аргументы: (3 , 3) [ [ 0 , 0 , 0] , [0 , 0 , 0] , [0 , 0 , 0 ] ] Кафедра Теоретической механики Функции 10 / 39
  • 11. Переменное число аргументов Позиционные аргументы 1 def zeros ( n1 , * args ) : 2 i f len ( args ) == 0: 3 return [ 0 ] * n1 4 i f len ( args ) == 1: 5 return [ [ 0 ] * n1 ] * args [ 0 ] >> zeros ( ) TypeError : zeros ( ) missing 1 required p o s i t i o n a l argument : ’ n1 ’ Кафедра Теоретической механики Функции 11 / 39
  • 12. Переменное число аргументов Позиционные аргументы 1 def zeros ( n1 , * args ) : 2 i f len ( args ) == 0: 3 return [ 0 ] * n1 4 i f len ( args ) == 1: 5 return [ [ 0 ] * n1 ] * args [ 0 ] >> zeros ( ) TypeError : zeros ( ) missing 1 required p o s i t i o n a l argument : ’ n1 ’ >> zeros ( 3 ) [0 , 0 , 0] Кафедра Теоретической механики Функции 11 / 39
  • 13. Переменное число аргументов Именованные аргументы 1 def zeros ( * * kwargs ) : 2 i f kwargs . get ( ’ dim1 ’ ) : 3 res = [ 0 ] * kwargs [ ’ dim1 ’ ] 4 i f kwargs . get ( ’ dim2 ’ ) : 5 res = [ res ] * kwargs [ ’ dim2 ’ ] 6 return res Переданные аргументы будут собраны в словарь kwargs >> zeros ( dim1 =3) [0 , 0 , 0] >> zeros ( dim1=2 , dim2 =2) [ [ 0 , 0] , [0 , 0 ] ] Кафедра Теоретической механики Функции 12 / 39
  • 14. Распаковка позиционных аргументов 1 def zeros ( n1 , * args ) : 2 row = [ 0 ] * n1 3 i f len ( args ) == 0: 4 return row 5 i f len ( args ) == 1: 6 return [ row ] * args [ 0 ] Вызвать функцию zeros можно, передав два параметра >> zeros ( 2 , 2 ) [ [ 0 , 0] , [0 , 0 ] ] или один список или кортеж из двух элементов с модификатором * >> dim = ( 2 , 2 ) >> zeros ( * dim ) [ [ 0 , 0] , [0 , 0 ] ] Кафедра Теоретической механики Функции 13 / 39
  • 15. Распаковка именованных аргументов 1 def zeros ( * * kwargs ) : 2 i f kwargs . get ( ’ dim1 ’ ) : 3 res = [ 0 ] * kwargs [ ’ dim1 ’ ] 4 i f kwargs . get ( ’ dim2 ’ ) : 5 res = [ res ] * kwargs [ ’ dim2 ’ ] 6 return res Вызвать функцию zeros можно, передав два параметра >> zeros ( dim1=2 , dim1 =2) [ [ 0 , 0] , [0 , 0 ] ] или один словарь с модификатором ** >> dims = ( ’ dim1 ’ : 2 , ’ dim2 ’ : 2) >> zeros ( * * dims ) [ [ 0 , 0] , [0 , 0 ] ] Кафедра Теоретической механики Функции 14 / 39
  • 16. Документирование функции 1 import numpy as np 2 3 def o r b i t a l _ v e l o c i t y ( height ) : 4 ”’ Скорость движения по круговой орбите вокруг Земли км/с 5 height - высота орбиты в км ”’ 6 Rz = 6371 7 mu = 398600.4418 8 return np . sqrt (mu/ ( Rz+ height ) ) >> help ( o r b i t a l _ v e l o c i t y ) Help on function orbital_velocity in module __main__: orbital_velocity(height) Скорость движения по круговой орбите вокруг Земли км/с height - высота орбиты в км Кафедра Теоретической механики Функции 15 / 39
  • 17. Имя функции как переменная. Замыкания 1 def step_function ( x0 , y0 , y1 ) : 2 def step ( x ) : 3 i f x<x0 : 4 return y0 5 else : 6 return y1 7 return step Вызов функции step_function создает объект функцию step c заданными значениями x0, y0, y1: unit_step = step_function ( 0 . 0 , 0.0 , 1 . 0 ) >> unit_step ( −2) 0 >> unit_step ( 1 ) 1 Кафедра Теоретической механики Функции 16 / 39
  • 18. Замыкание Функция (внутренняя), определяемая в теле другой (внешней) функции и создаваемая каждый раз во время выполнения внешней функции Внутренняя функция содержит ссылки на локальные переменные внешней функции Кафедра Теоретической механики Функции 17 / 39
  • 20. Локальные переменные При каждом вызове функции создаётся новое локальное пространство имён 1 a = 1 # Глобальная переменная модуля 2 3 def fun ( x ) : 4 a = 2 # Локальная переменная 5 return x + a >> fun ( 3 ) 5 >> a 1 Кафедра Теоретической механики Функции 19 / 39
  • 21. Области видимости. Правило LEGB При использовании имени переменной внутри функции интерпретатор последовательно ищет соответствующий этому имени объект в локальной (L) области, в объемлющей (E) области, в глобальной (G) области, а затем во встроенной (B) 1 a = 1 # Глобальная переменная модуля 2 3 def parent_fun ( x ) : 4 b = 10 5 def fun ( x ) : 6 return x + a + b 7 return fun ( x ) >> parent_fun ( 7 ) 18 Кафедра Теоретической механики Функции 20 / 39
  • 22. Инструкция global 1 a = 1 # Глобальная переменная модуля 2 def fun ( x ) : 3 b = 10 + a # a из глобальной области 4 a = 1 # ОШИБКА! 5 return b Local variable ’a’ referenced before assignment Изменить глобальную переменную можно, объявив её глобальной: 1 a = 1 # Глобальная переменная модуля 2 def fun ( x ) : 3 global a 4 a = 3 5 b = 10 + a 6 return b Кафедра Теоретической механики Функции 21 / 39
  • 23. Инструкция nonlocal При необходимости изменить переменную объемлющей области её необходимо объявить nonlocal 1 a = 1 # Глобальная переменная модуля 2 def fun ( x ) : 3 a = 10 # Локальная переменная модуля функции fun 4 def inner_fun ( x ) : 5 nonlocal a # Переменная из объемлющей области 6 a = a + 5 # Было 10, стало 15 7 b = a + x 8 return b 9 res = inner_fun ( x ) 10 return ( a , res ) >> fun ( 1 ) (15 , 16) Кафедра Теоретической механики Функции 22 / 39
  • 25. Анонимная (лямбда) функция Короткие однострочные функции могут быть объявлены при помощи lambda-функций 1 mean = lambda x , y : ( x + y ) *0.5 Вызов функции mean ( 1 , 6 ) 3.5 Лямбда-функция обычно используется в паре с функциями filter, map, sort Кафедра Теоретической механики Функции 24 / 39
  • 26. Функция filter Применение лямбда-функции с функцией filter 1 >> data = {1 , 7 , 3 , 2 , 6 , 8} 2 3 >> f i l t e r ( lambda x : x % 2 == 0 , data ) 4 5 {2 , 6 , 8} Кафедра Теоретической механики Функции 25 / 39
  • 27. Функция filter Применение лямбда-функции с функцией filter data = {1 , 7 , 3 , 2 , 6 , 8} def less_than_5 ( x ) : return x < 5 >> f i l t e r ( less_than_5 , data ) {1 , 3 , 2} Кафедра Теоретической механики Функции 26 / 39
  • 28. Функция filter Применение лямбда-функции с функцией filter data = {1 , 7 , 3 , 2 , 6 , 8} def less_than_5 ( x ) : return x < 5 >> f i l t e r ( less_than_5 , data ) {1 , 3 , 2} но лучше: def less_than ( value ) : return lambda x : x < value >> f i l t e r ( less_than ( 5 ) , data ) {1 , 3 , 2} или совсем просто: >> f i l t e r ( lambda x : x < 5 , data ) Кафедра Теоретической механики Функции 26 / 39
  • 29. Функция map Функция map(function, data) применяет function к каждому элементу последовательности data: 1 data = [4 ,5 ,6 ,7] 2 3 >> map( lambda x : x * * 2 , data ) 4 < b u i l t i n s . map at 0xa8d36bcc > Функция map – ленивая функция. Функция возвращает не весь обработанный список, а ссылку на функцию-генератор, которая вычисляет значения по мере необходимости, подобно функции range: 1 >> l i s t (map( lambda x : x * * 2 , data ) ) 2 [16 , 25 , 36 , 49] Кафедра Теоретической механики Функции 27 / 39
  • 30. Функция map Функцию map можно использовать для обработки нескольких списков: 1 vec1 = [1 ,4 ,3 ,7] 2 3 vec2 = [8 ,5 ,1 ,3] 4 5 prod = map( lambda x , y : x * y , vec1 , vec2 ) >> scalar_product = sum ( prod ) 52 Кафедра Теоретической механики Функции 28 / 39
  • 32. Списочные выражения Вместо функции map 1 data = [10 , 12 , 13 , 14] 2 3 >> l i s t (map( lambda x : x * * 2 , data ) ) 4 [16 , 25 , 36 , 49] можно использовать списочные выражения 1 res = [ x **2 f o r x in data ] 2 p r i n t ( res ) 3 4 [16 , 25 , 36 , 49] Кафедра Теоретической механики Функции 30 / 39
  • 33. Дополнительные условия Выражение формирует список квадратов только чётных элементов из range(10): 1 [ x **2 f o r х in range (10) i f х % 2 == 0 ] 2 3 [0 , 4 , 16 , 36 , 64] Эту же последовательность можно сгенерировать при помощи функций map и filter: 1 l i s t ( map( lambda x : x * * 2 , 2 f i l t e r ( lambda x : x%2==0, range (10 ) ) ) ) 3 4 [0 , 4 , 16 , 36 , 64] Кафедра Теоретической механики Функции 31 / 39
  • 34. Выражения с вложенными циклами Списочные выражения могут содержать несколько вложенных циклов: 1 [ x+ ’− ’ +y f o r x in ( ’A ’ , ’B ’ ) f o r y in ( ’ 1 ’ , ’ 2 ’ ) ] 2 3 [ ’A−1 ’ , ’A−2 ’ , ’B−1 ’ , ’B−2 ’ ] Кафедра Теоретической механики Функции 32 / 39
  • 35. Функции-генераторы При помощи ключевого слова yield создаются функции, “лениво” генерирующие последовательности, подобно функции range В определении такой функции return заменяется на yield: 1 def progression ( a1 , d , n = 5) : 2 # an = a1 + d ( n−1) 3 f o r i in range ( n ) : 4 y i e l d a1+d * i >> progression (1 , 3) < generator object progression at 0xa8dc68c4 > >> l i s t ( progression (1 , 3) ) [1 , 4 , 7 , 10 , 13] Кафедра Теоретической механики Функции 33 / 39
  • 36. Функции-генераторы Функция-генератор чисел Фибоначчи 1 def f i b ( count ) : 2 n0 , n1 = 0 , 1 3 f o r i in range ( count ) : 4 n0 , n1 = n1 , n0+n1 5 y i e l d n0 Вызов функции fib(10) вернёт ссылку на эту функцию, которая будет работать как итератор, а само выполнение функции “приостановится” на операторе yield. Кафедра Теоретической механики Функции 34 / 39
  • 37. Функции-генераторы Функция-генератор чисел Фибоначчи 1 def f i b ( count ) : 2 n0 , n1 = 0 , 1 3 f o r i in range ( count ) : 4 n0 , n1 = n1 , n0+n1 5 y i e l d n0 Все элементы можно получить создав список по этому итератору 1 >> l i s t ( f i b (10) ) 2 3 [1 , 1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , 55] Кафедра Теоретической механики Функции 34 / 39
  • 38. Функции-генераторы Функция-генератор чисел Фибоначчи 1 def f i b ( count ) : 2 n0 , n1 = 0 , 1 3 f o r i in range ( count ) : 4 n0 , n1 = n1 , n0+n1 5 y i e l d n0 Последовательно получить элементы можно при помощи функции next: 1 a = f i b (10 ) 2 >> next ( a ) 3 1 4 >> next ( a ) 5 1 6 >> next ( a ) 7 2 Кафедра Теоретической механики Функции 34 / 39
  • 39. Функции-генераторы Функция-генератор чисел Фибоначчи 1 def f i b ( count ) : 2 n0 , n1 = 0 , 1 3 f o r i in range ( count ) : 4 n0 , n1 = n1 , n0+n1 5 y i e l d n0 yeld возвращает не результат работы функции а объект типа итератор, для получения результата, поэтому этот итератор можно использовать внутри конструкции for: 6 f o r i in f i b (10) : 7 p r i n t ( i , end= ’ , ’ ) 8 9 1 ,1 ,2 ,3 ,5 ,8 ,13 ,21 ,34 ,55 , Кафедра Теоретической механики Функции 34 / 39
  • 40. Пример 1 text = ” Feci quod potui , f a c i a n t meliora potentes ” Формирование множества букв предложения: 2 l e t t e r s _ s e t = set ( text ) 3 l e t t e r s _ s e t . remove ( ’ ’ ) 4 l e t t e r s _ s e t . remove ( ’ , ’ ) Кафедра Теоретической механики Функции 35 / 39
  • 41. Пример 1 text = ” Feci quod potui , f a c i a n t meliora potentes ” Формирование множества букв предложения: 2 l e t t e r s _ s e t = set ( text ) 3 l e t t e r s _ s e t . remove ( ’ ’ ) 4 l e t t e r s _ s e t . remove ( ’ , ’ ) Формирование списка пар (буква, частота): 6 res = [ ( x , text . count ( x ) ) f o r x in l e t t e r s _ s e t ] Кафедра Теоретической механики Функции 35 / 39
  • 42. Пример 1 text = ” Feci quod potui , f a c i a n t meliora potentes ” Формирование множества букв предложения: 2 l e t t e r s _ s e t = set ( text ) 3 l e t t e r s _ s e t . remove ( ’ ’ ) 4 l e t t e r s _ s e t . remove ( ’ , ’ ) Формирование списка пар (буква, частота): 6 res = [ ( x , text . count ( x ) ) f o r x in l e t t e r s _ s e t ] Сортировка по второму элементу пары: 7 res . sort ( key = lambda pair : pair [ 1 ] , reverse = True ) Вывод первых пяти наиболее встречающихся букв: 8 p r i n t ( res [ : 5 ] ) [ ( ’ o ’ , 4) , ( ’ t ’ , 4) , ( ’ e ’ , 4) , ( ’ i ’ , 4) , ( ’ a ’ , 3) ] Кафедра Теоретической механики Функции 35 / 39
  • 43. Списочные выражения и генераторы Списочное выражение формирует сразу весь список (list): 1 res = [ ( x , text . count ( x ) ) f o r x in l e t t e r s _ s e t ] >> type ( res ) l i s t Это выражение создаёт итератор, который будет вычислять следующее значение по требованию: 1 res = ( ( x , text . count ( x ) ) f o r x in l e t t e r s _ s e t ] ) >> type ( res ) i t e r a t o r Итератор можно пройти только один раз! Кафедра Теоретической механики Функции 36 / 39
  • 44. Функция zip Функция zip(i1, i2, ...) объединяет итераторы-аргументы и создаёт итератор по кортежам элементов аргументов: 1 word = ” Qapla ” 2 f o r i , j in zip ( range ( len ( word ) ) , word ) : 3 p r i n t ( i +1 , ”буква” , j ) 1 буква Q 2 буква a 3 буква p 4 буква l 5 буква a Если аргументы-итераторы (последовательности) разной длины, то результирующий итератор будет иметь длину минимального аргумента. Кафедра Теоретической механики Функции 37 / 39
  • 46. Игра “Жизнь” Колония клеток заданна множеством пар координат (множество кортежей), например: 1 colony = { ( 1 , 1 ) , ( 2 , 1 ) , ( 3 , 1 ) , ( 3 , 2 ) , ( 2 , 3 ) } Напишите функцию count_neighbors(x, y): функция возвращает количество соседей клетки с координатами x, y Напишите функцию get_colony_area(colony): функция возвращает множество клеток, граничащих с колонией, включая клетки, занятые колонией Кафедра Теоретической механики Функции 39 / 39
  • 47. Игра “Жизнь” Колония клеток заданна множеством пар координат (множество кортежей), например: 1 colony = { ( 1 , 1 ) , ( 2 , 1 ) , ( 3 , 1 ) , ( 3 , 2 ) , ( 2 , 3 ) } Напишите функцию next_generation(colony): функция возвращает множество клеток следующего поколения, количество умерших и родившихся клеток Кафедра Теоретической механики Функции 39 / 39
  • 48. Игра “Жизнь” Колония клеток заданна множеством пар координат (множество кортежей), например: 1 colony = { ( 1 , 1 ) , ( 2 , 1 ) , ( 3 , 1 ) , ( 3 , 2 ) , ( 2 , 3 ) } Напишите функцию def game_life ( born = ( 3 , ) , survives = ( 2 , 3 ) ) : . . . return next_generation возвращающую функцию типа next_generation(colony), которую можно использовать для исследования эволюции колонии по различным правилам, задаваемым параметрами born и survives. Кафедра Теоретической механики Функции 39 / 39