0% found this document useful (0 votes)
61 views18 pages

Python Functions

This document discusses functions and functional programming in Python. It covers topics such as defining functions, parameters, scopes, closures, higher-order functions using map, filter and reduce, list comprehensions, and recursion. Examples of each concept are provided in Python code snippets.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
61 views18 pages

Python Functions

This document discusses functions and functional programming in Python. It covers topics such as defining functions, parameters, scopes, closures, higher-order functions using map, filter and reduce, list comprehensions, and recursion. Examples of each concept are provided in Python code snippets.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 18

Python: ôóíêöèè, ôóíêöèîíàëüíîå

ïðîãðàììèðîâàíèå

Àëåêñàíäð Ìèõàéëîâ

Àëåêñàíäð Ìèõàéëîâ Python: ôóíêöèè, ôóíêöèîíàëüíîå ïðîãðàììèðîâàíèå


Ôóíêöèè

Ïðîñòåéøàÿ ôóíêöèÿ íà Python:


> > def empty_func () :
.. pass

Ôóíêöèè îáúÿâëÿþòñÿ ñ êëþ÷åâûì ñëîâîì def


Ôóíêöèÿ - ýòî îáúåêò
Ïóñòûå ôóíêöèè íåäîïóñòèìû

Àëåêñàíäð Ìèõàéëîâ Python: ôóíêöèè, ôóíêöèîíàëüíîå ïðîãðàììèðîâàíèå


Ôóíêöèè

Áîëåå ñëîæíàÿ ôóíêöèÿ


> > def gcd (a , b ) :
.. """ Greatest Common
.. Divisor """ # docstring
.. while a ! = 0 :
.. a , b = b %a , a
.. return b

docstring ìîæíî ïîëó÷èòü òàê:


print gcd . __doc__

Ôóíêöèÿ áåç return âîçâðàùàåò ñïåöèàëüíîå çíà÷åíèå None


Ïàðàìåòðû â ôóíêöèè ïåðåäàþòñÿ ïî-õèòðîìó

Àëåêñàíäð Ìèõàéëîâ Python: ôóíêöèè, ôóíêöèîíàëüíîå ïðîãðàììèðîâàíèå


Ïåðåäà÷à ïàðàìåòðîâ

Call by object, call by sharing, call by object reference


> > def magic ( v ) :
.. v . append ( " Blue " )
..
> > list = [ " Red " , " Green "]
> > magic ( list )
> > print list
[ ' Red ' , ' Green ' , ' Blue ']

> > def magic2 ( v ) :


.. v = [ " Hue " , " Saturation " , " Value " ]
..
> > magic2 ( list )
> > print list
[ ' Red ' , ' Green ' , ' Blue ']

Àëåêñàíäð Ìèõàéëîâ Python: ôóíêöèè, ôóíêöèîíàëüíîå ïðîãðàììèðîâàíèå


Ôóíêöèè

Ôóíêöèè ìîæíî ïðèñâàèâàòü:


> > d = gcd
> > print d ( 14 , 7 )
7

Áëàãîäàðÿ êîðòåæàì, èç ôóíêöèè ìîæíî âîçâðàùàòü


ìíîæåñòâî ýëåìåíòîâ:
> > def multiout () :
.. return 1 , 2 , 3
> > print multiout ()
(1 , 2 , 3 )

Àëåêñàíäð Ìèõàéëîâ Python: ôóíêöèè, ôóíêöèîíàëüíîå ïðîãðàììèðîâàíèå


Îáëàñòü âèäèìîñòè - Scope

 ëþáîé ìîìåíò âûïîíåíèÿ ïðîãðàììû ñóùåñòâóåò, êàê


ìèíèìóì, 3 îáëàñòè âèäèìîñòè:
Ëîêàëüíàÿ
Ñðåäíÿÿ (ãëîáàëüíûå èìåíà ìîäóëÿ)
Âíåøíÿÿ (âñòðîåííûå èìåíà)

Àëåêñàíäð Ìèõàéëîâ Python: ôóíêöèè, ôóíêöèîíàëüíîå ïðîãðàììèðîâàíèå


Ôóíêöèè

Ïåðåäà÷à íåèçâåñòíîãî êîëè÷åñòâà ïàðàìåòðîâ:


> > def avg ( * args ) :
.. sum = 0 . 0
.. for arg in args :
.. sum + = arg
.. return sum / len ( args )
..
> > avg (1 , 2 )
1.5
> > avg (3 , 5 , 2 )
3 . 3333333333333335

Òàêæå ìîæíî ïåðåäàâàòü èìåíîâàííûå ïàðàìåòðû. Â òàêîì


ñëó÷àå, èçìåíÿåòñÿ ñèãíàòóðà:
> > def avg ( * * args ) :

Òåïåðü ðàáîòà ñ args àíàëîãè÷íà ðàáîòå ñî ñëîâàðåì

Àëåêñàíäð Ìèõàéëîâ Python: ôóíêöèè, ôóíêöèîíàëüíîå ïðîãðàììèðîâàíèå


Ôóíêöèè

Ïàðàìåòðû ïî-óìîë÷àíèþ:
> > def greet ( adr = " mr . " , name = " X " ) :
.. print " Hello " + adr + name + " ! "
..
> > greet ( " mrs . " , " Anderson " ) # Íîðìàëüíûé âûçîâ
Hello mrs . Anderson !
> > greet ( name = " Gates " ) # Èìåíîâàííûé ïàðàìåòð
Hello mr . Gates !
> > greet () # Âûçîâ ñ ïàðàìåòðàìè ïî - óìîë÷àíèþ
Hello mr .X !

Àëåêñàíäð Ìèõàéëîâ Python: ôóíêöèè, ôóíêöèîíàëüíîå ïðîãðàììèðîâàíèå


Ëÿìáäà-ôóíêöèè

Ëÿìáäû ìîæíî âûçûâàòü ñðàçó ïîñëå îïðåäåëåíèÿ


> > ( lambda x : x * x )( 5 )
25

Ôóíêöèè ìîæíî çàäàâàòü ÷åðåç ëÿìáäû


> > foo = lambda x : x * x
> > print foo ( 7 )
49

Ëÿìáäà-ôóíêöèÿ - íå èìåíîâàííàÿ ôóíêöèÿ


Ôóíêöèè â Python - îáúåêòû ïåðâîãî êëàññà

Àëåêñàíäð Ìèõàéëîâ Python: ôóíêöèè, ôóíêöèîíàëüíîå ïðîãðàììèðîâàíèå


Çàìûêàíèÿ

Çàìûêàíèå (àíãë. closure) â ïðîãðàììèðîâàíèè - ïðîöåäóðà,


êîòîðàÿ ññûëàåòñÿ íà ñâîáîäíûå ïåðåìåííûå â ñâîåì
ëåêñè÷åñêîì êîíòåêñòå.
>> def make_adder ( x ) :
.. def adder ( n ) :
.. # Çàõâàò ïåðìåííîé " x " èç âíåøíåãî êîíòåêñòà
.. return x + n
.. return adder
..
>> f = make_adder ( 10 )
>> print f ( 5 ) # 15
15
>> f = make_adder ( 15 )
>> print f ( 5 ) # 20
20

Àëåêñàíäð Ìèõàéëîâ Python: ôóíêöèè, ôóíêöèîíàëüíîå ïðîãðàììèðîâàíèå


Ôóíêöèîíàëüíîå ïðîãðàììèðîâàíèå â Python

Ýëåìåíòû ôóíêöèîíàëüíîãî ïðîãðàììèðîâàíèÿ â Python


Ôóíêöèè âûñøèõ ïîðÿäêîâ
Ñïèñî÷íûå âûðàæåíèÿ
Ðåêóðñèÿ

Àëåêñàíäð Ìèõàéëîâ Python: ôóíêöèè, ôóíêöèîíàëüíîå ïðîãðàììèðîâàíèå


Ôóíêöèè âûñøèõ ïîðÿäêîâ

Ôóíêöèÿ map() ïîçâîëÿåò îáðàáàòûâàòü îäíó èëè íåñêîëüêî


ïîñëåäîâàòåëüíîñòåé ñ ïîìîùüþ çàäàííîé ôóíêöèè:
> > list1 = [7 , 2 , 3 , 10 , 12 ]
> > list2 = [ -1 , 1 , -5 , 4 , 6 ]
> > map ( lambda x , y : x *y , list1 , list2 )
[ -7 , 2 , - 15 , 40 , 72 ]

Àëåêñàíäð Ìèõàéëîâ Python: ôóíêöèè, ôóíêöèîíàëüíîå ïðîãðàììèðîâàíèå


Ôóíêöèè âûñøèõ ïîðÿäêîâ

Ôóíêöèÿ lter() ïîçâîëÿåò ôèëüòðîâàòü çíà÷åíèÿ


ïîñëåäîâàòåëüíîñòè. Â ðåçóëüòèðóþùåì ñïèñêå òîëüêî òå
çíà÷åíèÿ, äëÿ êîòîðûõ çíà÷åíèå ôóíêöèè äëÿ ýëåìåíòà
èñòèííî:
> > list = [ 10 , 4 , 2 , -1 , 6 ]
> > filter ( lambda x : x < 5 , list )
[4 , 2 , - 1 ]

Àëåêñàíäð Ìèõàéëîâ Python: ôóíêöèè, ôóíêöèîíàëüíîå ïðîãðàììèðîâàíèå


Ôóíêöèè âûñøèõ ïîðÿäêîâ

Äëÿ îðãàíèçàöèè öåïî÷å÷íûõ âû÷èñëåíèé â ñïèñêå ìîæíî


èñïîëüçîâàòü ôóíêöèþ reduce():
> > list = [2 , 3 , 4 , 5 , 6 ]
> > reduce ( lambda res , x : res *x , list , 1 )
720

Âû÷èñëåíèÿ ïðîèñõîäÿò â ñëåäóþùåì ïîðÿäêå:


((((1*2)*3)*4)*5)*6

Àëåêñàíäð Ìèõàéëîâ Python: ôóíêöèè, ôóíêöèîíàëüíîå ïðîãðàììèðîâàíèå


Ñïèñî÷íûå âûðàæåíèÿ - List comprehension

> > S = [ x * * 2 for x in range ( 10 ) ]


> > V = [ 2 * * i for i in range ( 10 ) ]
> > M = [ x for x in S if x % 2 = = 0 ]
>>
> > print S ; print V ; print M
[0 , 1 , 4 , 9 , 16 , 25 , 36 , 49 , 64 , 81 ]
[1 , 2 , 4 , 8 , 16 , 32 , 64 , 128 , 256 , 512 ]
[0 , 4 , 16 , 36 , 64 ]

Àëåêñàíäð Ìèõàéëîâ Python: ôóíêöèè, ôóíêöèîíàëüíîå ïðîãðàììèðîâàíèå


List comprehension vs map and lter

Lc áûñòðåå, åñëè â map íåîáõîäèìî ïåðåäàâàòü ëÿìáäó:


python - mtimeit - s ' xs = range ( 10 ) ' ' map ( lambda x : x +2 , xs ) '
100000 loops , best of 3 : 4 . 24 usec per loop
python - mtimeit - s ' xs = range ( 10 ) ' '[ x + 2 for x in xs ] '
1000000 loops , best of 3 : 1 . 74 usec per loop

Àëåêñàíäð Ìèõàéëîâ Python: ôóíêöèè, ôóíêöèîíàëüíîå ïðîãðàììèðîâàíèå


functools

functools - ìîäóëü ôóíêöèé âûñøåãî ïîðÿäêà.


@functools.total _ordering (cls)
äåêîðàòîð, ïî îäíîìó èëè áîëåå îïåðàòîðó ñðàâíåíèÿ
ãåíåðèðóåò îñòàëüíûå
@functools.lru _cache(maxsize)
äåêîðàòîð, êåøèðóåò äî maxsize âûçîâîâ ôóíêöèè
functools.partial(func, ∗args, ∗ ∗ keywords)
Ñîçäàåò partial îáúåêò, êîòîðûé âåäåò ñåáÿ êàê func ñ
àðãóìåíòàìè args è keywords. Ïðèìåð:
> > from functools import partial
> > basetwo = partial ( int , base = 2 )
> > basetwo ( ' 10010 ')
18

Àëåêñàíäð Ìèõàéëîâ Python: ôóíêöèè, ôóíêöèîíàëüíîå ïðîãðàììèðîâàíèå


Ñïàñèáî çà âíèìàíèå!

Àëåêñàíäð Ìèõàéëîâ Python: ôóíêöèè, ôóíêöèîíàëüíîå ïðîãðàììèðîâàíèå

You might also like