Основы языка Питон: функции, элементы функционального программирования, списочные выражения, генераторы. Презентация к лекции курса "Технологии и языки программирования".
Метод Й. Виттенбурга (Универсальные и цилиндрические шарниры)
Основы 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