{\rtf1\ansi\ansicpg1252\deff0 {\fonttbl {\f0\fnil\fcharset0\fprq2\fttruetype \uc1\u23435 ?\u20307 ?;} {\f1\froman\fcharset0\fprq2\fttruetype Times New Roman;} {\f2\fswiss\fcharset0\fprq2\fttruetype Arial;} {\f3\fswiss\fcharset0\fprq2\ftnil Dingbats;} {\f4\froman\fcharset0\fprq2\fttruetype Symbol;} {\f5\fmodern\fcharset0\fprq1\fttruetype Courier New;}} {\colortbl \red0\green0\blue0; \red255\green255\blue255; \red128\green128\blue128; \red255\green0\blue0;} {\stylesheet {\s1\fi-431\li720\sbasedon29\snext29Contents 1;} {\s2\fi-431\li1440\sbasedon29\snext29Contents 2;} {\s3\fi-431\li2160\sbasedon29\snext29Contents 3;} {\s8\fi-431\li720\sbasedon29Lower Roman List;} {\s5\tx431\sbasedon25\snext29Numbered Heading 1;} {\s6\tx431\sbasedon26\snext29Numbered Heading 2;} {\s7\fi-431\li720Square List;} {\*\cs11\sbasedon29Endnote Text;} {\s4\fi-431\li2880\sbasedon29\snext29Contents 4;} {\s9\fi-431\li720Diamond List;} {\s10\fi-431\li720Numbered List;} {\*\cs12\fs20\superEndnote Reference;} {\s13\fi-431\li720Triangle List;} {\s14\tx431\sbasedon27\snext29Numbered Heading 3;} {\s15\fi-431\li720Dashed List;} {\s16\fi-431\li720\sbasedon10Upper Roman List;} {\s17\sb440\sa60\f2\fs24\b\sbasedon29\snext29Heading 4;} {\s18\fi-431\li720Heart List;} {\s36\fi-431\li720Box List;} {\*\cs20\fs20Reference;} {\s21\fi-431\li720\sbasedon10Upper Case List;} {\s22\fi-431\li720Bullet List;} {\s23\fi-431\li720Hand List;} {\*\cs24\fs20\sbasedon29Footnote Text;} {\s25\sb440\sa60\f2\fs34\b\sbasedon29\snext29Heading 1;} {\s26\sb440\sa60\f2\fs28\b\sbasedon29\snext29Heading 2;} {\s19\qc\sb240\sa120\f2\fs32\b\sbasedon29\snext29Contents Header;} {\s28\fi-431\li720Tick List;} {\s27\sb440\sa60\f2\fs24\b\sbasedon29\snext29Heading 3;} {\s30\fi-431\li720\sbasedon10Lower Case List;} {\s31\li1440\ri1440\sa120\sbasedon29Block Text;} {\s32\f0\fs20\lang2052\snext32\uc1\u26222 ?\u-28646 ?\u-30616 ?\u26684 ?;} {\s38\f5\sbasedon29Plain Text;} {\s34\tx1584\sbasedon5\snext29Section Heading;} {\s35\fi-431\li720Implies List;} {\s29\f1\fs24\lang2052Normal;} {\s37\fi-431\li720Star List;} {\*\cs33\fs20\superFootnote Reference;} {\s39\tx1584\sbasedon5\snext29Chapter Heading;} {\s40\f0\fs20\lang2052?\u-28646 ?\u-30616 ?\u26684 ?;}} {\*\listtable {\list\listtemplateid4400{\listlevel\levelnfc0\levelstartat1\levelspace0\levelfollow0\fi-1019\li2780{\leveltext\'01\'00;}{\levelnumbers\'01;}}{\listlevel\levelnfc0\levelstartat1\levelspace0\levelfollow0\fi-1080\li4599{\leveltext\'03\'00\'01.;}{\levelnumbers\'01\'02;}}{\listlevel\levelnfc0\levelstartat1\levelspace0\levelfollow0\fi-1019\li2780{\leveltext\'01\'00;}{\levelnumbers\'01;}}{\listlevel\levelnfc0\levelstartat1\levelspace0\levelfollow0\fi-1019\li2780{\leveltext\'01\'00;}{\levelnumbers\'01;}}{\listlevel\levelnfc0\levelstartat1\levelspace0\levelfollow0\fi-1019\li2780{\leveltext\'01\'00;}{\levelnumbers\'01;}}{\listlevel\levelnfc0\levelstartat1\levelspace0\levelfollow0\fi-1019\li2780{\leveltext\'01\'00;}{\levelnumbers\'01;}}{\listlevel\levelnfc0\levelstartat1\levelspace0\levelfollow0\fi-1019\li2780{\leveltext\'01\'00;}{\levelnumbers\'01;}}{\listlevel\levelnfc0\levelstartat1\levelspace0\levelfollow0\fi-1019\li2780{\leveltext\'01\'00;}{\levelnumbers\'01;}}{\listlevel\levelnfc0\levelstartat1\levelspace0\levelfollow0\fi-1019\li2780{\leveltext\'01\'00;}{\levelnumbers\'01;}}\listid1000} {\list\listtemplateid4401{\listlevel\levelnfc0\levelstartat6\levelspace0\levelfollow0\fi-1004\li2748{\leveltext\'01\'00;}{\levelnumbers\'01;}}{\listlevel\levelnfc0\levelstartat1\levelspace0\levelfollow0\fi-1080\li4567{\leveltext\'03\'00\'01.;}{\levelnumbers\'01\'02;}}{\listlevel\levelnfc0\levelstartat6\levelspace0\levelfollow0\fi-1004\li2748{\leveltext\'01\'00;}{\levelnumbers\'01;}}{\listlevel\levelnfc0\levelstartat6\levelspace0\levelfollow0\fi-1004\li2748{\leveltext\'01\'00;}{\levelnumbers\'01;}}{\listlevel\levelnfc0\levelstartat6\levelspace0\levelfollow0\fi-1004\li2748{\leveltext\'01\'00;}{\levelnumbers\'01;}}{\listlevel\levelnfc0\levelstartat6\levelspace0\levelfollow0\fi-1004\li2748{\leveltext\'01\'00;}{\levelnumbers\'01;}}{\listlevel\levelnfc0\levelstartat6\levelspace0\levelfollow0\fi-1004\li2748{\leveltext\'01\'00;}{\levelnumbers\'01;}}{\listlevel\levelnfc0\levelstartat6\levelspace0\levelfollow0\fi-1004\li2748{\leveltext\'01\'00;}{\levelnumbers\'01;}}{\listlevel\levelnfc0\levelstartat6\levelspace0\levelfollow0\fi-1004\li2748{\leveltext\'01\'00;}{\levelnumbers\'01;}}\listid1006} {\list\listtemplateid4402\listsimple{\listlevel\levelnfc0\levelstartat1\levelspace0\levelfollow0\fi-1125\li4069{\leveltext\'02\'00.;}{\levelnumbers\'01;}}\listid1002} {\list\listtemplateid4403\listsimple{\listlevel\levelnfc0\levelstartat1\levelspace0\levelfollow0\fi-1125\li4069{\leveltext\'02\'00.;}{\levelnumbers\'01;}}\listid1003} {\list\listtemplateid4404\listsimple{\listlevel\levelnfc0\levelstartat3\levelspace0\levelfollow0\fi-1125\li2597{\leveltext\'01\'00;}{\levelnumbers\'01;}}\listid1004} {\list\listtemplateid4405\listsimple{\listlevel\levelnfc0\levelstartat2\levelspace0\levelfollow0\fi-1140\li3123{\leveltext\'02\'00.;}{\levelnumbers\'01;}}\listid1005} {\list\listtemplateid4406\listsimple{\listlevel\levelnfc0\levelstartat2\levelspace0\levelfollow0\fi-1125\li3108{\leveltext\'02\'00.;}{\levelnumbers\'01;}}\listid1009} {\list\listtemplateid4407\listsimple{\listlevel\levelnfc0\levelstartat8\levelspace0\levelfollow0\fi-1125\li2116{\leveltext\'01\'00;}{\levelnumbers\'01;}}\listid1010} {\list\listtemplateid4408\listsimple{\listlevel\levelnfc0\levelstartat1\levelspace0\levelfollow0\fi-1289\li4234{\leveltext\'02\'00.;}{\levelnumbers\'01;}}\listid1011}} {\*\listoverridetable {\listoverride\listoverridecount0\listid1000\levelnfc0\levelstartat1\levelspace0\levelfollow0\fi-1019\li2780{\leveltext\'01\'00;}{\levelnumbers\'01;}\ls1} {\listoverride\listoverridecount0\listid1000\levelnfc0\levelstartat1\levelspace0\levelfollow0\fi-1080\li4599{\leveltext\'03\'00\'01.;}{\levelnumbers\'01\'02;}\ls2} {\listoverride\listoverridecount0\listid1002\levelnfc0\levelstartat1\levelspace0\levelfollow0\fi-1125\li4069{\leveltext\'02\'00.;}{\levelnumbers\'01;}\ls3} {\listoverride\listoverridecount0\listid1003\levelnfc0\levelstartat1\levelspace0\levelfollow0\fi-1125\li4069{\leveltext\'02\'00.;}{\levelnumbers\'01;}\ls4} {\listoverride\listoverridecount0\listid1004\levelnfc0\levelstartat3\levelspace0\levelfollow0\fi-1125\li2597{\leveltext\'01\'00;}{\levelnumbers\'01;}\ls5} {\listoverride\listoverridecount0\listid1005\levelnfc0\levelstartat2\levelspace0\levelfollow0\fi-1140\li3123{\leveltext\'02\'00.;}{\levelnumbers\'01;}\ls6} {\listoverride\listoverridecount0\listid1006\levelnfc0\levelstartat6\levelspace0\levelfollow0\fi-1004\li2748{\leveltext\'01\'00;}{\levelnumbers\'01;}\ls7} {\listoverride\listoverridecount0\listid1006\levelnfc0\levelstartat1\levelspace0\levelfollow0\fi-1080\li4567{\leveltext\'03\'00\'01.;}{\levelnumbers\'01\'02;}\ls8} {\listoverride\listoverridecount0\listid1006\levelnfc0\levelstartat1\levelspace0\levelfollow0\fi-1080\li4567{\leveltext\'03\'00\'01.;}{\levelnumbers\'01\'02;}\ls9} {\listoverride\listoverridecount0\listid1009\levelnfc0\levelstartat2\levelspace0\levelfollow0\fi-1125\li3108{\leveltext\'02\'00.;}{\levelnumbers\'01;}\ls10} {\listoverride\listoverridecount0\listid1010\levelnfc0\levelstartat8\levelspace0\levelfollow0\fi-1125\li2116{\leveltext\'01\'00;}{\levelnumbers\'01;}\ls11} {\listoverride\listoverridecount0\listid1011\levelnfc0\levelstartat1\levelspace0\levelfollow0\fi-1289\li4234{\leveltext\'02\'00.;}{\levelnumbers\'01;}\ls12}} \kerning0\cf0\ftnbj\fet2\ftnstart1\ftnnar\aftnnar\ftnstart1\aftnstart1\aenddoc\revprop3{\info\uc1}\deftab720\viewkind1\paperw11520\paperh14760\margl1440\margr1440\widowctrl \sectd\sbknone\colsx360\margtsxn99\margbsxn0\marglsxn80\margrsxn80\pgncont\ltrsect \pard\plain\ltrpar\qc\fi-1\li2263\ri2007\s29\itap0{\s29\f0\fs68\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Functions and Functional Programming}{\s29\f0\fs68\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qc\fi-1\li2263\ri2007\s29\itap0{\s29\f0\fs68\b\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u20989 \uc0\u25968 \uc0\u21644 \uc0\u20989 \uc0\u25968 \uc0\u24335 \uc0\u32534 \uc0\u31243 }{\s29\f0\fs68\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qc\li3976\ri5656\s29\itap0{\s29\f0\fs24\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Chapter Topics}{\s29\f0\fs24\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3687\ri-20\s29\itap0\tx4000{\s29\f0\fs24\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8226\'95\tab What Are Functions?}{\s29\f0\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3687\ri-20\s29\itap0\tx4000{\s29\f0\fs24\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8226\'95\tab Calling Functions}{\s29\f0\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3687\ri-20\s29\itap0\tx4000{\s29\f0\fs24\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8226\'95\tab Creating Functions}{\s29\f0\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3687\ri-20\s29\itap0\tx4000{\s29\f0\fs24\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8226\'95\tab Passing Functions}{\s29\f0\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3687\ri-20\s29\itap0\tx4000{\s29\f0\fs24\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8226\'95\tab Formal Arguments}{\s29\f0\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3687\ri-20\s29\itap0\tx4000{\s29\f0\fs24\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8226\'95\tab Variable-Length Arguments}{\s29\f0\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3687\ri-20\s29\itap0\tx4000{\s29\f0\fs24\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8226\'95\tab Functional Programming}{\s29\f0\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3687\ri-20\s29\itap0\tx4000{\s29\f0\fs24\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8226\'95\tab Variable Scope}{\s29\f0\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3687\ri-20\s29\itap0\tx4000{\s29\f0\fs24\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8226\'95\tab Recursion}{\s29\f0\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3687\ri-20\s29\itap0\tx4000{\s29\f0\fs24\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8226\'95\tab Generators}{\s29\f0\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi3597\li1119\ri-893\s29\itap0\tx5100{\s29\cf2\f0\fs400\b\lang2052{\*\listtag0}\abinodiroverride\ltrch 11}{\s29\cf2\f0\fs400\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2747\ri-20\s29\itap0{\shp{\*\shpinst\shpz0\shpbxmargin\shpbypara\shpwr2\shpwrk0\shpfblwtxt0\shpleft0\shptop0\shpbottom1000\shpright944\shplid735404338{\sp{\sn shapeType}{\sv 202}}{\sp{\sn dxTextLeft}{\sv 27305}}{\sp{\sn dxTextRight}{\sv 27305}}{\sp{\sn dxTextTop}{\sv 27305}}{\sp{\sn dxTextBottom}{\sv 27305}}{\shptxt \pard\plain\ltrpar\ql\itap0{\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\ri-129\s29\itap0}}}\par \pard\plain\ltrpar\ql\itap0{\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch e were introduced to functions in Chapter 2, and we have seen}{\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2747\ri2454\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch them created and called throughout the text. In this chapter, we will look beyond the basics and give you a full treatment of all the}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1759\ri2628\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch other features associated with functions. In addition to the expected behav- ior, functions in Python support a variety of invocation styles and argument types, including some functional programming interfaces. We conclude this chapter with a look at Python\uc1\u8217\'92s scoping and take an optional side trip into the world of recursion.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} {\listtext\pard\fi-1019\li2780\ri-20 1 }\pard\plain{\ltrpar\ql\fi-1019\li2780\ri-20\s29{\*\abilist\abilistid1000\abilistparentid0\abilistlevel1\abistartat1{\abifieldfont Times New Roman}{\abilistdecimal .}{\abilistdelim %L}{\abiliststyle Numbered List}}{\*\pn\pnql\pnstart1\pnlvlbody\pndec{\pntxtb }{\pntxta }}\fn-1019\li2780\ls1\ilvl0\itap0\tx2780{\s29\f0\fs36\b\lang2052{\*\listtag0}\abinodiroverride\ltrch What Are Functions?}{\s29\f1\fs24\lang2052{\*\listtag0}\par} }\pard\plain\ltrpar\ql\li1759\ri-20\s29\itap0{\s29\f0\fs36\b\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u20160 \uc0\u20040 \uc0\u26159 \uc0\u20989 \uc0\u25968 \uc0\u-225 }{\s29\f0\fs36\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1759\ri2628\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Functions are the structured or procedural programming way of organizing the logic in your programs. Large blocks of code can be neatly segregated into manageable chunks, and space is saved by putting oft-repeated code in functions as opposed to multiple copies everywhere\uc1\u8212\'97this also helps with consistency because changing the single copy means you do not have to hunt for and make changes to multiple copies of duplicated code. The basics of functions in Python are not much different from those of other languages with which you may be familiar. After a bit of review here in the early part of this chapter, we will focus on what else Python brings to the table.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1759\ri2628\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u20989 \uc0\u25968 }{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li2704\ri1509\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Functions can appear in different ways . . . here is a sampling profile of how you will see functions created, used, or otherwise referenced:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li2704\ri1509\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u20989 \uc0\u25968 \uc0\u26377 \uc0\u19981 \uc0\u21516 \uc0\u30340 \uc0\u24418 \uc0\u24335 \uc0\u12290 \uc0\u19979 \uc0\u-26782 \uc0\u26159 \uc0\u20851 \uc0\u20110 \uc0\u22914 \uc0\u20309 \uc0\u21019 \uc0\u24314 \uc0\u20989 \uc0\u25968 \uc0\u12289 \uc0\u20351 \uc0\u29992 \uc0\u20989 \uc0\u25968 \uc0\u30340 \uc0\u31616 \uc0\u21333 \uc0\u20363 \uc0\u23376 \uc0\u12290 }{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\sb20\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3277\ri-20\s29\itap0\tx5919{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch declaration/definition\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}def }{\s29\f0\fs20\lang2052{\*\listtag0}foo(): }{\s29\f0\fs20\b\lang2052{\*\listtag0}print }{\s29\f0\fs20\lang2052{\*\listtag0}'bar'}{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3277\ri-20\s29\itap0{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch function object/reference }{\s29\f0\fs20\lang2052{\*\listtag0}foo}{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3277\ri-20\s29\itap0\tx5919{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch function call/invocation\tab }{\s29\f0\fs20\lang2052{\*\listtag0}foo()}{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} {\listtext\pard\fi-1080\li4599\ri-20 1.1. }\pard\plain{\ltrpar\ql\fi-1080\li4599\ri-20\s29{\*\abilist\abilistid1001\abilistparentid1000\abilistlevel2\abistartat1{\abifieldfont Times New Roman}{\abilistdecimal .}{\abilistdelim %L.}{\abiliststyle Numbered List}}{\*\pn\pnql\pnstart1\pnprev\pnlvl9\pndec{\pntxtb }{\pntxta .}}\fn-1080\li4599\ls2\ilvl1\itap0\tx4599{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Functions versus Procedures}{\s29\f1\fs24\lang2052{\*\listtag0}\par} }\pard\plain\ltrpar\ql\li3519\ri-20\s29\itap0{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u20989 \uc0\u25968 \uc0\u19982 \uc0\u-28729 \uc0\u31243 \uc0\u27604 \uc0\u-28797 }{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Functions are often compared to procedures. Both are entities that can be invoked, but the traditional function or \uc1\u8220\'93black box,\uc1\u8221\'94 perhaps taking some or no input parameters, performs some amount of processing, and concludes by sending back a return value to the caller. Some functions are Boolean in nature, returning a \uc1\u8220\'93yes\uc1\u8221\'94 or \uc1\u8220\'93no\uc1\u8221\'94 answer, or, more appropriately, a non-zero or zero value, respectively. Procedures are simply special cases, functions that do not return a value. As you will see below, Python procedures are implied func- tions because the interpreter implicitly returns a default value of }{\s29\f0\fs20\lang2052{\*\listtag0}None}{\s29\f0\fs22\lang2052{\*\listtag0}.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u20989 \uc0\u25968 \uc0\u32463 \uc0\u24120 \uc0\u21644 \uc0\u-28729 \uc0\u31243 \uc0\u27604 \uc0\u-28797 \uc0\u12290 \uc0\u23427 \uc0\u20204 \uc0\u20004 \uc0\u20010 \uc0\u26102 \uc0\u-28419 \uc0\u21487 \uc0\u20197 \uc0\u-30549 \uc0\u-29693 \uc0\u29992 \uc0\u30340 \uc0\u23454 \uc0\u20307 \uc0\u-244 \uc0\u20294 \uc0\u26159 \uc0\u20256 \uc0\u32479 \uc0\u30340 \uc0\u20989 \uc0\u25968 \uc0\u25110 \uc0\u-32763 \uc1\u8220\'93\uc0\u-24879 \uc0\u31665 \uc1\u8221\'94\uc0\u-244 \uc0\u21487 \uc0\u-32515 \uc0\u-26880 \uc0\u-30335 \uc0\u-28781 \uc0\u20837 \uc0\u20960 \uc0\u20010 \uc0\u25110 \uc0\u-32763 \uc0\u19981 \uc0\u-26880 \uc0\u-30335 \uc0\u21442 \uc0\u25968 \uc0\u-244 \uc0\u26469 \uc0\u23436 \uc0\u19968 \uc0\u20123 \uc0\u22788 \uc0\u29702 \uc0\u-244 \uc0\u21253 \uc0\u25324 }{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} {\listtext\pard\fi-1080\li4599\ri-20 1.2. }\pard\plain{\ltrpar\ql\fi-1080\li4599\ri-20\s29{\*\abilist\abilistid1001\abilistparentid1000\abilistlevel2\abistartat1{\abifieldfont Times New Roman}{\abilistdecimal .}{\abilistdelim %L.}{\abiliststyle Numbered List}}{\*\pn\pnql\pnstart1\pnprev\pnlvl9\pndec{\pntxtb }{\pntxta .}}\fn-1080\li4599\ls2\ilvl1\itap0\tx4599{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Return Values and Function Types}{\s29\f1\fs24\lang2052{\*\listtag0}\par} }\pard\plain\ltrpar\ql\li3519\ri-20\s29\itap0{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u-28716 \uc0\u22238 \uc0\u20540 \uc0\u19982 \uc0\u20989 \uc0\u25968 \uc0\u31867 \uc0\u22411 }{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Functions may return a value back to their callers and those that are more procedural in nature do not explicitly return anything at all. Languages that treat procedures as functions usually have a special type or value name for functions that \uc1\u8220\'93return nothing.\uc1\u8221\'94 These functions default to a return type of}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri1496\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch "void" }{\s29\f0\fs22\lang2052{\*\listtag0}in C, meaning no value returned. In Python, the equivalent return object type is }{\s29\f0\fs20\lang2052{\*\listtag0}None}{\s29\f0\fs22\lang2052{\*\listtag0}.}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri1496\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri1496\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri1496\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li2704\ri1495\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The }{\s29\f0\fs20\lang2052{\*\listtag0}hello() }{\s29\f0\fs22\lang2052{\*\listtag0}function acts as a procedure in the code below, returning no value. If the return value is saved, you will see that its value is }{\s29\f0\fs20\lang2052{\*\listtag0}None}{\s29\f0\fs22\lang2052{\*\listtag0}:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li2704\ri1495\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u19979 \uc0\u-26782 \uc0\u30340 }{\s29\f0\fs20\lang2052{\*\listtag0}hello()\uc0\u20989 \uc0\u25968 \uc0\u-244 \uc0\u27809 \uc0\u26377 \uc0\u-28716 \uc0\u22238 \uc0\u20540 \uc0\u12290 \uc0\u22914 \uc0\u26524 \uc0\u-28716 \uc0\u22238 \uc0\u20540 \uc0\u-30549 \uc0\u20445 \uc0\u23384 \uc0\u-244 \uc0\u20320 \uc0\u21487 \uc0\u20197 \uc0\u30475 \uc0\u21040 \uc0\u-28711 \uc0\u20010 \uc0\u20540 \uc0\u26159 None\uc0\u-230 }{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> }{\s29\f0\fs18\b\lang2052{\*\listtag0}def }{\s29\f0\fs18\lang2052{\*\listtag0}hello():}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0\tx4079{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch ...\tab }{\s29\f0\fs18\b\lang2052{\*\listtag0}print }{\s29\f0\fs18\lang2052{\*\listtag0}'hello world'}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>>}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> res = hello()}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch hello world}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> res}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> }{\s29\f0\fs18\b\lang2052{\*\listtag0}print }{\s29\f0\fs18\lang2052{\*\listtag0}res}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch None}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> type(res)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch }{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Also, like most other languages, you may return only one value/object from}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri1482\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch a function in Python. One difference is that in returning a container type, it will seem as if you can actually return more than a single object. In other}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch words, you cannot leave the grocery store with multiple items, but you can}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri2468\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch throw them all in a single shopping bag, which you walk out of the store with, perfectly legal.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri2468\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u20063 \uc0\u20687 \uc0\u20854 \uc0\u20182 \uc0\u22823 \uc0\u22810 \uc0\u25968 \uc0\u30340 \uc0\u-29715 \uc0\u-30208 \uc0\u19968 \uc0\u26679 }{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri2468\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}foo():}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2679\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch return }{\s29\f0\fs18\lang2052{\*\listtag0}['xyz', 1000000, -98.6]}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}bar():}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2679\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch return }{\s29\f0\fs18\lang2052{\*\listtag0}'abc', [42, 'python'], "Guido"}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2638\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The }{\s29\f0\fs20\lang2052{\*\listtag0}foo() }{\s29\f0\fs22\lang2052{\*\listtag0}function returns a list, and the }{\s29\f0\fs20\lang2052{\*\listtag0}bar() }{\s29\f0\fs22\lang2052{\*\listtag0}function returns a tuple. Because of the tuple\uc1\u8217\'92s syntax of not requiring the enclosing parentheses, it creates the perfect illusion of returning multiple items. If we were to prop- erly enclose the tuple items, the definition of }{\s29\f0\fs20\lang2052{\*\listtag0}bar() }{\s29\f0\fs22\lang2052{\*\listtag0}would look like this:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}bar():}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2679\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch return }{\s29\f0\fs18\lang2052{\*\listtag0}('abc', [4-2j, 'python'], "Guido")}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li1743\ri2451\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch As far as return values are concerned, tuples can be saved in a number of ways. The following three ways of saving the return values are equivalent:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> aTuple = bar()}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> x, y, z = bar()}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> (a, b, c) = bar()}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>>}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> aTuple}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch ('abc', [(4-2j), 'python'], 'Guido')}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> x, y, z}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch ('abc', [(4-2j), 'python'], 'Guido')}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> (a, b, c)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch ('abc', [(4-2j), 'python'], 'Guido')}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2636\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch In the assignments for }{\s29\f0\fs20\lang2052{\*\listtag0}x}{\s29\f0\fs22\lang2052{\*\listtag0}, }{\s29\f0\fs20\lang2052{\*\listtag0}y}{\s29\f0\fs22\lang2052{\*\listtag0}, }{\s29\f0\fs20\lang2052{\*\listtag0}z}{\s29\f0\fs22\lang2052{\*\listtag0}, and }{\s29\f0\fs20\lang2052{\*\listtag0}a}{\s29\f0\fs22\lang2052{\*\listtag0}, }{\s29\f0\fs20\lang2052{\*\listtag0}b}{\s29\f0\fs22\lang2052{\*\listtag0}, }{\s29\f0\fs20\lang2052{\*\listtag0}c}{\s29\f0\fs22\lang2052{\*\listtag0}, each variable will receive its cor- responding return value in the order the values are returned. The }{\s29\f0\fs20\lang2052{\*\listtag0}aTuple }{\s29\f0\fs22\lang2052{\*\listtag0}assignment takes the entire implied tuple returned from the function. Recall that a tuple can be \uc1\u8220\'93unpacked\uc1\u8221\'94 into individual variables or not at all and its reference assigned directly to a single variable. (Refer back to Section 6.18.3 for a review.)}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2637\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch In short, when no items are explicitly returned or if }{\s29\f0\fs20\lang2052{\*\listtag0}None }{\s29\f0\fs22\lang2052{\*\listtag0}is returned, then Python returns }{\s29\f0\fs20\lang2052{\*\listtag0}None}{\s29\f0\fs22\lang2052{\*\listtag0}. If the function returns exactly one object, then that is the object that Python returns and the type of that object stays the same. If the function returns multiple objects, Python gathers them all together and returns them in a tuple. Yes, we claim that Python is more flexible than languages like C where only one return value is allowed, but}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri2440\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch in all honesty, Python follows the same tradition. The programmer is just given the impression that he or she can return more than one object.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li4391\ri-20\s29\itap0{\s29\f0\fs24\lang2052{\*\listtag0}\abinodiroverride\ltrch Table 11.1 Return Values and Types}{\s29\f0\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\itap0 \sect\sectd\sbknone\colsx360\margtsxn99\margbsxn0\marglsxn80\margrsxn80\pgncont\ltrsect \pard\plain\ltrpar\ql\itap0{\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li4398\ri-20\s29\itap0{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Stated Number}{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li4557\ri-20\s29\itap0{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch of Objects to}{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li4804\ri-20\s29\itap0{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Return}{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\ri-20\s29\itap0{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Type of Object That}{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li204\ri-20\s29\itap0{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Python Returns}{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qc\li5071\ri4048\s29\itap0\tx6779{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 0\tab None}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qc\li5069\ri3928\s29\itap0\tx6660{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 1\tab }{\s29\f0\fs20\i\lang2052{\*\listtag0}object}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qc\li4942\ri3986\s29\itap0\tx6720{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch >1\tab tuple}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Table 11.1 summarizes the number of items \uc1\u8220\'93returned\uc1\u8221\'94 from a function, and}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch the object that Python actually returns.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1681\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Many languages that support functions maintain the notion that a func- tion\uc1\u8217\'92s type is the type of its return value. In Python, no direct type correlation can be made since Python is dynamically typed and functions can return val- ues of different types. Because overloading is not a feature, the programmer can use the }{\s29\f0\fs20\lang2052{\*\listtag0}type() }{\s29\f0\fs22\lang2052{\*\listtag0}built-in function as a proxy for multiple declarations with different }{\s29\f0\fs22\i\lang2052{\*\listtag0}signatures }{\s29\f0\fs22\lang2052{\*\listtag0}(multiple prototypes of the same overloaded function that differ based on its arguments).}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1681\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch }{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs36\b\lang2052{\*\listtag0}\abinodiroverride\ltrch 11.2 Calling Functions}{\s29\f0\fs36\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs36\b\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u-29693 \uc0\u29992 \uc0\u20989 \uc0\u25968 }{\s29\f0\fs36\b\lang2052{\*\listtag0}\par} {\listtext\pard\fi-1125\li4069\ri-20\sb80 1. }\pard\plain{\ltrpar\ql\fi-1125\li4069\ri-20\sb80\s29{\*\abilist\abilistid1002\abilistparentid0\abilistlevel1\abistartat1{\abifieldfont Times New Roman}{\abilistdecimal .}{\abilistdelim %L.}{\abiliststyle Numbered List}}{\*\pn\pnql\pnstart1\pnlvlbody\pndec{\pntxtb }{\pntxta .}}\fn-1125\li4069\ls3\ilvl0\itap0\tx4069{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Function Operator}{\s29\f1\fs24\lang2052{\*\listtag0}\par} }\pard\plain\ltrpar\ql\li2943\ri-20\sb80\s29\itap0{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u20989 \uc0\u25968 \uc0\u25805 \uc0\u20316 \uc0\u31526 }{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Functions are called using the same pair of parentheses that you are used to.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1681\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch In fact, some consider ( }{\s29\f0\fs20\lang2052{\*\listtag0}( ) }{\s29\f0\fs22\lang2052{\*\listtag0}) to be a two-character operator, the function operator. As you are probably aware, any input parameters or arguments must be placed between these calling parentheses. Parentheses are also used as part of function declarations to define those arguments. Although we have yet to formally study classes and object-oriented programming, you will dis- cover that the function operator is also used in Python for class instantiation.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} {\listtext\pard\fi-1125\li4069\ri-20 2. }\pard\plain{\ltrpar\ql\fi-1125\li4069\ri-20\s29{\*\abilist\abilistid1002\abilistparentid0\abilistlevel1\abistartat1{\abifieldfont Times New Roman}{\abilistdecimal .}{\abilistdelim %L.}{\abiliststyle Numbered List}}{\*\pn\pnql\pnstart1\pnlvlbody\pndec{\pntxtb }{\pntxta .}}\fn-1125\li4069\ls3\ilvl0\itap0\tx4069{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Keyword Arguments}{\s29\f1\fs24\lang2052{\*\listtag0}\par} }\pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u20851 \uc0\u-27346 \uc0\u23383 \uc0\u21442 \uc0\u25968 }{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The concept of keyword arguments applies only to function invocation. The idea here is for the caller to identify the arguments by parameter name in a function call. This specification allows for arguments to be missing or out-of- order because the interpreter is able to use the provided keywords to match values to parameters.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch For a simple example, imagine a function }{\s29\f0\fs20\lang2052{\*\listtag0}foo()}{\s29\f0\fs22\lang2052{\*\listtag0}, which has the following}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch pseudocode definition:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u20030 \uc0\u19968 \uc0\u20010 \uc0\u31616 \uc0\u21333 \uc0\u30340 \uc0\u20363 \uc0\u23376 ,\uc0\u27604 \uc0\u22914 \uc0\u26377 \uc0\u19968 \uc0\u20010 \uc0\u20989 \uc0\u25968 }{\s29\f0\fs22\lang2052{\*\listtag0} }{\s29\f0\fs20\lang2052{\*\listtag0}foo(),\uc0\u26377 \uc0\u22914 \uc0\u19979 \uc0\u30340 \uc0\u23450 \uc0\u20041 :}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2115\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}foo(x):}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2571\ri-20\s29\itap0{\s29\f0\fs18\i\lang2052{\*\listtag0}\abinodiroverride\ltrch foo_suite }{\s29\f0\fs18\lang2052{\*\listtag0}# presumably does some processing with 'x'}{\s29\f0\fs18\i\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2020\ri-20\s29\itap0\tx4639\tx5879\tx7420{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch Standard calls to foo():\tab foo(42)\tab foo('bar')\tab foo(y)}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2020\ri-20\s29\itap0\tx4740\tx6079{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch Keyword calls to foo():\tab foo(x=42)\tab foo(x='bar') foo(x=y)}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2020\ri-20\s29\itap0\tx4740\tx6079{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u26631 \uc0\u20934 \uc0\u-29693 \uc0\u29992 }{\s29\f0\fs22\lang2052{\*\listtag0} }{\s29\f0\fs20\lang2052{\*\listtag0}foo():foo(42)\tab foo('bar')\tab foo(y)}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2020\ri-20\s29\itap0\tx4740\tx6079{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u20851 \uc0\u-27346 \uc0\u23383 \uc0\u-29693 \uc0\u29992 foo():foo(x=42)\tab foo(x='bar') foo(x=y)}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch For a more realistic example, let us assume you have a function called}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch net_conn() }{\s29\f0\fs22\lang2052{\*\listtag0}and you know that it takes two parameters, say, }{\s29\f0\fs20\lang2052{\*\listtag0}host }{\s29\f0\fs22\lang2052{\*\listtag0}and }{\s29\f0\fs20\lang2052{\*\listtag0}port}{\s29\f0\fs22\lang2052{\*\listtag0}:}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u20030 \uc0\u19968 \uc0\u20010 \uc0\u26356 \uc0\u29616 \uc0\u23454 \uc0\u30340 \uc0\u20363 \uc0\u23376 ,\uc0\u20551 \uc0\u-29762 \uc0\u20320 \uc0\u26377 \uc0\u19968 \uc0\u20010 \uc0\u20989 \uc0\u25968 \uc0\u21483 \uc0\u20570 }{\s29\f0\fs20\lang2052{\*\listtag0}net_conn(),\uc0\u-32756 \uc0\u19988 \uc0\u30693 \uc0\u-28589 \uc0\u-26880 \uc0\u-30335 \uc0\u20004 \uc0\u20010 \uc0\u21442 \uc0\u25968 host\uc0\u21644 port:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch }{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch }{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}net_conn(host, port):}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3280\ri-20\s29\itap0{\s29\f0\fs18\i\lang2052{\*\listtag0}\abinodiroverride\ltrch net_conn_suite}{\s29\f0\fs18\i\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li1743\ri2474\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Naturally, we can call the function, giving the proper arguments in the correct positional order in which they were declared:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li1743\ri2474\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u21482 \uc0\u-30335 \uc0\u25353 \uc0\u29031 \uc0\u20989 \uc0\u25968 \uc0\u22768 \uc0\u26126 \uc0\u30340 \uc0\u21442 \uc0\u25968 \uc0\u23450 \uc0\u20041 \uc0\u-26502 \uc0\u24207 \uc0\u-28781 \uc0\u20837 \uc0\u24688 \uc0\u24403 \uc0\u30340 \uc0\u21442 \uc0\u25968 \uc0\u25105 \uc0\u20204 \uc0\u21487 \uc0\u20197 \uc0\u24456 \uc0\u-32278 \uc0\u28982 \uc0\u-29693 \uc0\u29992 \uc0\u-28711 \uc0\u20010 \uc0\u20989 \uc0\u25968 :}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li1743\ri2474\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch net_conn('kappa', 8080)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2637\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The }{\s29\f0\fs20\lang2052{\*\listtag0}host }{\s29\f0\fs22\lang2052{\*\listtag0}parameter gets the string }{\s29\f0\fs20\lang2052{\*\listtag0}'kappa' }{\s29\f0\fs22\lang2052{\*\listtag0}and }{\s29\f0\fs20\lang2052{\*\listtag0}port }{\s29\f0\fs22\lang2052{\*\listtag0}gets integer 8080. Keyword arguments allow out-of-order parameters, but you must provide the name of the parameter as a \uc1\u8220\'93keyword\uc1\u8221\'94 to have your arguments match up to their corresponding argument names, as in the following:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2637\sb80\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch host\uc0\u21442 \uc0\u25968 \uc0\u24471 \uc0\u21040 \uc0\u23383 \uc0\u31526 \uc0\u20018 'kappa',port\uc0\u21442 \uc0\u25968 \uc0\u24471 \uc0\u21040 }{\s29\f0\fs22\lang2052{\*\listtag0}8080.\uc0\u24403 \uc0\u28982 \uc0\u20063 \uc0\u21487 \uc0\u20197 \uc0\u19981 \uc0\u25353 \uc0\u29031 \uc0\u20989 \uc0\u25968 \uc0\u22768 \uc0\u26126 \uc0\u20013 \uc0\u30340 \uc0\u21442 \uc0\u25968 \uc0\u-26502 \uc0\u24207 \uc0\u-28781 \uc0\u20837 \uc0\u20294 \uc0\u26159 \uc0\u24471 \uc0\u-28781 \uc0\u20837 \uc0\u30456 \uc0\u24212 \uc0\u30340 \uc0\u21442 \uc0\u25968 \uc0\u21517 ,\uc0\u22914 \uc0\u19979 \uc0\u20363 :}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2637\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch net_conn(port=8080, host='chino')}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Keyword arguments may also be used when arguments are allowed to be}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri2468\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8220\'93missing.\uc1\u8221\'94 These are related to functions that have default arguments, which we will introduce in the next section.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri2468\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u24403 \uc0\u21442 \uc0\u25968 \uc0\u20801 \uc0\u-29768 \uc0\u19981 \uc0\u-28781 \uc0\u20837 \uc0\u30340 \uc0\u26102 \uc0\u20505 \uc0\u20063 \uc0\u21487 \uc0\u20197 \uc0\u19981 \uc0\u-28781 \uc0\u20837 .\uc0\u-28711 \uc0\u21462 \uc0\u20915 \uc0\u20110 \uc0\u20989 \uc0\u25968 \uc0\u30340 \uc0\u-24872 \uc0\u-29788 \uc0\u21442 \uc0\u25968 ,\uc0\u25105 \uc0\u20204 \uc0\u22312 \uc0\u19979 \uc0\u19968 \uc0\u-28440 \uc0\u20998 \uc0\u-29722 \uc0\u32454 \uc0\u20171 \uc0\u32461 \uc0\u12290 }{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri2468\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch }{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} {\listtext\pard\fi-1125\li4069\ri-20 3. }\pard\plain{\ltrpar\ql\fi-1125\li4069\ri-20\s29{\*\abilist\abilistid1002\abilistparentid0\abilistlevel1\abistartat1{\abifieldfont Times New Roman}{\abilistdecimal .}{\abilistdelim %L.}{\abiliststyle Numbered List}}{\*\pn\pnql\pnstart1\pnlvlbody\pndec{\pntxtb }{\pntxta .}}\fn-1125\li4069\ls3\ilvl0\itap0\tx4069{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Default Arguments}{\s29\f1\fs24\lang2052{\*\listtag0}\par} }\pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u-24872 \uc0\u-29788 \uc0\u21442 \uc0\u25968 }{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2642\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Default arguments are those that are declared with default values. Param- eters that are not passed on a function call are thus allowed and are assigned the default value. We will cover default arguments more formally in Section 11.5.2.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2642\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2642\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2642\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} {\listtext\pard\fi-1125\li4069\ri-20 4. }\pard\plain{\ltrpar\ql\fi-1125\li4069\ri-20\s29{\*\abilist\abilistid1002\abilistparentid0\abilistlevel1\abistartat1{\abifieldfont Times New Roman}{\abilistdecimal .}{\abilistdelim %L.}{\abiliststyle Numbered List}}{\*\pn\pnql\pnstart1\pnlvlbody\pndec{\pntxtb }{\pntxta .}}\fn-1125\li4069\ls3\ilvl0\itap0\tx4069{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Grouped Arguments}{\s29\f1\fs24\lang2052{\*\listtag0}\par} }\pard\plain\ltrpar\ql\ri-20\s29\itap0\tx4069{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u32676 \uc0\u32452 \uc0\u21442 \uc0\u25968 }{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2643\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Python also allows the programmer to execute a function without explicitly specifying individual arguments in the call as long as you have grouped the arguments in either a tuple (non-keyword arguments) or a dictionary (key- word arguments), both of which we will explore in this chapter. Basically, you can put all the arguments in either a tuple or a dictionary (or both), and just call a function with those buckets of arguments and not have to explicitly put them in the function call:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2643\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Python\uc0\u20063 \uc0\u20801 \uc0\u-29768 \uc0\u25903 \uc0\u25345 }{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\i\lang2052{\*\listtag0}\abinodiroverride\ltrch func(*tuple_grp_nonkw_args, **dict_grp_kw_args)}{\s29\f0\fs18\i\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The }{\s29\f0\fs20\i\lang2052{\*\listtag0}tuple_grp_nonkw_args }{\s29\f0\fs22\lang2052{\*\listtag0}are the group of non-keyword arguments}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch as a tuple, and the }{\s29\f0\fs20\i\lang2052{\*\listtag0}dict_grp_kw_args }{\s29\f0\fs22\lang2052{\*\listtag0}are a dictionary of keyword argu-}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch ments. As we already mentioned, we will cover all of these in this chapter, but}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch just be aware of this feature that allows you to stick arguments in tuples and/}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri1507\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch or dictionaries and be able to call functions without explicitly stating each one by itself in the function call.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li2704\ri1481\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch In fact, you can give formal arguments, too! These include the standard positional parameters as well as keyword argument, so the full syntax allowed}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch in Python for making a function call is:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\i\lang2052{\*\listtag0}\abinodiroverride\ltrch func(positional_args, keyword_args,}{\s29\f0\fs18\i\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\i\lang2052{\*\listtag0}\abinodiroverride\ltrch *tuple_grp_nonkw_args, **dict_grp_kw_args)}{\s29\f0\fs18\i\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1678\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch All arguments in this syntax are optional\uc1\u8212\'97everything is dependent on the individual function call as far as which parameters to pass to the function. This syntax has effectively deprecated the }{\s29\f0\fs20\lang2052{\*\listtag0}apply() }{\s29\f0\fs22\lang2052{\*\listtag0}built-in function. (Prior}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch to Python 1.6, such argument objects could only be passed to }{\s29\f0\fs20\lang2052{\*\listtag0}apply() }{\s29\f0\fs22\lang2052{\*\listtag0}with}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch the function object for invocation.)}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs28\lang2052{\*\listtag0}\abinodiroverride\ltrch Example}{\s29\f0\fs28\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs28\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u20030 \uc0\u20363 }{\s29\f0\fs28\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1677\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch In our math game in Example 11.1 (}{\s29\f0\fs20\lang2052{\*\listtag0}easyMath.py}{\s29\f0\fs22\lang2052{\*\listtag0}), we will use the current function calling convention to generate a two-item argument list to send to the appropriate arithmetic function. (We will also show where }{\s29\f0\fs20\lang2052{\*\listtag0}apply()}{\s29\f0\fs22\lang2052{\*\listtag0}would have come in if it had been used.)}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1678\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The }{\s29\f0\fs20\lang2052{\*\listtag0}easyMath.py }{\s29\f0\fs22\lang2052{\*\listtag0}application is basically an arithmetic math quiz game for children where an arithmetic operation\uc1\u8212\'97addition or subtraction\uc1\u8212\'97 is randomly chosen. We use the functional equivalents of these operators, }{\s29\f0\fs20\lang2052{\*\listtag0}add() }{\s29\f0\fs22\lang2052{\*\listtag0}and }{\s29\f0\fs20\lang2052{\*\listtag0}sub()}{\s29\f0\fs22\lang2052{\*\listtag0}, both found in the }{\s29\f0\fs20\lang2052{\*\listtag0}operator }{\s29\f0\fs22\lang2052{\*\listtag0}module. We then generate the list of arguments (two, since these are binary operators/ operations). Then random numbers are chosen as the operands. Since we do not want}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch to support negative numbers in this more elementary edition of this appli- cation, we sort our list of two numbers in largest-to-smallest order, then call the corresponding function with this argument list and the randomly chosen arithmetic operator to obtain the correct solution to the posed problem.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1824\ri-20\s29\itap0{\s29\f0\fs24\lang2052{\*\listtag0}\abinodiroverride\ltrch Example 11.1 Arithmetic Game (easyMath.py)}{\s29\f0\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1824\ri2605\s29\itap0{\s29\f0\fs22\i\lang2052{\*\listtag0}\abinodiroverride\ltrch Randomly chooses numbers and an arithmetic function, displays the question, and verifies the results. Shows answer after three wrong tries and does not continue}{\s29\f0\fs22\i\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1824\ri-20\s29\itap0{\s29\f0\fs22\i\lang2052{\*\listtag0}\abinodiroverride\ltrch until the user enters the correct answer.}{\s29\f0\fs22\i\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx2540{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 1\tab #!/usr/bin/env python}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 2}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx2540{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 3\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}from }{\s29\f0\fs20\lang2052{\*\listtag0}operator }{\s29\f0\fs20\b\lang2052{\*\listtag0}import }{\s29\f0\fs20\lang2052{\*\listtag0}add, sub}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx2540{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 4\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}from }{\s29\f0\fs20\lang2052{\*\listtag0}random }{\s29\f0\fs20\b\lang2052{\*\listtag0}import }{\s29\f0\fs20\lang2052{\*\listtag0}randint, choice}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 5}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx2540{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 6\tab ops = \{'+': add, '-': sub\}}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx2540{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 7\tab MAXTRIES = 2}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 8}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx2540{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 9\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}def }{\s29\f0\fs20\lang2052{\*\listtag0}doprob():}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx3019{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 10\tab op = choice('+-')}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx3019{\shp{\*\shpinst\shpz0\shpbxmargin\shpbypara\shpwr2\shpwrk0\shpfblwtxt0\shpleft0\shptop0\shpbottom1035\shpright10620\shplid626690239{\sp{\sn shapeType}{\sv 202}}{\sp{\sn dxTextLeft}{\sv 27305}}{\sp{\sn dxTextRight}{\sv 27305}}{\sp{\sn dxTextTop}{\sv 27305}}{\sp{\sn dxTextBottom}{\sv 27305}}{\shptxt{\*\abitableprops table-line-thickness:0.8pt; table-col-spacing:0.03in; table-column-leftpos:0.0000in; table-column-props:1.6833in/3.0972in/2.5944in/1.6833in/3.0972in/2.5944in/1.6833in/3.0972in/2.5944in/1.6833in/3.0972in/2.5944in/1.6833in/3.0972in/2.5944in/; table-sdh:5748160}\par{\*\abicellprops left-attach:0; right-attach:1; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}{ \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx2445\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx6905\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx10641 \pard\plain\ltrpar\ql\li1899\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li319\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx2445\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx6905\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx10641 \pard\plain\ltrpar\ql\li1899\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li319\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx2445\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx6905\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx10641 \pard\plain\ltrpar\ql\li1899\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li319\ri-53\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:3; bot-attach:4; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.250000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx2445\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx6905\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx10641 \pard\plain\ltrpar\ql\li1897\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:3; bot-attach:4; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li319\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:3; bot-attach:4; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:4; bot-attach:5; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.250000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx2445\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx6905\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx10641 \pard\plain\ltrpar\ql\li1897\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:4; bot-attach:5; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li319\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:4; bot-attach:5; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}\row}{\*\abiendtable} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0}}}\par \pard\plain\ltrpar\ql\itap0{\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 11\tab nums = [randint(1,10) }{\f0\fs20\b\lang2052{\*\listtag0}for }{\f0\fs20\lang2052{\*\listtag0}i }{\f0\fs20\b\lang2052{\*\listtag0}in }{\f0\fs20\lang2052{\*\listtag0}range(2)]}{\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx3500{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 17\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}try}{\s29\f0\fs20\lang2052{\*\listtag0}:}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx3980{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 18\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}if }{\s29\f0\fs20\lang2052{\*\listtag0}int(raw_input(pr)) == ans:}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx4459{\shp{\*\shpinst\shpz0\shpbxmargin\shpbypara\shpwr2\shpwrk0\shpfblwtxt0\shpleft0\shptop0\shpbottom437\shpright4200\shplid103284441{\sp{\sn shapeType}{\sv 202}}{\sp{\sn dxTextLeft}{\sv 27305}}{\sp{\sn dxTextRight}{\sv 27305}}{\sp{\sn dxTextTop}{\sv 27305}}{\sp{\sn dxTextBottom}{\sv 27305}}{\shptxt{\*\abitableprops table-line-thickness:0.8pt; table-col-spacing:0.03in; table-column-leftpos:0.0000in; table-column-props:0.6944in/0.7639in/1.4583in/0.6944in/0.7639in/1.4583in/; table-sdh:574e5b0}\par{\*\abicellprops left-attach:0; right-attach:1; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}{ \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx1021\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx2121\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx4221 \pard\plain\ltrpar\ql\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li180\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx1021\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx2121\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx4221 \pard\plain\ltrpar\ql\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li794\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-74\s29\intbl\itap1\cell{\*\abiendcell}\row}{\*\abiendtable} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0}}}\par \pard\plain\ltrpar\ql\itap0{\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 19\tab }{\f0\fs20\b\lang2052{\*\listtag0}print }{\f0\fs20\lang2052{\*\listtag0}'correct'}{\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx4459{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 22\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}print }{\s29\f0\fs20\lang2052{\*\listtag0}'answer\\n%s%d'%(pr, ans)}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx3980{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 23\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}else}{\s29\f0\fs20\lang2052{\*\listtag0}:}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx4459{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 24\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}print }{\s29\f0\fs20\lang2052{\*\listtag0}'incorrect... try again'}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx4459{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 25\tab oops += 1}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx3500{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 26\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}except }{\s29\f0\fs20\lang2052{\*\listtag0}(KeyboardInterrupt, \\}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx4459{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 27\tab EOFError, ValueError):}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx3980{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 28\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}print }{\s29\f0\fs20\lang2052{\*\listtag0}'invalid input... try again'}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0{\shp{\*\shpinst\shpz0\shpbxmargin\shpbypara\shpwr2\shpwrk0\shpfblwtxt0\shpleft0\shptop0\shpbottom437\shpright2160\shplid983639269{\sp{\sn shapeType}{\sv 202}}{\sp{\sn dxTextLeft}{\sv 27305}}{\sp{\sn dxTextRight}{\sv 27305}}{\sp{\sn dxTextTop}{\sv 27305}}{\sp{\sn dxTextBottom}{\sv 27305}}{\shptxt{\*\abitableprops table-line-thickness:0.8pt; table-col-spacing:0.03in; table-column-leftpos:0.0000in; table-column-props:0.1944in/0.3472in/0.9583in/0.1944in/0.3472in/0.9583in/; table-sdh:57df630}\par{\*\abicellprops left-attach:0; right-attach:1; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}{ \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx301\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx801\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx2181 \pard\plain\ltrpar\ql\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li80\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx301\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx801\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx2181 \pard\plain\ltrpar\ql\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-55\s29\intbl\itap1\cell{\*\abiendcell}\row}{\*\abiendtable} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0}}}\par \pard\plain\ltrpar\ql\itap0{\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 29}{\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx3500{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 32\tab doprob()}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx3500{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 33\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}try}{\s29\f0\fs20\lang2052{\*\listtag0}:}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx3980{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 34\tab opt = raw_input('Again? [y]').lower()}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx3980{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 35\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}if }{\s29\f0\fs20\lang2052{\*\listtag0}opt }{\s29\f0\fs20\b\lang2052{\*\listtag0}and }{\s29\f0\fs20\lang2052{\*\listtag0}opt[0] == 'n':}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx4459{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 36\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}break}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx3500{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 37\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}except }{\s29\f0\fs20\lang2052{\*\listtag0}(KeyboardInterrupt, EOFError):}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx3980{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 38\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}break}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 39}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 40 }{\s29\f0\fs20\b\lang2052{\*\listtag0}if }{\s29\f0\fs20\lang2052{\*\listtag0}__name__ == '__main__':}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx3019{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 41\tab main()}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs28\lang2052{\*\listtag0}\abinodiroverride\ltrch Line-by-Line Explanation}{\s29\f0\fs28\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs28\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u-28656 \uc0\u-30644 \uc0\u-30237 \uc0\u-28214 }{\s29\f0\fs28\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Lines 1\uc1\u8211\'96 4}{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1676\sb60\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Our code begins with the usual Unix startup line followed by various imports of the functions that we will be using from the }{\s29\f0\fs20\lang2052{\*\listtag0}operator }{\s29\f0\fs22\lang2052{\*\listtag0}and }{\s29\f0\fs20\lang2052{\*\listtag0}ran- dom }{\s29\f0\fs22\lang2052{\*\listtag0}modules.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1676\sb60\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u25105 \uc0\u20204 \uc0\u30340 \uc0\u20195 \uc0\u30721 }{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Lines 6\uc1\u8211\'967}{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1683\sb60\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The global variables we use in this application are a set of operations and their corresponding functions, and a value indicating how many times (three: 0, 1, 2) we allow the user to enter an incorrect answer before we reveal the solution. The function dictionary uses the operator\uc1\u8217\'92s symbol to index into the dictionary, pulling out the appropriate arithmetic function.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\sb20\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Lines 9\uc1\u8211\'9628}{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1682\sb60\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The }{\s29\f0\fs20\lang2052{\*\listtag0}doprob() }{\s29\f0\fs22\lang2052{\*\listtag0}function is the core engine of the application. It randomly picks an operation and generates the two operands, sorting them from largest-to-smallest order in order to avoid negative numbers for subtraction problems. It then invokes the math function with the values, calculating the correct solution. The user is then prompted with the equation and given three opportunities to enter the correct answer.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1679\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Line 10 uses the }{\s29\f0\fs20\lang2052{\*\listtag0}random.choice() }{\s29\f0\fs22\lang2052{\*\listtag0}function. Its job is to take a sequence\uc1\u8212\'97a string of operation symbols in our case\uc1\u8212\'97and randomly choose one item and return it.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1676\s29\itap0\tx8820{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Line 11 uses a list comprehension to randomly choose two numbers for our exercise. This example is simple enough such that we could have just called }{\s29\f0\fs20\lang2052{\*\listtag0}randint() }{\s29\f0\fs22\lang2052{\*\listtag0}twice to get our operands, i.e., }{\s29\f0\fs20\lang2052{\*\listtag0}nums = [randint\tab (1,10), randint(1,10)]}{\s29\f0\fs22\lang2052{\*\listtag0}, but we wanted to use a list comprehension so that you could see another example of its use as well as in case we wanted to upgrade this problem to take on more than just two numbers, similar to the reason why instead of cutting and pasting the same piece of code, we put it into a }{\s29\f0\fs20\b\lang2052{\*\listtag0}for }{\s29\f0\fs22\lang2052{\*\listtag0}loop.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Line 12 will only work in Python 2.4 and newer because that is when the}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1679\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch reverse }{\s29\f0\fs22\lang2052{\*\listtag0}flag was added to the }{\s29\f0\fs20\lang2052{\*\listtag0}list.sort() }{\s29\f0\fs22\lang2052{\*\listtag0}method (as well as the new }{\s29\f0\fs20\lang2052{\*\listtag0}sorted() }{\s29\f0\fs22\lang2052{\*\listtag0}built-in function). If you are using an earlier Python version, you need to either:}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3087\ri-20\s29\itap0\tx3420{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8226\'95\tab Add an inverse comparison function to get a reverse sort, i.e.,}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3424\ri-20\s29\itap0{\s29\f0\fs20\b\lang2052{\*\listtag0}\abinodiroverride\ltrch lambda }{\s29\f0\fs20\lang2052{\*\listtag0}x, y: cmp(y, x)}{\s29\f0\fs22\lang2052{\*\listtag0}, or}{\s29\f0\fs20\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3087\ri-20\s29\itap0\tx3420{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8226\'95\tab Call }{\s29\f0\fs20\lang2052{\*\listtag0}nums.sort() }{\s29\f0\fs22\lang2052{\*\listtag0}followed by }{\s29\f0\fs20\lang2052{\*\listtag0}nums.reverse()}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Don\uc1\u8217\'92t be afraid of }{\s29\f0\fs20\b\lang2052{\*\listtag0}lambda }{\s29\f0\fs22\lang2052{\*\listtag0}if you have not seen it before. We will cover it}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch in this chapter, but for now, you can think of it as a one-line anonymous}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch function.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2640\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Line 13 is where }{\s29\f0\fs20\lang2052{\*\listtag0}apply() }{\s29\f0\fs22\lang2052{\*\listtag0}would have been used if you are using Python before 1.6. This call to the appropriate operation function would have been coded as }{\s29\f0\fs20\lang2052{\*\listtag0}apply(ops[op], nums) }{\s29\f0\fs22\lang2052{\*\listtag0}instead of }{\s29\f0\fs20\lang2052{\*\listtag0}ops[op](*nums)}{\s29\f0\fs22\lang2052{\*\listtag0}.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Lines 16\uc1\u8211\'9628 represent the controlling loop handling valid and invalid user}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2641\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch input. The }{\s29\f0\fs20\b\lang2052{\*\listtag0}while }{\s29\f0\fs22\lang2052{\*\listtag0}loop is \uc1\u8220\'93infinite,\uc1\u8221\'94 running until either the correct answer is given or the number of allowed attempts is exhausted, three in our case. It allows the program to accept erroneous input such as non-numbers, or vari- ous keyboard control characters. Once the user exceeds the maximum num- ber of tries, the answer is presented, and the user is \uc1\u8220\'93forced\uc1\u8221\'94 to enter the correct value, not proceeding until that has been done.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Lines 30\uc1\u8211\'9641}{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2637\sb60\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The main driver of the application is }{\s29\f0\fs20\lang2052{\*\listtag0}main()}{\s29\f0\fs22\lang2052{\*\listtag0}, called from the top level if the script is invoked directly. If imported, the importing function either manages the execution by calling }{\s29\f0\fs20\lang2052{\*\listtag0}doprob()}{\s29\f0\fs22\lang2052{\*\listtag0}, or calls }{\s29\f0\fs20\lang2052{\*\listtag0}main() }{\s29\f0\fs22\lang2052{\*\listtag0}for program control. }{\s29\f0\fs20\lang2052{\*\listtag0}main() }{\s29\f0\fs22\lang2052{\*\listtag0}simply calls }{\s29\f0\fs20\lang2052{\*\listtag0}doprob() }{\s29\f0\fs22\lang2052{\*\listtag0}to engage the user in the main functionality}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch of the script and prompts the user to quit or to try another problem.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2642\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Since the values and operators are chosen randomly, each execution of }{\s29\f0\fs20\lang2052{\*\listtag0}easyMath.py }{\s29\f0\fs22\lang2052{\*\listtag0}should be different. Here is what we got today (oh, and your answers may vary as well!):}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch $ easyMath.py}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri7947\s29\sl264\slmult1\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch 7 - 2 = 5 correct Again? [y]}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri7947\s29\sl264\slmult1\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch 7 * 6 = 42 correct Again? [y]}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch 7 * 3 = 20}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch incorrect... try again}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch 7 * 3 = 22}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch incorrect... try again}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch 7 * 3 = 23}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch sorry... the answer is}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch 7 * 3 = 21}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri7947\s29\sl264\slmult1\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch 7 * 3 = 21 correct Again? [y]}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri7713\s29\sl264\slmult1\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch 7 - 5 = 2 correct Again? [y] n}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs36\b\lang2052{\*\listtag0}\abinodiroverride\ltrch 11.3 Creating Functions}{\s29\f0\fs36\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs36\b\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u21019 \uc0\u24314 \uc0\u20989 \uc0\u25968 }{\s29\f0\fs36\b\lang2052{\*\listtag0}\par} {\listtext\pard\fi-1125\li4069\ri-20\sb80 1. }\pard\plain{\ltrpar\ql\fi-1125\li4069\ri-20\sb80\s29{\*\abilist\abilistid1003\abilistparentid0\abilistlevel1\abistartat1{\abifieldfont Times New Roman}{\abilistdecimal .}{\abilistdelim %L.}{\abiliststyle Numbered List}}{\*\pn\pnql\pnstart1\pnlvlbody\pndec{\pntxtb }{\pntxta .}}\fn-1125\li4069\ls4\ilvl0\itap0\tx4069{\s29\f0\fs32\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs32\i\b\lang2052{\*\listtag0}Statement}{\s29\f1\fs24\lang2052{\*\listtag0}\par} }\pard\plain\ltrpar\ql\li2943\ri-20\sb80\s29\itap0{\s29\f0\fs32\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def\uc0\u22768 \uc0\u26126 }{\s29\f0\fs32\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Functions are created using the }{\s29\f0\fs20\b\lang2052{\*\listtag0}def }{\s29\f0\fs22\lang2052{\*\listtag0}statement, with a syntax like the following:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\i\lang2052{\*\listtag0}function_name}{\s29\f0\fs18\lang2052{\*\listtag0}(}{\s29\f0\fs18\i\lang2052{\*\listtag0}arguments}{\s29\f0\fs18\lang2052{\*\listtag0}):}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3640\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch "}{\s29\f0\fs18\i\lang2052{\*\listtag0}function_documentation_string}{\s29\f0\fs18\lang2052{\*\listtag0}"}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3640\ri-20\s29\itap0{\s29\f0\fs18\i\lang2052{\*\listtag0}\abinodiroverride\ltrch function_body_suite}{\s29\f0\fs18\i\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The header line consists of the }{\s29\f0\fs20\b\lang2052{\*\listtag0}def }{\s29\f0\fs22\lang2052{\*\listtag0}keyword, the function name, and a set}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch of arguments (if any). The remainder of the }{\s29\f0\fs20\b\lang2052{\*\listtag0}def }{\s29\f0\fs22\lang2052{\*\listtag0}clause consists of an optional}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch but highly recommended documentation string and the required function}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri1507\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch body suite. We have seen many function declarations throughout this text, and here is another:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}helloSomeone(who):}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3468\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch 'returns a salutory string customized with the input'}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3525\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch return }{\s29\f0\fs18\lang2052{\*\listtag0}"Hello " + str(who)}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} {\listtext\pard\fi-1125\li4069\ri-20 2. }\pard\plain{\ltrpar\ql\fi-1125\li4069\ri-20\s29{\*\abilist\abilistid1003\abilistparentid0\abilistlevel1\abistartat1{\abifieldfont Times New Roman}{\abilistdecimal .}{\abilistdelim %L.}{\abiliststyle Numbered List}}{\*\pn\pnql\pnstart1\pnlvlbody\pndec{\pntxtb }{\pntxta .}}\fn-1125\li4069\ls4\ilvl0\itap0\tx4069{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Declaration versus Definition}{\s29\f1\fs24\lang2052{\*\listtag0}\par} }\pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u22768 \uc0\u26126 \uc0\u19982 \uc0\u23450 \uc0\u20041 \uc0\u27604 \uc0\u-28797 }{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Some programming languages differentiate between function declarations and function definitions. A function declaration consists of providing the parser with the function name, and the names (and traditionally the types) of its arguments, without necessarily giving any lines of code for the function, which is usually referred to as the function definition.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch In languages where there is a distinction, it is usually because the function definition may belong in a physically different location in the code from the function declaration. Python does not make a distinction between the two, as}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri1508\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch a function clause is made up of a declarative header line immediately followed by its defining suite.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch 11.3.3 Forward References}{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri1482\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Like some other high-level languages, Python does not permit you to reference or call a function before it has been declared. We can try a few examples to illustrate this:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri1482\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u21644 \uc0\u20854 \uc0\u20182 \uc0\u-25896 \uc0\u32423 \uc0\u-29715 \uc0\u-30208 \uc0\u31867 \uc0\u20284 ,Python}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri1482\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u25105 \uc0\u20204 \uc0\u19979 \uc0\u-26782 \uc0\u32473 \uc0\u20986 \uc0\u20960 \uc0\u20010 \uc0\u20363 \uc0\u23376 \uc0\u26469 \uc0\u30475 \uc0\u19968 \uc0\u19979 :}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri1482\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}foo():}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3640\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch print }{\s29\f0\fs18\lang2052{\*\listtag0}'in foo()'}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3640\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch bar()}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch If we were to call }{\s29\f0\fs20\lang2052{\*\listtag0}foo() }{\s29\f0\fs22\lang2052{\*\listtag0}here, it would fail because }{\s29\f0\fs20\lang2052{\*\listtag0}bar() }{\s29\f0\fs22\lang2052{\*\listtag0}has not been}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch declared yet:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u22914 \uc0\u26524 \uc0\u25105 \uc0\u20204 \uc0\u-29693 \uc0\u29992 \uc0\u20989 \uc0\u25968 }{\s29\f0\fs20\lang2052{\*\listtag0}foo(),\uc0\u-32593 \uc0\u23450 \uc0\u20250 \uc0\u22833 \uc0\u-29403 \uc0\u22240 \uc0\u20026 \uc0\u20989 \uc0\u25968 bar()\uc0\u-28712 \uc0\u27809 \uc0\u26377 \uc0\u22768 \uc0\u26126 :}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> foo()}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch in foo()}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi-227\li2452\ri5617\s29\sl264\slmult1\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch Traceback (innermost last): File "", line 1, in ?}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2452\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch File "", line 3, in foo}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch NameError: bar}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch We will now define }{\s29\f0\fs20\lang2052{\*\listtag0}bar()}{\s29\f0\fs22\lang2052{\*\listtag0}, placing its declaration before }{\s29\f0\fs20\lang2052{\*\listtag0}foo()}{\s29\f0\fs22\lang2052{\*\listtag0}\uc1\u8217\'92s declaration:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u25105 \uc0\u20204 \uc0\u29616 \uc0\u22312 \uc0\u23450 \uc0\u20041 \uc0\u20989 \uc0\u25968 }{\s29\f0\fs20\lang2052{\*\listtag0}bar(),\uc0\u22312 \uc0\u20989 \uc0\u25968 foo()\uc0\u21069 \uc0\u32473 \uc0\u20986 bar()\uc0\u30340 \uc0\u22768 \uc0\u26126 :}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}bar():}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2679\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch print }{\s29\f0\fs18\lang2052{\*\listtag0}'in bar()'}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}foo():}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2679\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch print }{\s29\f0\fs18\lang2052{\*\listtag0}'in foo()'}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2679\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch bar()}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Now we can safely call }{\s29\f0\fs20\lang2052{\*\listtag0}foo() }{\s29\f0\fs22\lang2052{\*\listtag0}with no problems:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u29616 \uc0\u22312 \uc0\u25105 \uc0\u20204 \uc0\u21487 \uc0\u20197 \uc0\u-26786 \uc0\u24120 \uc0\u23433 \uc0\u20840 \uc0\u30340 \uc0\u-29693 \uc0\u29992 }{\s29\f0\fs20\lang2052{\*\listtag0}foo(),\uc0\u-32756 \uc0\u19981 \uc0\u20250 \uc0\u20986 \uc0\u20219 \uc0\u20309 \uc0\u-27154 \uc0\u-26472 :}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri8067\s29\sl264\slmult1\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> foo() in foo() in bar()}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch In fact, we can even declare }{\s29\f0\fs20\lang2052{\*\listtag0}foo() }{\s29\f0\fs22\lang2052{\*\listtag0}before }{\s29\f0\fs20\lang2052{\*\listtag0}bar()}{\s29\f0\fs22\lang2052{\*\listtag0}:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u20107 \uc0\u23454 \uc0\u19978 ,\uc0\u25105 \uc0\u20204 \uc0\u21487 \uc0\u20197 \uc0\u22312 \uc0\u20989 \uc0\u25968 }{\s29\f0\fs20\lang2052{\*\listtag0}bar()\uc0\u21069 \uc0\u23450 \uc0\u20041 \uc0\u20989 \uc0\u25968 foo():}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}foo():}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2679\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch print }{\s29\f0\fs18\lang2052{\*\listtag0}'in foo()'}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2679\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch bar()}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}bar():}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2679\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch print }{\s29\f0\fs18\lang2052{\*\listtag0}'in bar()'}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li1743\ri2474\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Amazingly enough, this code still works fine with no forward referencing problems:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li1743\ri2474\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u22826 \uc0\u31070 \uc0\u22855 \uc0\u20102 ,\uc0\u-28711 \uc0\u27573 \uc0\u20195 \uc0\u30721 \uc0\u21487 \uc0\u20197 \uc0\u-26786 \uc0\u24120 \uc0\u22909 \uc0\u30340 \uc0\u-28720 \uc0\u-30644 ,\uc0\u19981 \uc0\u20250 \uc0\u26377 \uc0\u21069 \uc0\u-26782 \uc0\u30340 \uc0\u-29693 \uc0\u29992 \uc0\u-27154 \uc0\u-26472 :}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri8067\s29\sl264\slmult1\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> foo() in foo() in bar()}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2637\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch This piece of code is fine because even though a call to }{\s29\f0\fs20\lang2052{\*\listtag0}bar() }{\s29\f0\fs22\lang2052{\*\listtag0}(from }{\s29\f0\fs20\lang2052{\*\listtag0}foo()}{\s29\f0\fs22\lang2052{\*\listtag0}) appears before }{\s29\f0\fs20\lang2052{\*\listtag0}bar()}{\s29\f0\fs22\lang2052{\*\listtag0}\uc1\u8217\'92s definition, }{\s29\f0\fs20\lang2052{\*\listtag0}foo() }{\s29\f0\fs22\i\lang2052{\*\listtag0}itself }{\s29\f0\fs22\lang2052{\*\listtag0}is not called before }{\s29\f0\fs20\lang2052{\*\listtag0}bar() }{\s29\f0\fs22\lang2052{\*\listtag0}is declared. In other words, we declared }{\s29\f0\fs20\lang2052{\*\listtag0}foo()}{\s29\f0\fs22\lang2052{\*\listtag0}, then }{\s29\f0\fs20\lang2052{\*\listtag0}bar()}{\s29\f0\fs22\lang2052{\*\listtag0}, and }{\s29\f0\fs22\i\lang2052{\*\listtag0}then }{\s29\f0\fs22\lang2052{\*\listtag0}called }{\s29\f0\fs20\lang2052{\*\listtag0}foo()}{\s29\f0\fs22\lang2052{\*\listtag0}, but by that time, }{\s29\f0\fs20\lang2052{\*\listtag0}bar() }{\s29\f0\fs22\lang2052{\*\listtag0}existed already, so the call suc- ceeds.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2640\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Notice that the output of }{\s29\f0\fs20\lang2052{\*\listtag0}foo() }{\s29\f0\fs22\lang2052{\*\listtag0}succeeded before the error came about. }{\s29\f0\fs20\lang2052{\*\listtag0}NameError }{\s29\f0\fs22\lang2052{\*\listtag0}is the exception that is always raised when any uninitialized iden- tifiers are accessed.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2640\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\par} {\listtext\pard\fi-1125\li4069\ri-20 3. }\pard\plain{\ltrpar\ql\fi-1125\li4069\ri-20\s29{\*\abilist\abilistid1003\abilistparentid0\abilistlevel1\abistartat1{\abifieldfont Times New Roman}{\abilistdecimal .}{\abilistdelim %L.}{\abiliststyle Numbered List}}{\*\pn\pnql\pnstart1\pnlvlbody\pndec{\pntxtb }{\pntxta .}}\fn-1125\li4069\ls4\ilvl0\itap0\tx4069{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Function Attributes}{\s29\f1\fs24\lang2052{\*\listtag0}\par} }\pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u20989 \uc0\u25968 \uc0\u23646 \uc0\u24615 }{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch We will briefly discuss namespaces later on in this chapter, especially their relationship to variable scope. There will be a more in-depth treatment of namespaces in the next chapter; however, here we want to point out a basic feature of Python namespaces.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1679\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch You get a free one with every Python module, class, and function. You can have a variable named }{\s29\f0\fs20\lang2052{\*\listtag0}x }{\s29\f0\fs22\lang2052{\*\listtag0}in modules }{\s29\f0\fs20\lang2052{\*\listtag0}foo }{\s29\f0\fs22\lang2052{\*\listtag0}and }{\s29\f0\fs20\lang2052{\*\listtag0}bar}{\s29\f0\fs22\lang2052{\*\listtag0}, but can use them in your current application upon importing both modules. So even though the same variable name is used in both modules, you are safe because the dotted attribute notation implies a separate namespace for both, i.e., there is no naming conflict in this snippet of code:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch import }{\s29\f0\fs18\lang2052{\*\listtag0}foo, bar}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch print }{\s29\f0\fs18\lang2052{\*\listtag0}foo.x + bar.x}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li2704\ri1482\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Function attributes are another area of Python to use the dotted-attribute notation and have a namespace. (More on namespaces later on in this chapter}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch as well as Chapter 12 on Python modules.)}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}foo():}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3618\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch 'foo() -- properly created doc string'}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}bar():}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3640\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch pass}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch bar.__doc__ = 'Oops, forgot the doc str above'}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch bar.version = 0.1}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1676\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch In }{\s29\f0\fs20\lang2052{\*\listtag0}foo() }{\s29\f0\fs22\lang2052{\*\listtag0}above, we create our documentation string as normal, e.g., the first unassigned string after the function declaration. When declaring }{\s29\f0\fs20\lang2052{\*\listtag0}bar()}{\s29\f0\fs22\lang2052{\*\listtag0}, we left everything out and just used the dotted-attribute notation to add its doc string as well as another attribute. We can then access the attributes freely. Below is an example with the interactive interpreter. (As you may already be aware, using the built-in function }{\s29\f0\fs20\lang2052{\*\listtag0}help() }{\s29\f0\fs22\lang2052{\*\listtag0}gives more of a pretty- printing format than just using the vanilla print of the }{\s29\f0\fs20\lang2052{\*\listtag0}__doc__ }{\s29\f0\fs22\lang2052{\*\listtag0}attribute, but you can use either one you wish.)}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> help(foo)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch Help on function foo in module __main__:}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch foo()}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3640\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch foo() -- properly created doc string}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> }{\s29\f0\fs18\b\lang2052{\*\listtag0}print }{\s29\f0\fs18\lang2052{\*\listtag0}bar.version}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch 0.1}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> }{\s29\f0\fs18\b\lang2052{\*\listtag0}print }{\s29\f0\fs18\lang2052{\*\listtag0}foo.__doc__}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch foo() -- properly created doc string}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> }{\s29\f0\fs18\b\lang2052{\*\listtag0}print }{\s29\f0\fs18\lang2052{\*\listtag0}bar.__doc__}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch Oops, forgot the doc str above}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2643\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Notice how we can define the documentation string outside of the function declaration. Yet we can still access it at runtime just like normal. One thing that you cannot do, however, is get access to the attributes in the function declaration.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2637\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch In other words, there is no such thing as a \uc1\u8220\'93self\uc1\u8221\'94 inside a function declaration so that you can make an assignment like }{\s29\f0\fs20\lang2052{\*\listtag0}__dict__['version'] = 0.1}{\s29\f0\fs22\lang2052{\*\listtag0}. The rea- son for this is because the function object has not even been created yet, but afterward you have the function object and can add to its dictionary in the way we described above . . . another free namespace!}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li1743\ri2474\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Function attributes were added to Python in 2.1, and you can read more about them in PEP 232.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} {\listtext\pard\fi-1125\li4069\ri-20 4. }\pard\plain{\ltrpar\ql\fi-1125\li4069\ri-20\s29{\*\abilist\abilistid1003\abilistparentid0\abilistlevel1\abistartat1{\abifieldfont Times New Roman}{\abilistdecimal .}{\abilistdelim %L.}{\abiliststyle Numbered List}}{\*\pn\pnql\pnstart1\pnlvlbody\pndec{\pntxtb }{\pntxta .}}\fn-1125\li4069\ls4\ilvl0\itap0\tx4069{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Inner or Nested Functions}{\s29\f1\fs24\lang2052{\*\listtag0}\par} }\pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u20869 \uc0\u-28440 /\uc0\u20869 \uc0\u23884 \uc0\u20989 \uc0\u25968 }{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2637\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch It is perfectly legitimate to create function (object)s inside other functions. That is the definition of an }{\s29\f0\fs22\i\lang2052{\*\listtag0}inner }{\s29\f0\fs22\lang2052{\*\listtag0}or }{\s29\f0\fs22\i\lang2052{\*\listtag0}nested function}{\s29\f0\fs22\lang2052{\*\listtag0}. Because Python now supports statically nested scoping (introduced in 2.1 but standard as of 2.2), inner functions are actually useful now. It made no sense for older versions of Python, which only supported the global and one local scope. So how does one create a nested function?}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li1743\ri2457\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The (obvious) way to create an inner function is to define a function from within an outer function\uc1\u8217\'92s definition (using the }{\s29\f0\fs20\b\lang2052{\*\listtag0}def }{\s29\f0\fs22\lang2052{\*\listtag0}keyword), as in:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\sb80\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}foo():}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2679\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}bar():}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3135\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch print }{\s29\f0\fs18\lang2052{\*\listtag0}'bar() called'}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2679\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch print }{\s29\f0\fs18\lang2052{\*\listtag0}'foo() called'}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2679\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch bar()}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch foo()}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch bar()}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li1743\ri2457\sb60\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch If we stick this code in a module, say }{\s29\f0\fs20\lang2052{\*\listtag0}inner.py}{\s29\f0\fs22\lang2052{\*\listtag0}, and run it, we get the fol- lowing output:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\abinodiroverride\ltrch }{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri7713\s29\sl264\slmult1\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch foo() called bar() called}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi-227\li2452\ri5155\s29\sl264\slmult1\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch Traceback (most recent call last): File "inner.py", line 11, in ?}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2679\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch bar()}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch NameError: name 'bar' is not defined}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1681\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch One interesting aspect of inner functions is that they are wholly contained inside the outer function\uc1\u8217\'92s }{\s29\f0\fs22\i\lang2052{\*\listtag0}scope }{\s29\f0\fs22\lang2052{\*\listtag0}(the places where you can access an object; more on scope later on in this chapter). If there are no outside references to }{\s29\f0\fs20\lang2052{\*\listtag0}bar()}{\s29\f0\fs22\lang2052{\*\listtag0}, it cannot be called from anywhere else except inside the outer func- tion, hence the reason for the exception you see at the end of execution in the above code snippet.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li2704\ri1475\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Another way of creating a function object while inside a(nother) function is by using the }{\s29\f0\fs20\b\lang2052{\*\listtag0}lambda }{\s29\f0\fs22\lang2052{\*\listtag0}statement. We will cover this later on in section 11.7.1.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Inner functions turn into something special called }{\s29\f0\fs22\i\lang2052{\*\listtag0}closures }{\s29\f0\fs22\lang2052{\*\listtag0}if the definition}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch of an inner function contains a reference to an object defined in an outer function. (It can even be beyond the immediately enclosing outer function too.) We will learn more about closures coming up in Section 11.8.4. In the next section, we will introduce decorators, but the example application also includes a preview of a closure.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} {\listtext\pard\fi-1125\li4069\ri-20 5. }\pard\plain{\ltrpar\ql\fi-1125\li4069\ri-20\s29{\*\abilist\abilistid1003\abilistparentid0\abilistlevel1\abistartat1{\abifieldfont Times New Roman}{\abilistdecimal .}{\abilistdelim %L.}{\abiliststyle Numbered List}}{\*\pn\pnql\pnstart1\pnlvlbody\pndec{\pntxtb }{\pntxta .}}\fn-1125\li4069\ls4\ilvl0\itap0\tx4069{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch *Function (and Method) Decorators}{\s29\f1\fs24\lang2052{\*\listtag0}\par} }\pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch *\uc0\u20989 \uc0\u25968 \uc0\u-248 \uc0\u19982 \uc0\u26041 \uc0\u27861 \uc0\u-247 \uc0\u20462 \uc0\u-26256 \uc0\u31526 }{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1680\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The main motivation behind }{\s29\f0\fs22\i\lang2052{\*\listtag0}decorators }{\s29\f0\fs22\lang2052{\*\listtag0}came from Python object-oriented programming (OOP). Decorators are just \uc1\u8220\'93overlays\uc1\u8221\'94 on top of function calls. These overlays are just additional calls that are applied when a function or method is declared.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1677\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The syntax for decorators uses a leading \uc1\u8220\'93at-sign\uc1\u8221\'94 ( }{\s29\f0\fs20\lang2052{\*\listtag0}@ }{\s29\f0\fs22\lang2052{\*\listtag0}) followed by the dec- orator function name and optional arguments. The line following the decora- tor declaration is the function being decorated, along with }{\s29\f0\fs22\i\lang2052{\*\listtag0}its }{\s29\f0\fs22\lang2052{\*\listtag0}optional arguments. It looks something like this:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch @decorator(}{\s29\f0\fs18\i\lang2052{\*\listtag0}dec_opt_args}{\s29\f0\fs18\lang2052{\*\listtag0})}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}func2Bdecorated(}{\s29\f0\fs18\i\lang2052{\*\listtag0}func_opt_args}{\s29\f0\fs18\lang2052{\*\listtag0}):}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3640\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch :}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch So how (and why) did this syntax come into being? What was the inspira- tion behind decorators? Well, when static and class methods were added to Python in 2.2, the idiom required to realize them was clumsy, confusing, and makes code less readable, i.e.,}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch class }{\s29\f0\fs18\lang2052{\*\listtag0}MyClass(object):}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3663\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}staticFoo():}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qc\li4023\ri7201\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch :}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3663\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch staticFoo = staticmethod(staticFoo)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qc\li4023\ri7201\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch :}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch (It was clearly stated for that release that this was not the final syntax}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2636\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch anyway.) Within this class declaration, we define a method named }{\s29\f0\fs20\lang2052{\*\listtag0}static- Foo()}{\s29\f0\fs22\lang2052{\*\listtag0}. Now since this is intended to become a static method, we leave out the }{\s29\f0\fs20\lang2052{\*\listtag0}self }{\s29\f0\fs22\lang2052{\*\listtag0}argument, which is required for standard class methods, as you will see in Chapter 12. The }{\s29\f0\fs20\lang2052{\*\listtag0}staticmethod() }{\s29\f0\fs22\lang2052{\*\listtag0}built-in function is then used to}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2635\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8220\'93convert\uc1\u8221\'94 the function into a static method, but note how \uc1\u8220\'93sloppy\uc1\u8221\'94 it looks with }{\s29\f0\fs20\b\lang2052{\*\listtag0}def }{\s29\f0\fs20\lang2052{\*\listtag0}staticFoo() }{\s29\f0\fs22\lang2052{\*\listtag0}followed by }{\s29\f0\fs20\lang2052{\*\listtag0}staticFoo = staticmethod (sta- ticFoo)}{\s29\f0\fs22\lang2052{\*\listtag0}. With decorators, you can now replace that piece of code with the following:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\sb20\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch class }{\s29\f0\fs18\lang2052{\*\listtag0}MyClass(object):}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch @staticmethod}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}staticFoo():}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3064\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch :}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li1743\ri2474\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Furthermore, decorators can be \uc1\u8220\'93stacked\uc1\u8221\'94 like function calls, so here is a more general example with multiple decorators:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch @deco2}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch @deco1}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}func(}{\s29\f0\fs18\i\lang2052{\*\listtag0}arg1}{\s29\f0\fs18\lang2052{\*\listtag0}, }{\s29\f0\fs18\i\lang2052{\*\listtag0}arg2}{\s29\f0\fs18\lang2052{\*\listtag0}, ...): }{\s29\f0\fs18\b\lang2052{\*\listtag0}pass}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch This is equivalent to creating a }{\s29\f0\fs22\i\lang2052{\*\listtag0}composite }{\s29\f0\fs22\lang2052{\*\listtag0}function:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}func(}{\s29\f0\fs18\i\lang2052{\*\listtag0}arg1}{\s29\f0\fs18\lang2052{\*\listtag0}, }{\s29\f0\fs18\i\lang2052{\*\listtag0}arg2}{\s29\f0\fs18\lang2052{\*\listtag0}, ...): }{\s29\f0\fs18\b\lang2052{\*\listtag0}pass}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch func = deco2(deco1(func))}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li1743\ri2455\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Function composition in math is defined like this: }{\s29\f0\fs20\lang2052{\*\listtag0}(g \uc1\u8226\'95 f)(x) = g(f(x))}{\s29\f0\fs22\lang2052{\*\listtag0}. For consistency in Python:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\sb20\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch @g}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch @f}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}foo():}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2679\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch :}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch . . . is the same as }{\s29\f0\fs20\lang2052{\*\listtag0}foo = g(f(foo))}{\s29\f0\fs22\lang2052{\*\listtag0}.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs28\lang2052{\*\listtag0}\abinodiroverride\ltrch Decorators With and Without Arguments}{\s29\f0\fs28\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs28\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u26377 \uc0\u21442 \uc0\u25968 \uc0\u21644 \uc0\u26080 \uc0\u21442 \uc0\u25968 \uc0\u30340 \uc0\u20462 \uc0\u-26256 \uc0\u31526 }{\s29\f0\fs28\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2643\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Yes the syntax is slightly mind-bending at first, but once you are comfortable with it, the only twist on top of that is when you use decorators with argu- ments. Without arguments, a decorator like:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch @deco}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}foo(): }{\s29\f0\fs18\b\lang2052{\*\listtag0}pass}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch . . . is pretty straightforward:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch foo = deco(foo)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li2704\ri1514\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Function composition without arguments (as seen above) follows. How- ever, a decorator }{\s29\f0\fs20\lang2052{\*\listtag0}decomaker() }{\s29\f0\fs22\i\lang2052{\*\listtag0}with }{\s29\f0\fs22\lang2052{\*\listtag0}arguments:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch @decomaker(}{\s29\f0\fs18\i\lang2052{\*\listtag0}deco_args}{\s29\f0\fs18\lang2052{\*\listtag0})}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}foo(): }{\s29\f0\fs18\b\lang2052{\*\listtag0}pass}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1676\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch . . . needs to itself return a decorator that takes the function as an argu- ment. In other words, }{\s29\f0\fs20\lang2052{\*\listtag0}decomaker() }{\s29\f0\fs22\lang2052{\*\listtag0}does something with }{\s29\f0\fs20\i\lang2052{\*\listtag0}deco_args }{\s29\f0\fs22\lang2052{\*\listtag0}and returns a function object that is a decorator that takes }{\s29\f0\fs20\lang2052{\*\listtag0}foo }{\s29\f0\fs22\lang2052{\*\listtag0}as its argument. To put it simply:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\sb20\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch foo = decomaker(}{\s29\f0\fs18\i\lang2052{\*\listtag0}deco_args}{\s29\f0\fs18\lang2052{\*\listtag0})(foo)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li2704\ri1514\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Here is an example featuring multiple decorators in which one takes an argument:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch @deco1(}{\s29\f0\fs18\i\lang2052{\*\listtag0}deco_arg}{\s29\f0\fs18\lang2052{\*\listtag0})}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch @deco2}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}func(): }{\s29\f0\fs18\b\lang2052{\*\listtag0}pass}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch This is equivalent to:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch func = deco1(}{\s29\f0\fs18\i\lang2052{\*\listtag0}deco_arg}{\s29\f0\fs18\lang2052{\*\listtag0})(deco2(func))}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1683\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch We hope that if you understand these examples here, things will become much clearer. We present a more useful yet still simple script below where the decorator does not take an argument. Example 11.8 is an intermediate script with a decorator that }{\s29\f0\fs22\i\lang2052{\*\listtag0}does }{\s29\f0\fs22\lang2052{\*\listtag0}take an argument.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs28\lang2052{\*\listtag0}\abinodiroverride\ltrch So What }{\s29\f0\fs28\i\lang2052{\*\listtag0}Are }{\s29\f0\fs28\lang2052{\*\listtag0}Decorators?}{\s29\f0\fs28\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs28\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u20160 \uc0\u20040 \uc0\u26159 \uc0\u20462 \uc0\u-26256 \uc0\u31526 \uc0\u-225 }{\s29\f0\fs28\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1680\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch We know that decorators are really functions now. We also know that they take function objects. But what will they do with those functions? Generally, when you wrap a function, you eventually }{\s29\f0\fs22\i\lang2052{\*\listtag0}call }{\s29\f0\fs22\lang2052{\*\listtag0}it. The nice thing is that we can do that whenever it is appropriate for our wrapper. We can run some preliminary code before executing the function or some cleanup code afterward, like post- mortem analysis. It is up to the programmer. So when you see a decorator function, be prepared to find some code in it, and somewhere embedded within its definition, a call or at least }{\s29\f0\fs22\i\lang2052{\*\listtag0}some }{\s29\f0\fs22\lang2052{\*\listtag0}reference, to the target function.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch This feature essentially introduces the concept that Java developers call AOP,}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri1486\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch or aspect-oriented programming. You can place code in your decorators for con- cerns that cut across your application. For example, you can use decorators to:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\sb20\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3087\ri-20\s29\itap0\tx3420{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8226\'95\tab Introduce logging}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi-335\li3424\ri2724\s29\itap0\tx3420{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8226\'95\tab Insert timing logic (aka }{\s29\f0\fs22\i\lang2052{\*\listtag0}instrumentation}{\s29\f0\fs22\lang2052{\*\listtag0}) for monitoring performance}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3087\ri-20\s29\itap0\tx3420{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8226\'95\tab Add transactional capabilities to functions}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The ability to support decorators is very important for creating enterprise}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri2468\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch applications in Python. You will see that the bullet points above correspond quite closely to our example below as well as Example 11.2.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs28\lang2052{\*\listtag0}\abinodiroverride\ltrch Decorator Example}{\s29\f0\fs28\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs28\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u20462 \uc0\u-26256 \uc0\u31526 \uc0\u20030 \uc0\u20363 }{\s29\f0\fs28\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2643\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch We have an extremely simple example below, but it should get you started in really understanding how decorators work. This example \uc1\u8220\'93decorates\uc1\u8221\'94 a (use- less) function by displaying the time that it was executed. It is a \uc1\u8220\'93timestamp decoration\uc1\u8221\'94 similar to the timestamp server that we discuss in Chapter 16.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1824\ri-20\s29\itap0{\s29\f0\fs24\lang2052{\*\listtag0}\abinodiroverride\ltrch Example 11.2 Example of Using a Function Decorator (deco.py)}{\s29\f0\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1824\ri-20\s29\itap0{\s29\f0\fs22\i\lang2052{\*\listtag0}\abinodiroverride\ltrch This demonstration of a decorator (and closures) shows that it is merely a}{\s29\f0\fs22\i\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1824\ri2875\s29\itap0{\s29\f0\fs22\i\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8220\'93wrapper\uc1\u8221\'94 with which to \uc1\u8220\'93decorate\uc1\u8221\'94 (or overlay) a function, returning the altered function object and reassigning it to the original identifier, forever losing access to the original function object.}{\s29\f0\fs22\i\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx2540{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 1\tab #!/usr/bin/env python}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 2}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx2540{\shp{\*\shpinst\shpz0\shpbxmargin\shpbypara\shpwr2\shpwrk0\shpfblwtxt0\shpleft0\shptop0\shpbottom609\shpright3050\shplid1962338763{\sp{\sn shapeType}{\sv 202}}{\sp{\sn dxTextLeft}{\sv 27305}}{\sp{\sn dxTextRight}{\sv 27305}}{\sp{\sn dxTextTop}{\sv 27305}}{\sp{\sn dxTextBottom}{\sv 27305}}{\shptxt{\*\abitableprops table-line-thickness:0.8pt; table-col-spacing:0.03in; table-column-leftpos:0.0000in; table-column-props:0.1597in/0.3819in/1.5764in/0.1597in/0.3819in/1.5764in/0.1597in/0.3819in/1.5764in/; table-sdh:4b5eff0}\par{\*\abicellprops left-attach:0; right-attach:1; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}{ \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx251\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx801\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3071 \pard\plain\ltrpar\ql\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx251\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx801\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3071 \pard\plain\ltrpar\ql\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li130\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx251\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx801\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3071 \pard\plain\ltrpar\ql\ri-649\s29\intbl\itap1\tx859\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li110\ri-77\s29\intbl\itap1\cell{\*\abiendcell}\row}{\*\abiendtable} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0}}}\par \pard\plain\ltrpar\ql\itap0{\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 3\tab }{\f0\fs20\b\lang2052{\*\listtag0}from }{\f0\fs20\lang2052{\*\listtag0}time }{\f0\fs20\b\lang2052{\*\listtag0}import }{\f0\fs20\lang2052{\*\listtag0}ctime, sleep}{\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx3539{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 7\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}print }{\s29\f0\fs20\lang2052{\*\listtag0}'[%s] %s() called' % (}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx4020{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 8\tab ctime(), func.__name__)}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx3539{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 9\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}return }{\s29\f0\fs20\lang2052{\*\listtag0}func()}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx3060{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 10\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}return }{\s29\f0\fs20\lang2052{\*\listtag0}wrappedFunc}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 11}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 12 @tsfunc}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 13 }{\s29\f0\fs20\b\lang2052{\*\listtag0}def }{\s29\f0\fs20\lang2052{\*\listtag0}foo():}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx3060{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 14\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}pass}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 15}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 16 foo()}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 17 sleep(4)}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 18}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 19 }{\s29\f0\fs20\b\lang2052{\*\listtag0}for }{\s29\f0\fs20\lang2052{\*\listtag0}i }{\s29\f0\fs20\b\lang2052{\*\listtag0}in }{\s29\f0\fs20\lang2052{\*\listtag0}range(2):}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx3060{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 20\tab sleep(1)}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx3060{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 21\tab foo()}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Running this script, we get the following output:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch [Sun Mar 19 22:50:28 2006] foo() called}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch [Sun Mar 19 22:50:33 2006] foo() called}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch [Sun Mar 19 22:50:34 2006] foo() called}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs28\lang2052{\*\listtag0}\abinodiroverride\ltrch Line-by-Line Explanation}{\s29\f0\fs28\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs28\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u-28656 \uc0\u-30644 \uc0\u-30237 \uc0\u-28214 }{\s29\f0\fs28\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Lines 5\uc1\u8211\'9610}{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri1474\sb60\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Following the startup and module import lines, the }{\s29\f0\fs20\lang2052{\*\listtag0}tsfunc() }{\s29\f0\fs22\lang2052{\*\listtag0}function is a decorator that displays a timestamp (to standard output) of when a function is called. It defines an inner function }{\s29\f0\fs20\lang2052{\*\listtag0}wrappedFunc()}{\s29\f0\fs22\lang2052{\*\listtag0}, which adds the timestamp and calls the target function. The return value of the decorator is the \uc1\u8220\'93wrapped\uc1\u8221\'94 function.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri1474\sb60\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Lines 12\uc1\u8211\'9621}{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1682\sb60\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch We define function }{\s29\f0\fs20\lang2052{\*\listtag0}foo() }{\s29\f0\fs22\lang2052{\*\listtag0}with an empty body (which does nothing) and deco- rate it with }{\s29\f0\fs20\lang2052{\*\listtag0}tsfunc()}{\s29\f0\fs22\lang2052{\*\listtag0}. We then call it once as a proof-of-concept, wait four seconds, then call it twice more, pausing one second before each invocation.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1682\sb60\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch As a result, after it has been called once, the second time it is called should be five (4 + 1) seconds after the first call, and the third time around should only be one second after that. This corresponds perfectly to the program out- put seen above.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li2704\ri1500\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch You can read more about decorators in the Python Language Reference, the \uc1\u8220\'93What\uc1\u8217\'92s New in Python 2.4\uc1\u8221\'94 document, and the defining PEP 318.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} {\listtext\pard\fi-1125\li2597\ri-20 3 }\pard\plain{\ltrpar\ql\fi-1125\li2597\ri-20\s29{\*\abilist\abilistid1004\abilistparentid0\abilistlevel1\abistartat3{\abifieldfont Times New Roman}{\abilistdecimal .}{\abilistdelim %L}{\abiliststyle Numbered List}}{\*\pn\pnql\pnstart3\pnlvlbody\pndec{\pntxtb }{\pntxta }}\fn-1125\li2597\ls5\ilvl0\itap0\tx2597{\s29\f0\fs36\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Passing Functions}{\s29\f1\fs24\lang2052{\*\listtag0}\par} }\pard\plain\ltrpar\ql\li1471\ri-20\s29\itap0{\s29\f0\fs36\b\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u20256 \uc0\u-28654 \uc0\u20989 \uc0\u25968 }{\s29\f0\fs36\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The concept of function pointers is an advanced topic when learning a language such as C, but not Python where functions are like any other object. They can be referenced (accessed or aliased to other variables), passed as arguments to functions, be elements of container objects such as lists and dictionaries, etc. The one unique characteristic of functions which may set them apart from other objects is that they are callable, i.e., they can be invoked via the function opera- tor. (There are other callables in Python. For more information, see Chapter 14.) In the description above, we noted that functions can be aliases to other variables. Because all objects are passed by reference, functions are no dif- ferent. When assigning to another variable, you are assigning the reference to the same object; and if that object is a function, then all aliases to that same object are callable:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> }{\s29\f0\fs18\b\lang2052{\*\listtag0}def }{\s29\f0\fs18\lang2052{\*\listtag0}foo():}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0\tx4079{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch ...\tab }{\s29\f0\fs18\b\lang2052{\*\listtag0}print }{\s29\f0\fs18\lang2052{\*\listtag0}'in foo()'}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch ...}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> bar = foo}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> bar()}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch in foo()}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch When we assigned }{\s29\f0\fs20\lang2052{\*\listtag0}foo }{\s29\f0\fs22\lang2052{\*\listtag0}to }{\s29\f0\fs20\lang2052{\*\listtag0}bar}{\s29\f0\fs22\lang2052{\*\listtag0}, we are assigning the same function object}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch to }{\s29\f0\fs20\lang2052{\*\listtag0}bar}{\s29\f0\fs22\lang2052{\*\listtag0}, thus we can invoke }{\s29\f0\fs20\lang2052{\*\listtag0}bar() }{\s29\f0\fs22\lang2052{\*\listtag0}in the same way we call }{\s29\f0\fs20\lang2052{\*\listtag0}foo()}{\s29\f0\fs22\lang2052{\*\listtag0}. Be sure}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch you understand the difference between \uc1\u8220\'93}{\s29\f0\fs20\lang2052{\*\listtag0}foo}{\s29\f0\fs22\lang2052{\*\listtag0}\uc1\u8221\'94 (reference of the function}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch object) and \uc1\u8220\'93}{\s29\f0\fs20\lang2052{\*\listtag0}foo()}{\s29\f0\fs22\lang2052{\*\listtag0}\uc1\u8221\'94 (invocation of the function object).}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Taking our reference example a bit further, we can even pass functions in}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch as arguments to other functions for invocation:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> }{\s29\f0\fs18\b\lang2052{\*\listtag0}def }{\s29\f0\fs18\lang2052{\*\listtag0}bar(argfunc):}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0\tx3120{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch ...\tab argfunc()}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch ...}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> bar(foo)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch in foo()}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2636\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Note that it is the function object }{\s29\f0\fs20\lang2052{\*\listtag0}foo }{\s29\f0\fs22\lang2052{\*\listtag0}that is being passed to }{\s29\f0\fs20\lang2052{\*\listtag0}bar()}{\s29\f0\fs22\lang2052{\*\listtag0}. }{\s29\f0\fs20\lang2052{\*\listtag0}bar() }{\s29\f0\fs22\lang2052{\*\listtag0}is the function that actually calls }{\s29\f0\fs20\lang2052{\*\listtag0}foo() }{\s29\f0\fs22\lang2052{\*\listtag0}(which has been aliased to the local variable }{\s29\f0\fs20\lang2052{\*\listtag0}argfunc }{\s29\f0\fs22\lang2052{\*\listtag0}in the same way that we assigned }{\s29\f0\fs20\lang2052{\*\listtag0}foo }{\s29\f0\fs22\lang2052{\*\listtag0}to }{\s29\f0\fs20\lang2052{\*\listtag0}bar }{\s29\f0\fs22\lang2052{\*\listtag0}in the previous example). Now let us examine a more realistic example, }{\s29\f0\fs20\lang2052{\*\listtag0}numconv.py}{\s29\f0\fs22\lang2052{\*\listtag0}, whose code is given in Example 11.3.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1824\ri-20\s29\itap0{\s29\f0\fs24\lang2052{\*\listtag0}\abinodiroverride\ltrch Example 11.3 Passing and Calling (Built-in) Functions}{\s29\f0\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1824\ri-20\sb20\s29\itap0{\s29\f0\fs24\lang2052{\*\listtag0}\abinodiroverride\ltrch (numConv.py)}{\s29\f0\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1824\ri-20\s29\itap0{\s29\f0\fs22\i\lang2052{\*\listtag0}\abinodiroverride\ltrch A more realistic example of passing functions as arguments and invoking them}{\s29\f0\fs22\i\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1824\ri2604\s29\itap0{\s29\f0\fs22\i\lang2052{\*\listtag0}\abinodiroverride\ltrch from within the function. This script simply converts a sequence of numbers to the same type using the conversion function that is passed in. In particular, the}{\s29\f0\fs22\i\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1824\ri2771\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch test() }{\s29\f0\fs22\i\lang2052{\*\listtag0}function passes in a built-in function }{\s29\f0\fs20\lang2052{\*\listtag0}int()}{\s29\f0\fs22\i\lang2052{\*\listtag0}, }{\s29\f0\fs20\lang2052{\*\listtag0}long()}{\s29\f0\fs22\i\lang2052{\*\listtag0}, or }{\s29\f0\fs20\lang2052{\*\listtag0}float() }{\s29\f0\fs22\i\lang2052{\*\listtag0}to perform the conversion.}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx2540{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 1\tab #!/usr/bin/env python}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 2}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx2540{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 3\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}def }{\s29\f0\fs20\lang2052{\*\listtag0}convert(func, seq):}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx3019{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 4\tab 'conv. sequence of numbers to same type'}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx3019{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 5\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}return }{\s29\f0\fs20\lang2052{\*\listtag0}[func(eachNum) }{\s29\f0\fs20\b\lang2052{\*\listtag0}for }{\s29\f0\fs20\lang2052{\*\listtag0}eachNum }{\s29\f0\fs20\b\lang2052{\*\listtag0}in }{\s29\f0\fs20\lang2052{\*\listtag0}seq]}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 6}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx2540{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 7\tab myseq = (123, 45.67, -6.2e8, 999999999L)}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx2540{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 8\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}print }{\s29\f0\fs20\lang2052{\*\listtag0}convert(int, myseq)}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx2540{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 9\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}print }{\s29\f0\fs20\lang2052{\*\listtag0}convert(long, myseq)}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2170\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 10 }{\s29\f0\fs20\b\lang2052{\*\listtag0}print }{\s29\f0\fs20\lang2052{\*\listtag0}convert(float, myseq)}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch If we were to run this program, we would get the following output:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch $ numconv.py}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch [123, 45, -620000000, 999999999]}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch [123L, 45L, -620000000L, 999999999L]}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch [123.0, 45.67, -620000000.0, 999999999.0]}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs36\b\lang2052{\*\listtag0}\abinodiroverride\ltrch 11.5 Formal Arguments}{\s29\f0\fs36\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch A Python function\uc1\u8217\'92s set of formal arguments consists of all parameters passed}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch to the function on invocation for which there is an exact correspondence to those of the argument list in the function declaration. These arguments include all required arguments (passed to the function in correct positional order), keyword arguments (passed in or out of order, but which have key- words present to match their values to their proper positions in the argument list), and all arguments that have default values that may or may not be part}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch of the function call. For all of these cases, a name is created for that value in the (newly created) local namespace and it can be accessed as soon as the function begins execution.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch 11.5.1 Positional Arguments}{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch These are the standard vanilla parameters that we are all familiar with. Posi- tional arguments must be passed in the exact order in which they are defined for the functions that are called. Also, without the presence of any default arguments (see next section), the exact number of arguments passed to a function (call) must be exactly the number declared:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0\tx5899{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> }{\s29\f0\fs18\b\lang2052{\*\listtag0}def }{\s29\f0\fs18\lang2052{\*\listtag0}foo(who):\tab # defined for only 1 argument}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0\tx4079{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch ...\tab }{\s29\f0\fs18\b\lang2052{\*\listtag0}print }{\s29\f0\fs18\lang2052{\*\listtag0}'Hello', who}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch ...}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri3034\s29\sl264\slmult1\itap0\tx5899{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> foo()\tab # 0 arguments... BAD Traceback (innermost last):}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3411\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch File "", line 1, in ?}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch TypeError: not enough arguments; expected 1, got 0}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>>}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri2906\s29\sl264\slmult1\itap0\tx5919{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> foo('World!')\tab # 1 argument... WORKS Hello World!}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>>}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri3024\s29\sl264\slmult1\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> foo('Mr.', 'World!')# 2 arguments... BAD Traceback (innermost last):}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3411\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch File "", line 1, in ?}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch TypeError: too many arguments; expected 1, got 2}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The }{\s29\f0\fs20\lang2052{\*\listtag0}foo() }{\s29\f0\fs22\lang2052{\*\listtag0}function has one positional argument. That means that any call}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch to }{\s29\f0\fs20\lang2052{\*\listtag0}foo() }{\s29\f0\fs22\lang2052{\*\listtag0}must have exactly one argument, no more, no less. You will become}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch extremely familiar with }{\s29\f0\fs20\lang2052{\*\listtag0}TypeError }{\s29\f0\fs22\lang2052{\*\listtag0}otherwise. Note how informative the}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Python errors are. As a general rule, all positional arguments for a function}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch must be provided whenever you call it. They may be passed into the function}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch call in position or out of position, granted that a keyword argument is pro-}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch vided to match it to its proper position in the argument list (review Section}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri2469\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch 11.2.2). Default arguments, however, do not have to be provided because of their nature.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} {\listtext\pard\fi-1140\li3123\ri-20 2. }\pard\plain{\ltrpar\ql\fi-1140\li3123\ri-20\s29{\*\abilist\abilistid1005\abilistparentid0\abilistlevel1\abistartat2{\abifieldfont Times New Roman}{\abilistdecimal .}{\abilistdelim %L.}{\abiliststyle Numbered List}}{\*\pn\pnql\pnstart2\pnlvlbody\pndec{\pntxtb }{\pntxta .}}\fn-1140\li3123\ls6\ilvl0\itap0\tx3123{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Default Arguments}{\s29\f1\fs24\lang2052{\*\listtag0}\par} }\pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u-24872 \uc0\u-29788 \uc0\u21442 \uc0\u25968 }{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2643\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Default arguments are parameters that are defined to have a default value if one is not provided in the function call for that argument. Such definitions are given in the function declaration header line. C++ supports default argu- ments too and has the same syntax as Python: the argument name is followed by an \uc1\u8220\'93assignment\uc1\u8221\'94 of its default value. This assignment is merely a syntacti- cal way of indicating that this assignment will occur if no value is passed in for that argument.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li1743\ri2457\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The syntax for declaring variables with default values in Python is such that all positional arguments must come before any default arguments:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\i\lang2052{\*\listtag0}func}{\s29\f0\fs18\lang2052{\*\listtag0}(}{\s29\f0\fs18\i\lang2052{\*\listtag0}posargs, defarg1=dval1, defarg2=dval2,...}{\s29\f0\fs18\lang2052{\*\listtag0}):}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2679\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch "}{\s29\f0\fs18\i\lang2052{\*\listtag0}function_documentation_string"}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2679\ri-20\s29\itap0{\s29\f0\fs18\i\lang2052{\*\listtag0}\abinodiroverride\ltrch function_body_suite}{\s29\f0\fs18\i\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li1743\ri2440\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Each default argument is followed by an assignment statement of its default value. If no value is given during a function call, then this assignment}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch is realized.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs28\lang2052{\*\listtag0}\abinodiroverride\ltrch Why Default Arguments?}{\s29\f0\fs28\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs28\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u20026 \uc0\u20160 \uc0\u20040 \uc0\u29992 \uc0\u-24872 \uc0\u-29788 \uc0\u21442 \uc0\u25968 \uc0\u-225 }{\s29\f0\fs28\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2643\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Default arguments add a wonderful level of robustness to applications because they allow for some flexibility that is not offered by the standard positional parameters. That gift comes in the form of simplicity for the appli- cations programmer. Life is not as complicated when there are a fewer num- ber of parameters that one needs to worry about. This is especially helpful when one is new to an API interface and does not have enough knowledge to provide more targeted values as arguments.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li1743\ri2440\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The concept of using default arguments is analogous to the process of installing software on your computer. How often does one choose the}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2641\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8220\'93default install\uc1\u8221\'94 over the \uc1\u8220\'93custom install?\uc1\u8221\'94 I would say probably almost always. It is a matter of convenience and know-how, not to mention a time- saver. And if you }{\s29\f0\fs22\i\lang2052{\*\listtag0}are }{\s29\f0\fs22\lang2052{\*\listtag0}one of those gurus who always chooses the custom install, please keep in mind that you are one of the minority.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Another advantage goes to the developers, who are given more control over the software they create for their consumers. When providing default values, they can selectively choose the \uc1\u8220\'93best\uc1\u8221\'94 default value possible, thereby hoping}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch to give the user some freedom of not having to make that choice. Over time,}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch as the users becomes more familiar with the system or API, they may eventu- ally be able to provide their own parameter values, no longer requiring the use of \uc1\u8220\'93training wheels.\uc1\u8221\'94}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li2704\ri1514\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Here is one example where a default argument comes in handy and has some usefulness in the growing electronic commerce industry:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\*\abitableprops table-line-thickness:0.8pt; table-col-spacing:0.03in; table-column-leftpos:2.2111in; table-column-props:0.5931in/0.9500in/1.2264in/0.5931in/0.9500in/1.2264in/0.5931in/0.9500in/1.2264in/; table-sdh:4ad83b8}\par{\*\abicellprops left-attach:0; right-attach:1; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}{ \trowd \itap1\trgaph10\trql\trrh0\trleft3183\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx4059\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx5427\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx7193 \pard\plain\ltrpar\ql\ri-20\s29\intbl\itap1{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> }{\s29\f0\fs18\b\lang2052{\*\listtag0}def}\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li57\ri-20\s29\intbl\itap1{\s29\f0\fs18\lang2052{\*\listtag0}taxMe(cost,}\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li57\ri-20\s29\intbl\itap1{\s29\f0\fs18\lang2052{\*\listtag0}rate=0.0825):}\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft3183\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx4059\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx5427\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx7193 \pard\plain\ltrpar\ql\ri-20\sb20\s29\intbl\itap1{\s29\f0\fs18\lang2052{\*\listtag0}...}\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li57\ri-20\sb20\s29\intbl\itap1{\s29\f0\fs18\b\lang2052{\*\listtag0}return }{\s29\f0\fs18\lang2052{\*\listtag0}cost}\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li56\ri-58\sb20\s29\intbl\itap1{\s29\f0\fs18\lang2052{\*\listtag0}+ (cost * rate)}\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft3183\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx4059\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx5427\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx7193 \pard\plain\ltrpar\ql\ri-20\sb20\s29\intbl\itap1{\s29\f0\fs18\lang2052{\*\listtag0}...}\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}\row}{\*\abiendtable} \pard\plain\ltrpar\ql\li3183\ri-20\sb40\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}>>> taxMe(100)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch 108.25}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>>}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> taxMe(100, 0.05)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch 105.0}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1676\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch In the example above, the }{\s29\f0\fs20\lang2052{\*\listtag0}taxMe() }{\s29\f0\fs22\lang2052{\*\listtag0}function takes the cost of an item and produces a total sale amount with sales tax added. The cost is a required parameter while the tax rate is a default argument (in our example, 8.25%). Perhaps you are an online retail merchant, with most of your customers com- ing from the same state or county as your business. Consumers from locations with different tax rates would like to see their purchase totals with their corre- sponding sales tax rates. To override the default, all you have to do is provide your argument value, such as the case with }{\s29\f0\fs20\lang2052{\*\listtag0}taxMe(100}{\s29\f0\fs22\lang2052{\*\listtag0}, }{\s29\f0\fs20\lang2052{\*\listtag0}0.05) }{\s29\f0\fs22\lang2052{\*\listtag0}in the above example. By specifying a }{\s29\f0\fs20\lang2052{\*\listtag0}rate }{\s29\f0\fs22\lang2052{\*\listtag0}of 5%, you provided an argument as the }{\s29\f0\fs20\lang2052{\*\listtag0}rate }{\s29\f0\fs22\lang2052{\*\listtag0}parameter, thereby overriding or bypassing its default value of 0.0825.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1676\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch All required parameters must be placed before any default arguments. Why? Simply because they are mandatory, whereas default arguments are not. Syntactically, it would be impossible for the interpreter to decide which values match which arguments if mixed modes were allowed. A }{\s29\f0\fs20\lang2052{\*\listtag0}SyntaxError}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch is raised if the arguments are not given in the correct order:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> }{\s29\f0\fs18\b\lang2052{\*\listtag0}def }{\s29\f0\fs18\lang2052{\*\listtag0}taxMe2(rate=0.0825, cost):}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0\tx4079{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch ...\tab }{\s29\f0\fs18\b\lang2052{\*\listtag0}return }{\s29\f0\fs18\lang2052{\*\listtag0}cost * (1.0 + rate)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch ...}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch SyntaxError: non-default argument follows default argument}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Let us take a look at keyword arguments again, using our old friend}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch net_conn()}{\s29\f0\fs22\lang2052{\*\listtag0}.}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}net_conn(host, port):}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3640\ri-20\s29\itap0{\s29\f0\fs18\i\lang2052{\*\listtag0}\abinodiroverride\ltrch net_conn_suite}{\s29\f0\fs18\i\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch As you will recall, this is where you can provide your arguments out of}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri2450\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch order (positionally) if you name the arguments. With the above declarations, we can make the following (regular) positional or keyword argument calls:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8226\'95 net_conn('kappa', 8000)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8226\'95 net_conn(port=8080, host='chino')}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2639\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch However, if we bring default arguments into the equation, things change, although the above calls are still valid. Let us modify the declaration of }{\s29\f0\fs20\lang2052{\*\listtag0}net_conn() }{\s29\f0\fs22\lang2052{\*\listtag0}such that the }{\s29\f0\fs20\lang2052{\*\listtag0}port }{\s29\f0\fs22\lang2052{\*\listtag0}parameter has a default value of 80 and add another argument named }{\s29\f0\fs20\lang2052{\*\listtag0}stype }{\s29\f0\fs22\lang2052{\*\listtag0}(for server type) with a default value of}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 'tcp'}{\s29\f0\fs22\lang2052{\*\listtag0}:}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}net_conn(host, port=80, stype='tcp'):}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs18\i\lang2052{\*\listtag0}\abinodiroverride\ltrch net_conn_suite}{\s29\f0\fs18\i\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li1743\ri2456\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch We have just expanded the number of ways we can call }{\s29\f0\fs20\lang2052{\*\listtag0}net_conn()}{\s29\f0\fs22\lang2052{\*\listtag0}. The following are all valid calls to }{\s29\f0\fs20\lang2052{\*\listtag0}net_conn()}{\s29\f0\fs22\lang2052{\*\listtag0}:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\sb20\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0\tx6399{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8226\'95 net_conn('phaze', 8000, 'udp')\tab # no def args used}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0\tx6399{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8226\'95 net_conn('kappa')\tab # both def args used}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0\tx6399{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8226\'95 net_conn('chino', stype='icmp')\tab # use port def arg}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8226\'95 net_conn(stype='udp', host='solo') # use port def arg}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0\tx6399{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8226\'95 net_conn('deli', 8080)\tab # use stype def arg}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0\tx6399{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8226\'95 net_conn(port=81, host='chino')\tab # use stype def arg}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2637\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch What is the one constant we see in all of the above examples? The sole required parameter, }{\s29\f0\fs20\lang2052{\*\listtag0}host}{\s29\f0\fs22\lang2052{\*\listtag0}. There is no default value for }{\s29\f0\fs20\lang2052{\*\listtag0}host}{\s29\f0\fs22\lang2052{\*\listtag0}, thus it is expected in all calls to }{\s29\f0\fs20\lang2052{\*\listtag0}net_conn()}{\s29\f0\fs22\lang2052{\*\listtag0}.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Keyword arguments prove useful for providing for out-of-order positional}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch arguments, but, coupled with default arguments, they can also be used to}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8220\'93skip over\uc1\u8221\'94 missing arguments as well, as evidenced from our examples above.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs28\lang2052{\*\listtag0}\abinodiroverride\ltrch Default Function Object Argument Example}{\s29\f0\fs28\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs28\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u-24872 \uc0\u-29788 \uc0\u20989 \uc0\u25968 \uc0\u23545 \uc0\u-29599 \uc0\u21442 \uc0\u25968 \uc0\u20030 \uc0\u20363 }{\s29\f0\fs28\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2640\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch We will now present yet another example of where a default argument may prove beneficial. The }{\s29\f0\fs20\lang2052{\*\listtag0}grabWeb.py }{\s29\f0\fs22\lang2052{\*\listtag0}script, given in Example 11.4, is a simple script whose main purpose is to grab a Web page from the Internet and tem- porarily store it to a local file for analysis. This type of application can be used}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch to test the integrity of a Web site\uc1\u8217\'92s pages or to monitor the load on a server}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2637\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch (by measuring connectability or download speed). The }{\s29\f0\fs20\lang2052{\*\listtag0}process() }{\s29\f0\fs22\lang2052{\*\listtag0}function can be anything we want, presenting an infinite number of uses. The one we chose for this exercise displays the first and last non-blank lines of the retrieved Web page. Although this particular example may not prove too useful}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri2469\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch in the real world, you can imagine what kinds of applications you can build on top of this code.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2783\ri-20\s29\itap0{\s29\f0\fs24\lang2052{\*\listtag0}\abinodiroverride\ltrch Example 11.4 Grabbing Web Pages (grabWeb.py)}{\s29\f0\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2783\ri1649\s29\itap0{\s29\f0\fs22\i\lang2052{\*\listtag0}\abinodiroverride\ltrch This script downloads a Web page (defaults to local www server) and displays the first and last non-blank lines of the HTML file. Flexibility is added due to both default arguments of the }{\s29\f0\fs20\lang2052{\*\listtag0}download() }{\s29\f0\fs22\i\lang2052{\*\listtag0}function, which will allow overriding with different URLs or specification of a different processing function.}{\s29\f0\fs22\i\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx3500{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 1\tab #!/usr/bin/env python}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 2}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx3500{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 3\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}from }{\s29\f0\fs20\lang2052{\*\listtag0}urllib }{\s29\f0\fs20\b\lang2052{\*\listtag0}import }{\s29\f0\fs20\lang2052{\*\listtag0}urlretrieve}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0{\shp{\*\shpinst\shpz0\shpbxmargin\shpbypara\shpwr2\shpwrk0\shpfblwtxt0\shpleft0\shptop0\shpbottom437\shpright3480\shplid330729895{\sp{\sn shapeType}{\sv 202}}{\sp{\sn dxTextLeft}{\sv 27305}}{\sp{\sn dxTextRight}{\sv 27305}}{\sp{\sn dxTextTop}{\sv 27305}}{\sp{\sn dxTextBottom}{\sv 27305}}{\shptxt{\*\abitableprops table-line-thickness:0.8pt; table-col-spacing:0.03in; table-column-leftpos:0.0000in; table-column-props:0.1597in/0.3819in/1.8750in/0.1597in/0.3819in/1.8750in/; table-sdh:4b60a88}\par{\*\abicellprops left-attach:0; right-attach:1; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}{ \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx251\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx801\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3501 \pard\plain\ltrpar\ql\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li130\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx251\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx801\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3501 \pard\plain\ltrpar\ql\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-90\s29\intbl\itap1\cell{\*\abiendcell}\row}{\*\abiendtable} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0}}}\par \pard\plain\ltrpar\ql\itap0{\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 4}{\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx4459{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 7\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}if not }{\s29\f0\fs20\lang2052{\*\listtag0}eachLine.strip():}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx4940{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 8\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}continue}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx4459{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 9\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}else}{\s29\f0\fs20\lang2052{\*\listtag0}:}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx4940{\shp{\*\shpinst\shpz0\shpbxmargin\shpbypara\shpwr2\shpwrk0\shpfblwtxt0\shpleft0\shptop0\shpbottom2030\shpright10620\shplid1858812929{\sp{\sn shapeType}{\sv 202}}{\sp{\sn dxTextLeft}{\sv 27305}}{\sp{\sn dxTextRight}{\sv 27305}}{\sp{\sn dxTextTop}{\sv 27305}}{\sp{\sn dxTextBottom}{\sv 27305}}{\shptxt{\*\abitableprops table-line-thickness:0.8pt; table-col-spacing:0.03in; table-column-leftpos:0.0000in; table-column-props:2.1833in/0.3472in/4.8444in/2.1833in/0.3472in/4.8444in/2.1833in/0.3472in/4.8444in/2.1833in/0.3472in/4.8444in/2.1833in/0.3472in/4.8444in/2.1833in/0.3472in/4.8444in/2.1833in/0.3472in/4.8444in/2.1833in/0.3472in/4.8444in/2.1833in/0.3472in/4.8444in/2.1833in/0.3472in/4.8444in/; table-sdh:4b61eb0}\par{\*\abicellprops left-attach:0; right-attach:1; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}{ \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3165\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3665\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx10641 \pard\plain\ltrpar\ql\li2858\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3165\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3665\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx10641 \pard\plain\ltrpar\ql\li2858\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li80\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3165\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3665\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx10641 \pard\plain\ltrpar\ql\li2858\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:3; bot-attach:4; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.250000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3165\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3665\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx10641 \pard\plain\ltrpar\ql\li2856\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:3; bot-attach:4; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:3; bot-attach:4; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:4; bot-attach:5; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.250000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3165\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3665\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx10641 \pard\plain\ltrpar\ql\li2856\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:4; bot-attach:5; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:4; bot-attach:5; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:5; bot-attach:6; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.250000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3165\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3665\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx10641 \pard\plain\ltrpar\ql\li2856\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:5; bot-attach:6; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:5; bot-attach:6; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:6; bot-attach:7; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.250000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3165\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3665\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx10641 \pard\plain\ltrpar\ql\li2856\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:6; bot-attach:7; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:6; bot-attach:7; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:7; bot-attach:8; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3165\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3665\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx10641 \pard\plain\ltrpar\ql\li2858\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:7; bot-attach:8; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:7; bot-attach:8; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:8; bot-attach:9; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3165\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3665\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx10641 \pard\plain\ltrpar\ql\li2858\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:8; bot-attach:9; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:8; bot-attach:9; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:9; bot-attach:10; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3165\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3665\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx10641 \pard\plain\ltrpar\ql\li2858\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:9; bot-attach:10; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li80\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:9; bot-attach:10; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}\row}{\*\abiendtable} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0}}}\par \pard\plain\ltrpar\ql\itap0{\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 10\tab }{\f0\fs20\b\lang2052{\*\listtag0}return }{\f0\fs20\lang2052{\*\listtag0}eachLine}{\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx4459{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 21\tab process=firstLast):}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx3980{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 22\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}try}{\s29\f0\fs20\lang2052{\*\listtag0}:}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx4459{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 23\tab retval = urlretrieve(url)[0]}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx3980{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 24\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}except }{\s29\f0\fs20\lang2052{\*\listtag0}IOError:}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx4459{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 25\tab retval = None}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx3980\tx6380{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 26\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}if }{\s29\f0\fs20\lang2052{\*\listtag0}retval:\tab # do some processing}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx4459{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 27\tab process(retval)}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 28}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 29 }{\s29\f0\fs20\b\lang2052{\*\listtag0}if }{\s29\f0\fs20\lang2052{\*\listtag0}__name__ == '__main__':}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx3980{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 30\tab download()}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Running this script in our environment gives the following output,}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri1507\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch although your mileage will definitely vary since you will be viewing a com- pletely different Web page altogether.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch $ grabWeb.py}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch }{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch }{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} {\listtext\pard\fi-1004\li2748\ri-20 6 }\pard\plain{\ltrpar\ql\fi-1004\li2748\ri-20\s29{\*\abilist\abilistid1006\abilistparentid0\abilistlevel1\abistartat6{\abifieldfont Times New Roman}{\abilistdecimal .}{\abilistdelim %L}{\abiliststyle Numbered List}}{\*\pn\pnql\pnstart6\pnlvlbody\pndec{\pntxtb }{\pntxta }}\fn-1004\li2748\ls7\ilvl0\itap0\tx2748{\s29\f0\fs36\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Variable-Length Arguments}{\s29\f1\fs24\lang2052{\*\listtag0}\par} }\pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs36\b\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u21487 \uc0\u21464 \uc0\u-27265 \uc0\u24230 \uc0\u30340 \uc0\u21442 \uc0\u25968 }{\s29\f0\fs36\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2638\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch There may be situations where your function is required to process an unknown number of arguments. These are called }{\s29\f0\fs22\i\lang2052{\*\listtag0}variable-length argument lists}{\s29\f0\fs22\lang2052{\*\listtag0}. Variable-length arguments are not named explicitly in function declara- tions because the number of arguments is unknown before runtime (and even during execution, the number of arguments may be different on succes- sive calls), an obvious difference from formal arguments (positional and default), which }{\s29\f0\fs22\i\lang2052{\*\listtag0}are }{\s29\f0\fs22\lang2052{\*\listtag0}named in function declarations. Python supports variable- length arguments in two ways because function calls provide for both key- word and non-keyword argument types.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch In Section 11.2.4, we looked at how you can use the }{\s29\f0\fs20\lang2052{\*\listtag0}* }{\s29\f0\fs22\lang2052{\*\listtag0}and }{\s29\f0\fs20\lang2052{\*\listtag0}** }{\s29\f0\fs22\lang2052{\*\listtag0}characters}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch in function calls to specify grouped sets of arguments, non-keyword and key-}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2643\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch word arguments. In this section, we will see the same symbols again, but this time in function declarations, to signify the receipt of such arguments when functions are called. This syntax allows functions to accept more than just the declared formal arguments as defined in the function declaration.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} {\listtext\pard\fi-1080\li4567\ri-20 6.1. }\pard\plain{\ltrpar\ql\fi-1080\li4567\ri-20\s29{\*\abilist\abilistid1007\abilistparentid1006\abilistlevel2\abistartat1{\abifieldfont Times New Roman}{\abilistdecimal .}{\abilistdelim %L.}{\abiliststyle Numbered List}}{\*\pn\pnql\pnstart1\pnprev\pnlvl9\pndec{\pntxtb }{\pntxta .}}\fn-1080\li4567\ls8\ilvl1\itap0\tx4567{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Non-keyword Variable Arguments (Tuple)}{\s29\f1\fs24\lang2052{\*\listtag0}\par} }\pard\plain\ltrpar\ql\li3487\ri-20\s29\itap0{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u-26786 \uc0\u20851 \uc0\u-27346 \uc0\u23383 \uc0\u21464 \uc0\u-28209 \uc0\u21442 \uc0\u25968 \uc0\u-248 Tuple\uc0\u-247 }{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2642\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch When a function is invoked, all formal (required and default) arguments are assigned to their corresponding local variables as given in the function decla- ration. The remaining non-keyword variable arguments are inserted in order into a tuple for access. Perhaps you are familiar with \uc1\u8220\'93varargs\uc1\u8221\'94 in C}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2637\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch (i.e., }{\s29\f0\fs20\lang2052{\*\listtag0}va_list}{\s29\f0\fs22\lang2052{\*\listtag0}, }{\s29\f0\fs20\lang2052{\*\listtag0}va_arg}{\s29\f0\fs22\lang2052{\*\listtag0}, and the ellipsis [ }{\s29\f0\fs20\lang2052{\*\listtag0}... }{\s29\f0\fs22\lang2052{\*\listtag0}]). Python provides equivalent support\uc1\u8212\'97iterating over the tuple elements is the same as using }{\s29\f0\fs20\lang2052{\*\listtag0}va_arg }{\s29\f0\fs22\lang2052{\*\listtag0}in C. For those who are }{\s29\f0\fs22\i\lang2052{\*\listtag0}not }{\s29\f0\fs22\lang2052{\*\listtag0}familiar with C or varargs, they just represent the syn- tax for accepting a variable (not fixed) number of arguments passed in a func- tion call.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2643\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The variable-length argument tuple must follow all positional and default parameters, and the general syntax for functions with tuple or non-keyword variable arguments is as follows:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\i\lang2052{\*\listtag0}function_name}{\s29\f0\fs18\lang2052{\*\listtag0}(}{\s29\f0\fs18\i\lang2052{\*\listtag0}[formal_args,] }{\s29\f0\fs18\lang2052{\*\listtag0}*}{\s29\f0\fs18\i\lang2052{\*\listtag0}vargs_tuple}{\s29\f0\fs18\lang2052{\*\listtag0}):}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2698\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch "}{\s29\f0\fs18\i\lang2052{\*\listtag0}function_documentation_string"}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2698\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch function_body_suite}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2640\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The asterisk operator ( }{\s29\f0\fs20\lang2052{\*\listtag0}* }{\s29\f0\fs22\lang2052{\*\listtag0}) is placed in front of the variable that will hold all remaining arguments once all the formal parameters if have been exhausted. The tuple is empty if there are no additional arguments given.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1681\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch As we saw earlier, a }{\s29\f0\fs20\lang2052{\*\listtag0}TypeError }{\s29\f0\fs22\lang2052{\*\listtag0}exception is generated whenever an incorrect number of arguments is given in the function invocation. By adding a variable argument list variable at the end, we can handle the situation when more than enough arguments are passed to the function because all the extra (non- keyword) ones will be added to the variable argument tuple. (Extra keyword arguments require a keyword variable argument parameter [see the next section].) As expected, all formal arguments must precede informal arguments for the same reason that positional arguments must come before keyword arguments.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}tupleVarArgs(arg1, arg2='defaultB', *theRest):}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3632\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch 'display regular args and non-keyword variable args'}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li3640\ri4622\s29\sl264\slmult1\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch print }{\s29\f0\fs18\lang2052{\*\listtag0}'formal arg 1:', arg1 }{\s29\f0\fs18\b\lang2052{\*\listtag0}print }{\s29\f0\fs18\lang2052{\*\listtag0}'formal arg 2:', arg1 }{\s29\f0\fs18\b\lang2052{\*\listtag0}for }{\s29\f0\fs18\lang2052{\*\listtag0}eachXtrArg }{\s29\f0\fs18\b\lang2052{\*\listtag0}in }{\s29\f0\fs18\lang2052{\*\listtag0}theRest:}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li4095\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch print }{\s29\f0\fs18\lang2052{\*\listtag0}'another arg:', eachXtrArg}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch We will now invoke this function to show how variable argument tuples work:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> tupleVarArgs('abc')}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\shp{\*\shpinst\shpz0\shpbxmargin\shpbypara\shpwr2\shpwrk0\shpfblwtxt0\shpleft0\shptop0\shpbottom487\shpright10620\shplid28041959{\sp{\sn shapeType}{\sv 202}}{\sp{\sn dxTextLeft}{\sv 27305}}{\sp{\sn dxTextRight}{\sv 27305}}{\sp{\sn dxTextTop}{\sv 27305}}{\sp{\sn dxTextBottom}{\sv 27305}}{\shptxt{\*\abitableprops table-line-thickness:0.8pt; table-col-spacing:0.03in; table-column-leftpos:0.0000in; table-column-props:2.8479in/0.2375in/4.2896in/2.8479in/0.2375in/4.2896in/2.8479in/0.2375in/4.2896in/; table-sdh:4b7cd28}\par{\*\abicellprops left-attach:0; right-attach:1; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.250000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}{ \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx4122\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx4464\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx10641 \pard\plain\ltrpar\ql\li2876\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li57\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li57\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.250000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx4122\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx4464\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx10641 \pard\plain\ltrpar\ql\li2876\ri-20\sb20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li57\ri-20\sb20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li57\ri-20\sb20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.250000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx4122\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx4464\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx10641 \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}\row}{\*\abiendtable} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0}}}\par \pard\plain\ltrpar\ql\itap0{\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>>}{\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> tupleVarArgs(23, 4.56)}{\*\abitableprops table-line-thickness:0.8pt; table-col-spacing:0.03in; table-column-leftpos:0.1944in; table-column-props:2.8479in/0.2375in/4.2896in/2.8479in/0.2375in/4.2896in/2.8479in/0.2375in/4.2896in/; table-sdh:4af5d80}\par{\*\abicellprops left-attach:0; right-attach:1; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}{ \trowd \itap1\trgaph10\trql\trrh0\trleft279\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx4402\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx4744\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx10921 \pard\plain\ltrpar\ql\li2878\ri-20\s29\intbl\itap1{\s29\f0\fs18\lang2052{\*\listtag0}formal arg}\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li57\ri-20\s29\intbl\itap1{\s29\f0\fs18\lang2052{\*\listtag0}1:}\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li57\ri-20\s29\intbl\itap1{\s29\f0\fs18\lang2052{\*\listtag0}23}\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft279\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx4402\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx4744\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx10921 \pard\plain\ltrpar\ql\li2878\ri-20\sb20\s29\intbl\itap1{\s29\f0\fs18\lang2052{\*\listtag0}formal arg}\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li57\ri-20\sb20\s29\intbl\itap1{\s29\f0\fs18\lang2052{\*\listtag0}2:}\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li57\ri-20\sb20\s29\intbl\itap1{\s29\f0\fs18\lang2052{\*\listtag0}4.56}\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft279\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx4402\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx4744\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx10921 \pard\plain\ltrpar\ql\li2896\ri-20\sb20\s29\intbl\itap1{\s29\f0\fs18\lang2052{\*\listtag0}>>>}\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}\row}{\*\abiendtable} \pard\plain\ltrpar\ql\li3183\ri-20\sb40\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}>>> tupleVarArgs('abc', 123, 'xyz', 456.789)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri5820\s29\sl264\slmult1\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch formal arg 1: abc formal arg 2: 123 another arg: xyz another arg: 456.789}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} {\listtext\pard\fi-1080\li4567\ri-20 6.2. }\pard\plain{\ltrpar\ql\fi-1080\li4567\ri-20\s29{\*\abilist\abilistid1007\abilistparentid1006\abilistlevel2\abistartat1{\abifieldfont Times New Roman}{\abilistdecimal .}{\abilistdelim %L.}{\abiliststyle Numbered List}}{\*\pn\pnql\pnstart1\pnprev\pnlvl9\pndec{\pntxtb }{\pntxta .}}\fn-1080\li4567\ls8\ilvl1\itap0\tx4567{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Keyword Variable Arguments (Dictionary)}{\s29\f1\fs24\lang2052{\*\listtag0}\par} }\pard\plain\ltrpar\ql\li3487\ri-20\s29\itap0{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u20851 \uc0\u-27346 \uc0\u23383 \uc0\u21464 \uc0\u-28209 \uc0\u21442 \uc0\u25968 \uc0\u-248 Dictionary\uc0\u-247 }{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch In the case where we have a variable number or extra set of keyword argu- ments, these are placed into a dictionary where the \uc1\u8220\'93keyworded\uc1\u8221\'94 argument variable names are the keys, and the arguments are their corresponding values. Why must it be a dictionary? Because a pair of items is given for every argument\uc1\u8212\'97the name of the argument and its value\uc1\u8212\'97it is a natural fit to use a dictionary to hold these arguments. Here is the syntax of function definitions that use the variable argument dictionary for extra keyword arguments:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\i\lang2052{\*\listtag0}function_name}{\s29\f0\fs18\lang2052{\*\listtag0}(}{\s29\f0\fs18\i\lang2052{\*\listtag0}[formal_args,][}{\s29\f0\fs18\lang2052{\*\listtag0}*}{\s29\f0\fs18\i\lang2052{\*\listtag0}vargst,] **vargsd}{\s29\f0\fs18\lang2052{\*\listtag0}):}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3640\ri4322\s29\sl264\slmult1\itap0{\s29\f0\fs18\i\lang2052{\*\listtag0}\abinodiroverride\ltrch function_documentation_string function_body_suite}{\s29\f0\fs18\i\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch To differentiate keyword variable arguments from non-keyword informal}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2638\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch arguments, a double asterisk ( }{\s29\f0\fs20\lang2052{\*\listtag0}** }{\s29\f0\fs22\lang2052{\*\listtag0}) is used. The }{\s29\f0\fs20\lang2052{\*\listtag0}** }{\s29\f0\fs22\lang2052{\*\listtag0}is overloaded so as not to be confused with exponentiation. The keyword variable argument dictionary should be the last parameter of the function definition prepended with the}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch '**'}{\s29\f0\fs22\lang2052{\*\listtag0}. We now present an example of how to use such a dictionary:}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}dictVarArgs(arg1, arg2='defaultB', **theRest):}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2679\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch 'display 2 regular args and keyword variable args'}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2679\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch print }{\s29\f0\fs18\lang2052{\*\listtag0}'formal arg1:', arg1}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2679\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch print }{\s29\f0\fs18\lang2052{\*\listtag0}'formal arg2:', arg2}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2679\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch for }{\s29\f0\fs18\lang2052{\*\listtag0}eachXtrArg }{\s29\f0\fs18\b\lang2052{\*\listtag0}in }{\s29\f0\fs18\lang2052{\*\listtag0}theRest.keys():}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3135\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch print }{\s29\f0\fs18\lang2052{\*\listtag0}'Xtra arg %s: %s' % \\}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3591\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch (eachXtrArg, str(theRest[eachXtrArg]))}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Executing this code in the interpreter, we get the following output:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> dictVarArgs(1220, 740.0, c='grail')}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch formal arg1: 1220}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch formal arg2: 740.0}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch Xtra arg c: grail}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>>}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> dictVarArgs(arg2='tales', c=123, d='poe', arg1='mystery')}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri6784\s29\sl264\slmult1\itap0{\shp{\*\shpinst\shpz0\shpbxmargin\shpbypara\shpwr2\shpwrk0\shpfblwtxt0\shpleft0\shptop0\shpbottom660\shpright1710\shplid477996339{\sp{\sn shapeType}{\sv 202}}{\sp{\sn dxTextLeft}{\sv 27305}}{\sp{\sn dxTextRight}{\sv 27305}}{\sp{\sn dxTextTop}{\sv 27305}}{\sp{\sn dxTextBottom}{\sv 27305}}{\shptxt{\*\abitableprops table-line-thickness:0.8pt; table-col-spacing:0.03in; table-column-leftpos:0.0000in; table-column-props:0.6729in/0.2375in/0.2771in/0.6729in/0.2375in/0.2771in/0.6729in/0.2375in/0.2771in/; table-sdh:4b6c768}\par{\*\abicellprops left-attach:0; right-attach:1; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}{ \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx990\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx1332\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx1731 \pard\plain\ltrpar\ql\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li57\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li57\ri-26\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx990\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx1332\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx1731 \pard\plain\ltrpar\ql\ri-20\sb20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li57\ri-20\sb20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li57\ri-26\sb20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx990\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx1332\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx1731 \pard\plain\ltrpar\ql\ri-20\sb20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}\row}{\*\abiendtable} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0}}}\par \pard\plain\ltrpar\ql\itap0{\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch formal arg1: mystery formal arg2: tales}{\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> dictVarArgs('one', d=10, e='zoo', men=('freud', 'gaudi'))}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri6663\s29\sl264\slmult1\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch formal arg1: one formal arg2: defaultB}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri5388\s29\sl264\slmult1\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch Xtra arg men: ('freud', 'gaudi') Xtra arg d: 10}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch Xtra arg e: zoo}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2643\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Both keyword and non-keyword variable arguments may be used in the same function as long as the keyword dictionary is last and is preceded by the non-keyword tuple, as in the following example:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}newfoo(arg1, arg2, *nkw, **kw):}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2679\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch display regular args and all variable args'}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2679\ri6152\s29\sl264\slmult1\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch print }{\s29\f0\fs18\lang2052{\*\listtag0}'arg1 is:', arg1 }{\s29\f0\fs18\b\lang2052{\*\listtag0}print }{\s29\f0\fs18\lang2052{\*\listtag0}'arg2 is:', arg2 }{\s29\f0\fs18\b\lang2052{\*\listtag0}for }{\s29\f0\fs18\lang2052{\*\listtag0}eachNKW }{\s29\f0\fs18\b\lang2052{\*\listtag0}in }{\s29\f0\fs18\lang2052{\*\listtag0}nkw:}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3136\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch print 'additional non-keyword arg:', eachNKW}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2679\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch for }{\s29\f0\fs18\lang2052{\*\listtag0}eachKW }{\s29\f0\fs18\b\lang2052{\*\listtag0}in }{\s29\f0\fs18\lang2052{\*\listtag0}kw.keys():}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3135\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch print }{\s29\f0\fs18\lang2052{\*\listtag0}"additional keyword arg '%s': %s" % \\}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3591\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch (eachKW, kw[eachKW])}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Calling our function within the interpreter, we get the following output:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> newfoo('wolf', 3, 'projects', freud=90, gamble=96)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri6641\s29\sl264\slmult1\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch arg1 is: wolf arg2 is: 3}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri3952\s29\sl264\slmult1\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch additional non-keyword arg: projects additional keyword arg 'freud': 90 additional keyword arg 'gamble': 96}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch 11.6.3 Calling Functions with}{\s29\cf3\f0\fs32\i\b\lang2052{\*\listtag0} Variable}{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qc\li3904\ri4809\s29\itap0{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Argument Objects}{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qc\li3904\ri4809\s29\itap0{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u29992 \uc0\u19981 \uc0\u21516 \uc0\u30340 \uc0\u21442 \uc0\u25968 \uc0\u23545 \uc0\u-29599 \uc0\u-29693 \uc0\u29992 \uc0\u20989 \uc0\u25968 }{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1678\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Above in Section 11.2.4, we introduced the use of }{\s29\f0\fs20\lang2052{\*\listtag0}* }{\s29\f0\fs22\lang2052{\*\listtag0}and }{\s29\f0\fs20\lang2052{\*\listtag0}** }{\s29\f0\fs22\lang2052{\*\listtag0}to specify sets of arguments in a function call. Here we will show you more examples of that syntax, with a slight bias toward functions accepting variable arguments.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1678\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch We will now use our friend }{\s29\f0\fs20\lang2052{\*\listtag0}newfoo()}{\s29\f0\fs22\lang2052{\*\listtag0}, defined in the previous section, to test the new calling syntax. Our first call to }{\s29\f0\fs20\lang2052{\*\listtag0}newfoo() }{\s29\f0\fs22\lang2052{\*\listtag0}will use the old-style method of listing all arguments individually, even the variable arguments that follow all the formal arguments:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\sb20\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> newfoo(10, 20, 30, 40, foo=50, bar=60)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch arg1 is: 10}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch arg2 is: 20}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri4418\s29\sl264\slmult1\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch additional non-keyword arg: 30 additional non-keyword arg: 40 additional keyword arg 'foo': 50 additional keyword arg 'bar': 60}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1683\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch We will now make a similar call; however, instead of listing the variable arguments individually, we will put the non-keyword arguments in a tuple and the keyword arguments in a dictionary to make the call:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> newfoo(2, 4, *(6, 8), **\{'foo': 10, 'bar': 12\})}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch arg1 is: 2}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch arg2 is: 4}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri4418\s29\sl264\slmult1\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch additional non-keyword arg: 6 additional non-keyword arg: 8 additional keyword arg 'foo': 10 additional keyword arg 'bar': 12}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li2704\ri1514\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Finally, we will make another call but build our tuple and dictionary out- side of the function invocation:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> aTuple = (6, 7, 8)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> aDict = \{'z': 9\}}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> newfoo(1, 2, 3, x=4, y=5, *aTuple, **aDict)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch arg1 is: 1}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch arg2 is: 2}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2223\ri5809\s29\sl264\slmult1\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch additional non-keyword arg: 3 additional non-keyword arg: 6 additional non-keyword arg: 7 additional non-keyword arg: 8 additional keyword arg 'z': 9 additional keyword arg 'x': 4 additional keyword arg 'y': 5}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2637\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Notice how our tuple and dictionary arguments make only a subset of the final tuple and dictionary received within the function call. The additional non-keyword value }{\s29\f0\fs20\lang2052{\*\listtag0}'3' }{\s29\f0\fs22\lang2052{\*\listtag0}and keyword pairs for }{\s29\f0\fs20\lang2052{\*\listtag0}'x' }{\s29\f0\fs22\lang2052{\*\listtag0}and }{\s29\f0\fs20\lang2052{\*\listtag0}'y' }{\s29\f0\fs22\lang2052{\*\listtag0}were also included in the final argument lists even though they were not part of the}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch '*' }{\s29\f0\fs22\lang2052{\*\listtag0}and }{\s29\f0\fs20\lang2052{\*\listtag0}'**' }{\s29\f0\fs22\lang2052{\*\listtag0}variable argument parameters.}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Prior to 1.6, variable objects could only be passed to }{\s29\f0\fs20\lang2052{\*\listtag0}apply() }{\s29\f0\fs22\lang2052{\*\listtag0}with the}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch function object for invocation. This current calling syntax effectively obso-}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri2455\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch letes the use of }{\s29\f0\fs20\lang2052{\*\listtag0}apply()}{\s29\f0\fs22\lang2052{\*\listtag0}. Below is an example of using these symbols to call any function object with any type of parameter set.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs28\lang2052{\*\listtag0}\abinodiroverride\ltrch Functional Programming Example}{\s29\f0\fs28\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs28\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u20989 \uc0\u25968 \uc0\u24335 \uc0\u32534 \uc0\u31243 \uc0\u20030 \uc0\u20363 }{\s29\f0\fs28\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2643\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Another useful application of functional programming comes in terms of debugging or performance measurement. You are working on functions that need to be fully tested or run through regressions every night, or that need to be timed over many iterations for potential improvements. All you need to do}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2639\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch is to create a diagnostic function that sets up the test environment, then calls the function in question. Because this system should be flexible, you want to allow the testee function to be passed in as an argument. So a pair of such functions, }{\s29\f0\fs20\lang2052{\*\listtag0}timeit() }{\s29\f0\fs22\lang2052{\*\listtag0}and }{\s29\f0\fs20\lang2052{\*\listtag0}testit()}{\s29\f0\fs22\lang2052{\*\listtag0}, would probably be useful to the soft- ware developer today.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2636\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch We will now present the source code to one such example of a }{\s29\f0\fs20\lang2052{\*\listtag0}testit() }{\s29\f0\fs22\lang2052{\*\listtag0}function (see Example 11.5). We will leave a }{\s29\f0\fs20\lang2052{\*\listtag0}timeit() }{\s29\f0\fs22\lang2052{\*\listtag0}function as an exer- cise for the reader (see Exercise 11.12).}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2637\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch This module provides an execution test environment for functions. The }{\s29\f0\fs20\lang2052{\*\listtag0}testit() }{\s29\f0\fs22\lang2052{\*\listtag0}function takes a function and arguments, then invokes that function with the given arguments under the watch of an exception han- dler. If the function completes successfully, a }{\s29\f0\fs20\lang2052{\*\listtag0}True }{\s29\f0\fs22\lang2052{\*\listtag0}return value packaged with the return value of the function is sent back to the caller. Any failure causes }{\s29\f0\fs20\lang2052{\*\listtag0}False }{\s29\f0\fs22\lang2052{\*\listtag0}to be returned along with the reason for the exception.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch (}{\s29\f0\fs20\lang2052{\*\listtag0}Exception }{\s29\f0\fs22\lang2052{\*\listtag0}is the root class for all runtime exceptions; review Chapter 10}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch for details.)}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2783\ri-20\s29\itap0{\s29\f0\fs24\lang2052{\*\listtag0}\abinodiroverride\ltrch Example 11.5 Testing Functions (testit.py)}{\s29\f0\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2783\ri1550\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch testit() }{\s29\f0\fs22\i\lang2052{\*\listtag0}invokes a given function with its arguments, returning }{\s29\f0\fs20\lang2052{\*\listtag0}True }{\s29\f0\fs22\i\lang2052{\*\listtag0}packaged with the return value of the function on success or }{\s29\f0\fs20\lang2052{\*\listtag0}False }{\s29\f0\fs22\i\lang2052{\*\listtag0}with the cause of failure.}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx3500{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 1\tab #!/usr/bin/env python}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 2}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx3500{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 3\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}def }{\s29\f0\fs20\lang2052{\*\listtag0}testit(func, *nkwargs, **kwargs):}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 4}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx3980{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 5\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}try}{\s29\f0\fs20\lang2052{\*\listtag0}:}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx4459{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 6\tab retval = func(*nkwargs, **kwargs)}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx4459{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 7\tab result = (True, retval)}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx3980{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 8\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}except }{\s29\f0\fs20\lang2052{\*\listtag0}Exception, diag:}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx4459{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 9\tab result = (False, str(diag))}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx3980{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 10\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}return }{\s29\f0\fs20\lang2052{\*\listtag0}result}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 11}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 12 }{\s29\f0\fs20\b\lang2052{\*\listtag0}def }{\s29\f0\fs20\lang2052{\*\listtag0}test():}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx3980{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 13\tab funcs = (int, long, float)}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx3980{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 14\tab vals = (1234, 12.34, '1234', '12.34')}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 15}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx3980{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 16\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}for }{\s29\f0\fs20\lang2052{\*\listtag0}eachFunc }{\s29\f0\fs20\b\lang2052{\*\listtag0}in }{\s29\f0\fs20\lang2052{\*\listtag0}funcs:}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx4459{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 17\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}print }{\s29\f0\fs20\lang2052{\*\listtag0}'-' * 20}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx4459{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 18\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}for }{\s29\f0\fs20\lang2052{\*\listtag0}eachVal }{\s29\f0\fs20\b\lang2052{\*\listtag0}in }{\s29\f0\fs20\lang2052{\*\listtag0}vals:}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx4940{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 19\tab retval = testit(eachFunc,}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx6860{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 20\tab eachVal)}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx4940{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 21\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}if }{\s29\f0\fs20\lang2052{\*\listtag0}retval[0]:}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx5420{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 22\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}print }{\s29\f0\fs20\lang2052{\*\listtag0}'%s(%s) =' % \\}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx3980{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 23\tab (eachFunc.__name__, `eachVal`), retval[1]}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx4940{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 24\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}else}{\s29\f0\fs20\lang2052{\*\listtag0}:}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx5420{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 25\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}print }{\s29\f0\fs20\lang2052{\*\listtag0}'%s(%s) = FAILED:' % \\}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx3980{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 26\tab (eachFunc.__name__, `eachVal`), retval[1]}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 27}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 28 }{\s29\f0\fs20\b\lang2052{\*\listtag0}if }{\s29\f0\fs20\lang2052{\*\listtag0}__name__ == '__main__':}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx3980{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 29\tab test()}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The unit tester function }{\s29\f0\fs20\lang2052{\*\listtag0}test() }{\s29\f0\fs22\lang2052{\*\listtag0}runs a set of numeric conversion func-}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch tions on an input set of four numbers. There are two failure cases in this test}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch set to confirm such functionality. Here is the output of running the script:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch $ testit.py}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri5824\s29\sl264\slmult1\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch -------------------- int(1234) = 1234 int(12.34) = 12 int('1234') = 1234}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch int('12.34') = FAILED: invalid literal for int(): 12.34}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri5824\s29\sl264\slmult1\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch -------------------- long(1234) = 1234L}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch long(12.34) = 12L}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch long('1234') = 1234L}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch long('12.34') = FAILED: invalid literal for long(): 12.34}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri6545\s29\sl264\slmult1\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch -------------------- float(1234) = 1234.0 float(12.34) = 12.34 float('1234') = 1234.0 float('12.34') = 12.34}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} {\listtext\pard\fi-1004\li2748\ri-20 7 }\pard\plain{\ltrpar\ql\fi-1004\li2748\ri-20\s29{\*\abilist\abilistid1006\abilistparentid0\abilistlevel1\abistartat6{\abifieldfont Times New Roman}{\abilistdecimal .}{\abilistdelim %L}{\abiliststyle Numbered List}}{\*\pn\pnql\pnstart6\pnlvlbody\pndec{\pntxtb }{\pntxta }}\fn-1004\li2748\ls7\ilvl0\itap0\tx2748{\s29\f0\fs36\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Functional Programming}{\s29\f1\fs24\lang2052{\*\listtag0}\par} }\pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs36\b\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u20989 \uc0\u25968 \uc0\u24335 \uc0\u32534 \uc0\u31243 }{\s29\f0\fs36\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2636\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Python is not and will probably not ever claim to be a functional programming language, but it does support a number of valuable functional programming con- structs. There are also some that behave like functional programming mecha- nisms but may not be traditionally considered as such. What Python }{\s29\f0\fs22\i\lang2052{\*\listtag0}does }{\s29\f0\fs22\lang2052{\*\listtag0}provide comes in the form of four built-in functions and lambda expressions.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} {\listtext\pard\fi-1080\li4567\ri-20 7.1. }\pard\plain{\ltrpar\ql\fi-1080\li4567\ri-20\s29{\*\abilist\abilistid1008\abilistparentid1006\abilistlevel2\abistartat1{\abifieldfont Times New Roman}{\abilistdecimal .}{\abilistdelim %L.}{\abiliststyle Numbered List}}{\*\pn\pnql\pnstart1\pnprev\pnlvl9\pndec{\pntxtb }{\pntxta .}}\fn-1080\li4567\ls9\ilvl1\itap0\tx4567{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Anonymous Functions and }{\s29\f0\fs32\b\lang2052{\*\listtag0}lambda}{\s29\f1\fs24\lang2052{\*\listtag0}\par} }\pard\plain\ltrpar\ql\li3487\ri-20\s29\itap0{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u21311 \uc0\u21517 \uc0\u20989 \uc0\u25968 \uc0\u19982 }{\s29\f0\fs32\b\lang2052{\*\listtag0}lambda}{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2637\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Python allows one to create }{\s29\f0\fs22\i\lang2052{\*\listtag0}anonymous functions }{\s29\f0\fs22\lang2052{\*\listtag0}using the }{\s29\f0\fs20\b\lang2052{\*\listtag0}lambda }{\s29\f0\fs22\lang2052{\*\listtag0}keyword. They are \uc1\u8220\'93anonymous\uc1\u8221\'94 because they are not declared in the standard manner, i.e., using the }{\s29\f0\fs20\b\lang2052{\*\listtag0}def }{\s29\f0\fs22\lang2052{\*\listtag0}statement. (Unless assigned to a local variable, such objects do not create a name in any namespace either.) However, as functions, they may also have arguments. An entire lambda \uc1\u8220\'93statement\uc1\u8221\'94 represents an expres- sion, and the body of that expression must also be given on the same line as the declaration. We now present the syntax for anonymous functions:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch lambda }{\s29\f0\fs18\lang2052{\*\listtag0}[}{\s29\f0\fs18\i\lang2052{\*\listtag0}arg1}{\s29\f0\fs18\lang2052{\*\listtag0}[, }{\s29\f0\fs18\i\lang2052{\*\listtag0}arg2}{\s29\f0\fs18\lang2052{\*\listtag0}, ... }{\s29\f0\fs18\i\lang2052{\*\listtag0}argN}{\s29\f0\fs18\lang2052{\*\listtag0}]]: }{\s29\f0\fs18\i\lang2052{\*\listtag0}expression}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Arguments are optional, and if used, are usually part of the expression as well.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2128\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch CORE NOTE: }{\s29\f0\fs20\b\lang2052{\*\listtag0}lambda }{\s29\f0\fs18\b\lang2052{\*\listtag0}expression returns callable function object}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2128\ri3033\s29\itap0{\s29\f0\fs22\i\lang2052{\*\listtag0}\abinodiroverride\ltrch Calling }{\s29\f0\fs20\b\lang2052{\*\listtag0}lambda }{\s29\f0\fs22\i\lang2052{\*\listtag0}with an appropriate expression yields a function object that can be used like any other function.They can be passed to other functions, aliased with additional references, be members of container objects, and as callable objects, be invoked (with any arguments, if necessary). When called, these objects will yield a result equivalent to the same expression if given the same arguments.They are indistinguishable}{\s29\f0\fs22\i\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2128\ri-20\s29\itap0{\s29\f0\fs22\i\lang2052{\*\listtag0}\abinodiroverride\ltrch from functions that return the evaluation of an equivalent expression.}{\s29\f0\fs22\i\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li2704\ri1477\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Before we look at any examples using }{\s29\f0\fs20\b\lang2052{\*\listtag0}lambda}{\s29\f0\fs22\lang2052{\*\listtag0}, we would like to review single-line statements and then show the resemblances to lambda expressions.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs20\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}true():}{\s29\f0\fs20\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3673\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch return }{\s29\f0\fs18\lang2052{\*\listtag0}True}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1677\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The above function takes no arguments and always returns }{\s29\f0\fs20\lang2052{\*\listtag0}True}{\s29\f0\fs22\lang2052{\*\listtag0}. Single line functions in Python may be written on the same line as the header. Given that, we can rewrite our }{\s29\f0\fs20\lang2052{\*\listtag0}true() }{\s29\f0\fs22\lang2052{\*\listtag0}function so that it looks something like the following:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\sb20\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}true(): }{\s29\f0\fs18\b\lang2052{\*\listtag0}return }{\s29\f0\fs18\lang2052{\*\listtag0}True}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi313\li2704\ri1676\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch We will present the named functions in this manner for the duration of this chapter because it helps one visualize their lambda equivalents. For our }{\s29\f0\fs20\lang2052{\*\listtag0}true() }{\s29\f0\fs22\lang2052{\*\listtag0}function, the equivalent expression (no arguments, returns }{\s29\f0\fs20\lang2052{\*\listtag0}True}{\s29\f0\fs22\lang2052{\*\listtag0}) using }{\s29\f0\fs20\b\lang2052{\*\listtag0}lambda }{\s29\f0\fs22\lang2052{\*\listtag0}is:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch lambda }{\s29\f0\fs18\lang2052{\*\listtag0}:True}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1676\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Usage of the named }{\s29\f0\fs20\lang2052{\*\listtag0}true() }{\s29\f0\fs22\lang2052{\*\listtag0}function is fairly obvious, but not for }{\s29\f0\fs20\b\lang2052{\*\listtag0}lambda}{\s29\f0\fs22\lang2052{\*\listtag0}. Do we just use it as is, or do we need to assign it somewhere? A lambda func- tion by itself serves no purpose, as we see here:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> }{\s29\f0\fs18\b\lang2052{\*\listtag0}lambda }{\s29\f0\fs18\lang2052{\*\listtag0}:True}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch at f09ba0>}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch In the above example, we simply used }{\s29\f0\fs20\b\lang2052{\*\listtag0}lambda }{\s29\f0\fs22\lang2052{\*\listtag0}to create a function}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch (object), but did not save it anywhere nor did we call it. The reference count}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch for this function object is set to True on creation of the function object, but because no reference is saved, goes back down to zero and is garbage-collected. To keep the object around, we can save it into a variable and invoke it any time after. Perhaps now is a good opportunity:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> true = }{\s29\f0\fs18\b\lang2052{\*\listtag0}lambda }{\s29\f0\fs18\lang2052{\*\listtag0}:True}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri6991\s29\sl264\slmult1\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> true() True}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1683\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Assigning it looks much more useful here. Likewise, we can assign lambda expressions to a data structure such as a list or tuple where, based on some input criteria, we can choose which function to execute as well as what the arguments would be. (In the next section, we will show how to use lambda expressions with functional programming constructs.)}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Let us now design a function that takes two numeric or string arguments and returns the sum for numbers or the concatenated string. We will show the standard function first, followed by its unnamed equivalent.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3424\ri-20\s29\itap0\tx7060{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}add(x, y): }{\s29\f0\fs18\b\lang2052{\*\listtag0}return }{\s29\f0\fs18\lang2052{\*\listtag0}x + y \'db\tab }{\s29\f0\fs18\b\lang2052{\*\listtag0}lambda }{\s29\f0\fs18\lang2052{\*\listtag0}x, y: x + y}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Default and variable arguments are permitted as well, as indicated in the}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch following examples:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}usuallyAdd2(x, y=2): }{\s29\f0\fs18\b\lang2052{\*\listtag0}return }{\s29\f0\fs18\lang2052{\*\listtag0}x+y \'db }{\s29\f0\fs18\b\lang2052{\*\listtag0}lambda }{\s29\f0\fs18\lang2052{\*\listtag0}x, y=2: x+y}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0\tx6320{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}showAllAsTuple(*z): }{\s29\f0\fs18\b\lang2052{\*\listtag0}return }{\s29\f0\fs18\lang2052{\*\listtag0}z\tab \'db }{\s29\f0\fs18\b\lang2052{\*\listtag0}lambda }{\s29\f0\fs18\lang2052{\*\listtag0}*z: z}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li1743\ri2474\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Seeing is one thing, so we will now try to make you believe by showing how you can try them in the interpreter:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> a = }{\s29\f0\fs18\b\lang2052{\*\listtag0}lambda }{\s29\f0\fs18\lang2052{\*\listtag0}x, y=2: x + y}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> a(3)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch 5}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> a(3,5)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch 8}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> a(0)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch 2}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> a(0,9)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch 9}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>>}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> b = }{\s29\f0\fs18\b\lang2052{\*\listtag0}lambda }{\s29\f0\fs18\lang2052{\*\listtag0}*z: z}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> b(23, 'zyx')}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch (23, 'zyx')}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> b(42)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch (42,)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2637\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch One final word on }{\s29\f0\fs20\b\lang2052{\*\listtag0}lambda}{\s29\f0\fs22\lang2052{\*\listtag0}: Although it appears that }{\s29\f0\fs20\b\lang2052{\*\listtag0}lambda }{\s29\f0\fs22\lang2052{\*\listtag0}is a one-line version of a function, it is not equivalent to an \uc1\u8220\'93inline\uc1\u8221\'94 statement in C++, whose purpose is bypassing function stack allocation during invocation for performance reasons. A lambda expression works just like a function, creating}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch a frame object when called.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch 11.7.2 Built-in Functions: }{\s29\f0\fs32\lang2052{\*\listtag0}apply()}{\s29\f0\fs32\i\b\lang2052{\*\listtag0},}{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs32\lang2052{\*\listtag0}\abinodiroverride\ltrch filter()}{\s29\f0\fs32\i\b\lang2052{\*\listtag0}, }{\s29\f0\fs32\lang2052{\*\listtag0}map()}{\s29\f0\fs32\i\b\lang2052{\*\listtag0}, }{\s29\f0\fs32\lang2052{\*\listtag0}reduce()}{\s29\f0\fs32\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs32\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc0\u20869 \uc0\u24314 \uc0\u20989 \uc0\u25968 apply()}{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\uc0\u12289 }{\s29\f0\fs32\lang2052{\*\listtag0}filter()\uc0\u12289 map()}{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\uc0\u12289 }{\s29\f0\fs32\lang2052{\*\listtag0}reduce()}{\s29\f0\fs32\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2637\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch In this section, we will look at the }{\s29\f0\fs20\lang2052{\*\listtag0}apply()}{\s29\f0\fs22\lang2052{\*\listtag0}, }{\s29\f0\fs20\lang2052{\*\listtag0}filter()}{\s29\f0\fs22\lang2052{\*\listtag0}, }{\s29\f0\fs20\lang2052{\*\listtag0}map()}{\s29\f0\fs22\lang2052{\*\listtag0}, and }{\s29\f0\fs20\lang2052{\*\listtag0}reduce() }{\s29\f0\fs22\lang2052{\*\listtag0}built-in functions as well as give some examples to show how they can be used. These functions provide the functional programming features found in Python. A summary of these functions is given in Table 11.2. All take}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch a function object to somehow invoke.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch As you may imagine, lambda functions fit nicely into applications using any}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri2446\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch of these functions because all of them take a function object with which to exe- cute, and }{\s29\f0\fs20\b\lang2052{\*\listtag0}lambda }{\s29\f0\fs22\lang2052{\*\listtag0}provides a mechanism for creating functions on the fly.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2783\ri-20\s29\itap0{\s29\f0\fs24\lang2052{\*\listtag0}\abinodiroverride\ltrch Table 11.2 Functional Programming Built-in Functions}{\s29\f0\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2783\ri-20\s29\itap0\tx6099{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Built-in Function\tab Description}{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi-3325\li6110\ri1588\s29\itap0\tx6099{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch apply(}{\s29\f0\fs20\i\lang2052{\*\listtag0}func}{\s29\f0\fs20\lang2052{\*\listtag0}[, }{\s29\f0\fs20\i\lang2052{\*\listtag0}nkw}{\s29\f0\fs20\lang2052{\*\listtag0}][, }{\s29\f0\fs20\i\lang2052{\*\listtag0}kw}{\s29\f0\fs20\lang2052{\*\listtag0}])}{\s29\f0\fs16\lang2052{\*\listtag0}a\tab }{\s29\f0\fs20\lang2052{\*\listtag0}Calls }{\s29\f0\fs20\i\lang2052{\*\listtag0}func }{\s29\f0\fs20\lang2052{\*\listtag0}with optional arguments, }{\s29\f0\fs20\i\lang2052{\*\listtag0}nkw }{\s29\f0\fs20\lang2052{\*\listtag0}for non-keyword arguments and }{\s29\f0\fs20\i\lang2052{\*\listtag0}kw }{\s29\f0\fs20\lang2052{\*\listtag0}for keyword arguments; the return value is}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li6110\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch the return value of the function call}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi-3325\li6110\ri1575\s29\itap0\tx6099{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch filter(}{\s29\f0\fs20\i\lang2052{\*\listtag0}func, seq}{\s29\f0\fs20\lang2052{\*\listtag0})}{\s29\f0\fs16\lang2052{\*\listtag0}b\tab }{\s29\f0\fs20\lang2052{\*\listtag0}Invokes Boolean function }{\s29\f0\fs20\i\lang2052{\*\listtag0}func }{\s29\f0\fs20\lang2052{\*\listtag0}iteratively over each element of }{\s29\f0\fs20\i\lang2052{\*\listtag0}seq}{\s29\f0\fs20\lang2052{\*\listtag0}; returns a sequence for those elements for which }{\s29\f0\fs20\i\lang2052{\*\listtag0}func }{\s29\f0\fs20\lang2052{\*\listtag0}returned true}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi-3325\li6110\ri1575\s29\itap0\tx6099{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\itap0 \sect\sectd\sbknone\colsx360\margtsxn99\margbsxn0\marglsxn80\margrsxn80\pgncont\ltrsect \pard\plain\ltrpar\ql\itap0{\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2783\ri-63\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch map(}{\s29\f0\fs20\i\lang2052{\*\listtag0}func}{\s29\f0\fs20\lang2052{\*\listtag0}, }{\s29\f0\fs20\i\lang2052{\*\listtag0}seq1}{\s29\f0\fs20\lang2052{\*\listtag0}[,}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2783\ri-20\s29\itap0{\s29\f0\fs20\i\lang2052{\*\listtag0}\abinodiroverride\ltrch seq2}{\s29\f0\fs20\lang2052{\*\listtag0}...])}{\s29\f0\fs16\lang2052{\*\listtag0}b}{\s29\f0\fs20\i\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\ri1683\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch Applies function }{\s29\f0\fs20\i\lang2052{\*\listtag0}func }{\s29\f0\fs20\lang2052{\*\listtag0}to each element of given sequence(s) and provides return values in a list; if }{\s29\f0\fs20\i\lang2052{\*\listtag0}func }{\s29\f0\fs20\lang2052{\*\listtag0}is None, }{\s29\f0\fs20\i\lang2052{\*\listtag0}func }{\s29\f0\fs20\lang2052{\*\listtag0}behaves as the identity function, returning a list consisting of }{\s29\f0\fs20\i\lang2052{\*\listtag0}n}{\s29\f0\fs20\lang2052{\*\listtag0}-tuples for sets of elements of each sequence}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2783\ri-20\s29\itap0\tx6099{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch reduce(}{\s29\f0\fs20\i\lang2052{\*\listtag0}func}{\s29\f0\fs20\lang2052{\*\listtag0}, }{\s29\f0\fs20\i\lang2052{\*\listtag0}seq}{\s29\f0\fs20\lang2052{\*\listtag0}[, }{\s29\f0\fs20\i\lang2052{\*\listtag0}init}{\s29\f0\fs20\lang2052{\*\listtag0}])\tab Applies binary function }{\s29\f0\fs20\i\lang2052{\*\listtag0}func }{\s29\f0\fs20\lang2052{\*\listtag0}to}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li6110\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch elements of sequence }{\s29\f0\fs20\i\lang2052{\*\listtag0}seq}{\s29\f0\fs20\lang2052{\*\listtag0}, taking a pair}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li6110\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch at a time (previous result and next}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li6110\ri1676\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch sequence item), continually applying the current result with the next value to obtain the succeeding result, finally reducing our sequence to a single return value; if initial value }{\s29\f0\fs20\i\lang2052{\*\listtag0}init }{\s29\f0\fs20\lang2052{\*\listtag0}given, first compare will be of }{\s29\f0\fs20\i\lang2052{\*\listtag0}init }{\s29\f0\fs20\lang2052{\*\listtag0}and first sequence element rather than the first two sequence elements}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri3229\s29\sl264\slmult1\itap0\tx3039{\s29\f0\fs16\lang2052{\*\listtag0}\abinodiroverride\ltrch a.\tab Effectively deprecated in 1.6 to be phased out in future versions of Python. b.\tab Partially deprecated by list comprehensions introduced in Python 2.0.}{\s29\f0\fs16\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs28\lang2052{\*\listtag0}\abinodiroverride\ltrch *apply()}{\s29\f0\fs28\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch As mentioned before, the calling syntax for functions, which now allow for}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1679\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch a tuple of variable arguments as well as a dictionary of keyword variable arguments, effectively deprecates }{\s29\f0\fs20\lang2052{\*\listtag0}apply()}{\s29\f0\fs22\lang2052{\*\listtag0}as of Python 1.6. The function will be phased out and eventually removed in a future version of Python. We mention it here for historical purposes as well as for those maintaining code that uses }{\s29\f0\fs20\lang2052{\*\listtag0}apply()}{\s29\f0\fs22\lang2052{\*\listtag0}.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs28\lang2052{\*\listtag0}\abinodiroverride\ltrch filter()}{\s29\f0\fs28\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2637\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The second built-in function we examine in this chapter is }{\s29\f0\fs20\lang2052{\*\listtag0}filter()}{\s29\f0\fs22\lang2052{\*\listtag0}. Imagine going to an orchard and leaving with a bag of apples you picked off the trees. Wouldn\uc1\u8217\'92t it be nice if you could run the entire bag through a filter to keep just the good ones? That is the main premise of the }{\s29\f0\fs20\lang2052{\*\listtag0}filter() }{\s29\f0\fs22\lang2052{\*\listtag0}function.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Given a sequence of objects and a \uc1\u8220\'93filtering\uc1\u8221\'94 function, run each item of the}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2637\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch sequence through the filter, and keep only the ones that the function returns true for. The }{\s29\f0\fs20\lang2052{\*\listtag0}filter() }{\s29\f0\fs22\lang2052{\*\listtag0}function calls the given Boolean function for each item of the provided sequence. Each item for which }{\s29\f0\fs20\lang2052{\*\listtag0}filter() }{\s29\f0\fs22\lang2052{\*\listtag0}returns a non-zero (true) value is appended to a list. The object that is returned is a}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8220\'93filtered\uc1\u8221\'94 sequence of the original.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li1743\ri2459\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch If we were to code }{\s29\f0\fs20\lang2052{\*\listtag0}filter() }{\s29\f0\fs22\lang2052{\*\listtag0}in pure Python, it might look something like this:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\sb20\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}filter(}{\s29\f0\fs18\i\lang2052{\*\listtag0}bool_func}{\s29\f0\fs18\lang2052{\*\listtag0}, }{\s29\f0\fs18\i\lang2052{\*\listtag0}seq}{\s29\f0\fs18\lang2052{\*\listtag0}):}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2690\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch filtered_seq = []}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2690\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch for }{\s29\f0\fs18\lang2052{\*\listtag0}eachItem }{\s29\f0\fs18\b\lang2052{\*\listtag0}in }{\s29\f0\fs18\i\lang2052{\*\listtag0}seq}{\s29\f0\fs18\lang2052{\*\listtag0}:}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3146\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch if }{\s29\f0\fs18\i\lang2052{\*\listtag0}bool_func}{\s29\f0\fs18\lang2052{\*\listtag0}(eachItem):}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3602\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch filtered_seq.append(eachItem)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2712\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch return }{\s29\f0\fs18\lang2052{\*\listtag0}filtered_seq}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li1743\ri2459\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch One way to understand }{\s29\f0\fs20\lang2052{\*\listtag0}filter() }{\s29\f0\fs22\lang2052{\*\listtag0}better is by visualizing its behavior. Fig- ure 11\uc1\u8211\'961 attempts to do just that.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2637\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch In Figure 11\uc1\u8211\'961, we observe our original sequence at the top, items }{\s29\f0\fs20\lang2052{\*\listtag0}seq[0]}{\s29\f0\fs22\lang2052{\*\listtag0}, }{\s29\f0\fs20\lang2052{\*\listtag0}seq[1]}{\s29\f0\fs22\lang2052{\*\listtag0}, . . . }{\s29\f0\fs20\lang2052{\*\listtag0}seq[N-1] }{\s29\f0\fs22\lang2052{\*\listtag0}for a sequence of size N. For each call to }{\s29\f0\fs20\lang2052{\*\listtag0}bool_func()}{\s29\f0\fs22\lang2052{\*\listtag0}, i.e., }{\s29\f0\fs20\i\lang2052{\*\listtag0}bool_func}{\s29\f0\fs20\lang2052{\*\listtag0}(}{\s29\f0\fs20\i\lang2052{\*\listtag0}seq}{\s29\f0\fs20\lang2052{\*\listtag0}[0])}{\s29\f0\fs22\lang2052{\*\listtag0}, }{\s29\f0\fs20\i\lang2052{\*\listtag0}bool_func}{\s29\f0\fs20\lang2052{\*\listtag0}(}{\s29\f0\fs20\i\lang2052{\*\listtag0}seq}{\s29\f0\fs20\lang2052{\*\listtag0}[1])}{\s29\f0\fs22\lang2052{\*\listtag0}, etc., a return value of }{\s29\f0\fs20\lang2052{\*\listtag0}False }{\s29\f0\fs22\lang2052{\*\listtag0}or }{\s29\f0\fs20\lang2052{\*\listtag0}True }{\s29\f0\fs22\lang2052{\*\listtag0}comes back (as per the definition of a Boolean function\uc1\u8212\'97ensure that indeed your function does return one or the other). If }{\s29\f0\fs20\lang2052{\*\listtag0}bool_func() }{\s29\f0\fs22\lang2052{\*\listtag0}returns }{\s29\f0\fs20\lang2052{\*\listtag0}True }{\s29\f0\fs22\lang2052{\*\listtag0}for any sequence item, that element is inserted}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3157\ri-20\s29\itap0{\s29\f0\fs16\b\lang2052{\*\listtag0}\abinodiroverride\ltrch seq}{\s29\f0\fs16\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li135\ri-55\s29\itap0\tx839\tx1559{\s29\f0\fs16\lang2052{\*\listtag0}\abinodiroverride\ltrch seq[0]\tab seq[1]\tab seq[2]}{\s29\f0\fs16\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\ri-20\s29\itap0{\s29\f0\fs36\lang2052{\*\listtag0}\abinodiroverride\ltrch [}{\s29\f0\fs36\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\ri-20\s29\itap0{\s29\f0\fs16\lang2052{\*\listtag0}\abinodiroverride\ltrch seq[}{\s29\f0\fs16\i\lang2052{\*\listtag0}N}{\s29\f0\fs16\lang2052{\*\listtag0}-1]}{\s29\f0\fs16\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\itap0 \sect\sectd\sbknone\colsx360\margtsxn99\margbsxn0\marglsxn80\margrsxn80\pgncont\ltrsect \pard\plain\ltrpar\ql\itap0{\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3065\ri-20\s29\itap0{\shp{\*\shpinst\shpz0\shpbxmargin\shpbypara\shpwr2\shpwrk0\shpfblwtxt0\shpleft0\shptop0\shpbottom633\shpright3437\shplid62714499{\sp{\sn shapeType}{\sv 202}}{\sp{\sn dxTextLeft}{\sv 27305}}{\sp{\sn dxTextRight}{\sv 27305}}{\sp{\sn dxTextTop}{\sv 27305}}{\sp{\sn dxTextBottom}{\sv 27305}}{\shptxt{\*\abitableprops table-line-thickness:0.8pt; table-col-spacing:0.03in; table-column-leftpos:0.0000in; table-column-props:0.7361in/0.5000in/1.1507in/0.7361in/0.5000in/1.1507in/; table-sdh:4b6df90}\par{\*\abicellprops left-attach:0; right-attach:3; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.500000px; left-color:000000; left-style:1; left-thickness:0.500000px; right-color:000000; right-style:1; right-thickness:0.500000px; top-color:000000; top-style:1; top-thickness:0.500000pt; background-color:ffffff}{ \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw10\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3458 \pard\plain\ltrpar\qc\li1323\ri1304\sb60\s29\intbl\itap1{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li291\ri-20\s29\intbl\itap1\tx3440\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.500000px; top-color:000000; top-style:1; top-thickness:0.500000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw10\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx1081\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw10\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx1801\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw10\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3458 \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.500000px; right-color:000000; right-style:1; right-thickness:0.500000px; top-color:000000; top-style:1; top-thickness:0.500000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.500000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.500000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}\row}{\*\abiendtable} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\ri-24\s29\itap0}}}\par \pard\plain\ltrpar\ql\itap0{\shp{\*\shpinst\shpz0\shpbxmargin\shpbypara\shpwr2\shpwrk0\shpfblwtxt0\shpleft0\shptop0\shpbottom360\shpright100\shplid1265130369{\sp{\sn shapeType}{\sv 202}}{\sp{\sn dxTextLeft}{\sv 27305}}{\sp{\sn dxTextRight}{\sv 27305}}{\sp{\sn dxTextTop}{\sv 27305}}{\sp{\sn dxTextBottom}{\sv 27305}}{\shptxt \pard\plain\ltrpar\ql\ri-24\s29\itap0}}}\par \pard\plain\ltrpar\ql\itap0{\f0\fs16\b\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8220\'93filtered\uc1\u8221\'94}{\f0\fs16\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2959\ri-20\s29\itap0{\s29\f0\fs16\b\lang2052{\*\listtag0}\abinodiroverride\ltrch filtered_seq}{\s29\f0\fs16\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\ri-27\s29\itap0{\s29\f0\fs16\lang2052{\*\listtag0}\abinodiroverride\ltrch seq[1]}{\s29\f0\fs16\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\ri-27\s29\itap0{\s29\f0\fs16\lang2052{\*\listtag0}\abinodiroverride\ltrch seq[2]}{\s29\f0\fs16\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\ri-20\s29\itap0{\s29\f0\fs16\lang2052{\*\listtag0}\abinodiroverride\ltrch filter()}{\s29\f0\fs16\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\ri-20\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\itap0 \sect\sectd\sbknone\colsx360\margtsxn99\margbsxn0\marglsxn80\margrsxn80\pgncont\ltrsect \pard\plain\ltrpar\ql\itap0{\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3858\ri-20\s29\itap0{\s29\f0\fs16\lang2052{\*\listtag0}\abinodiroverride\ltrch (filtered_seq[0])}{\s29\f0\fs16\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\ri-20\s29\itap0{\s29\f0\fs16\lang2052{\*\listtag0}\abinodiroverride\ltrch (filtered_seq[1])}{\s29\f0\fs16\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs18\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Figure 11\uc1\u8211\'961 }{\s29\f0\fs18\lang2052{\*\listtag0}How the filter() built-in function works}{\s29\f0\fs18\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri1508\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch into the return sequence. When iteration over the entire sequence has been completed, }{\s29\f0\fs20\lang2052{\*\listtag0}filter() }{\s29\f0\fs22\lang2052{\*\listtag0}returns the newly created sequence.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch We present below a script that shows one way to use }{\s29\f0\fs20\lang2052{\*\listtag0}filter() }{\s29\f0\fs22\lang2052{\*\listtag0}to obtain a}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch short list of random odd numbers. The script generates a larger set of ran-}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1677\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch dom numbers first, then filters out all the even numbers, leaving us with the desired dataset. When we first coded this example, }{\s29\f0\fs20\lang2052{\*\listtag0}oddnogen.py }{\s29\f0\fs22\lang2052{\*\listtag0}looked like the following:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch from }{\s29\f0\fs18\lang2052{\*\listtag0}random }{\s29\f0\fs18\b\lang2052{\*\listtag0}import }{\s29\f0\fs18\lang2052{\*\listtag0}randint}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}odd(n):}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3693\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch return }{\s29\f0\fs18\lang2052{\*\listtag0}n % 2}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch allNums = []}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch for }{\s29\f0\fs18\lang2052{\*\listtag0}eachNum }{\s29\f0\fs18\b\lang2052{\*\listtag0}in }{\s29\f0\fs18\lang2052{\*\listtag0}range(9):}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3680\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch allNums.append(randint(1, 99))}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch print }{\s29\f0\fs18\lang2052{\*\listtag0}filter(odd, allNums)}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1677\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch This code consists of two functions: }{\s29\f0\fs20\lang2052{\*\listtag0}odd()}{\s29\f0\fs22\lang2052{\*\listtag0}, a Boolean function that deter- mined if an integer was odd (true) or even (false), and }{\s29\f0\fs20\lang2052{\*\listtag0}main()}{\s29\f0\fs22\lang2052{\*\listtag0}, the primary driving component. The purpose of }{\s29\f0\fs20\lang2052{\*\listtag0}main() }{\s29\f0\fs22\lang2052{\*\listtag0}is to generate ten random num- bers between 1 and 100; then }{\s29\f0\fs20\lang2052{\*\listtag0}filter() }{\s29\f0\fs22\lang2052{\*\listtag0}is called to remove all the even numbers. Finally, the set of odd numbers is displayed, preceded by the size}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch of our filtered list.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Importing and running this module several times, we get the following output:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch $ python oddnogen.py}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch [9, 33, 55, 65]}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch $ python oddnogen.py}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch [39, 77, 39, 71, 1]}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch $ python oddnogen.py}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch [23, 39, 9, 1, 63, 91]}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch $ python oddnogen.py}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch [41, 85, 93, 53, 3]}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Refactoring Pass 1}{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\sb60\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch We notice on second glance that }{\s29\f0\fs20\lang2052{\*\listtag0}odd() }{\s29\f0\fs22\lang2052{\*\listtag0}is simple enough to be replaced by a}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs20\b\lang2052{\*\listtag0}\abinodiroverride\ltrch lambda }{\s29\f0\fs22\lang2052{\*\listtag0}expression:}{\s29\f0\fs20\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri5128\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch from }{\s29\f0\fs18\lang2052{\*\listtag0}random }{\s29\f0\fs18\b\lang2052{\*\listtag0}import }{\s29\f0\fs18\lang2052{\*\listtag0}randint allNums = []}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch for }{\s29\f0\fs18\lang2052{\*\listtag0}eachNum }{\s29\f0\fs18\b\lang2052{\*\listtag0}in }{\s29\f0\fs18\lang2052{\*\listtag0}range(9):}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3650\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch allNums.append(randint(1, 99))}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch print }{\s29\f0\fs18\lang2052{\*\listtag0}filter(}{\s29\f0\fs18\b\lang2052{\*\listtag0}lambda }{\s29\f0\fs18\lang2052{\*\listtag0}n: n%2, allNums)}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Refactoring Pass 2}{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri2468\sb60\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch We have already mentioned how list comprehensions can be a suitable replacement for }{\s29\f0\fs20\lang2052{\*\listtag0}filter()}{\s29\f0\fs22\lang2052{\*\listtag0}so here it is:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch from }{\s29\f0\fs18\lang2052{\*\listtag0}random }{\s29\f0\fs18\b\lang2052{\*\listtag0}import }{\s29\f0\fs18\lang2052{\*\listtag0}randint}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch allNums = []}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch for }{\s29\f0\fs18\lang2052{\*\listtag0}eachNum }{\s29\f0\fs18\b\lang2052{\*\listtag0}in }{\s29\f0\fs18\lang2052{\*\listtag0}range(9):}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2679\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch allNums.append(randint(1, 99))}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch print }{\s29\f0\fs18\lang2052{\*\listtag0}[n }{\s29\f0\fs18\b\lang2052{\*\listtag0}for }{\s29\f0\fs18\lang2052{\*\listtag0}n }{\s29\f0\fs18\b\lang2052{\*\listtag0}in }{\s29\f0\fs18\lang2052{\*\listtag0}allNums }{\s29\f0\fs18\b\lang2052{\*\listtag0}if }{\s29\f0\fs18\lang2052{\*\listtag0}n%2]}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Refactoring Pass 3}{\s29\f0\fs22\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2637\sb60\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch We can further simplify our code by integrating another list comprehen- sion to put together our final list. As you can see below, because of the flex- ible syntax of list comps, there is no longer a need for intermediate variables. (To make things fit, we import }{\s29\f0\fs20\lang2052{\*\listtag0}randint() }{\s29\f0\fs22\lang2052{\*\listtag0}with a shorter name into our code.)}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch from }{\s29\f0\fs18\lang2052{\*\listtag0}random }{\s29\f0\fs18\b\lang2052{\*\listtag0}import }{\s29\f0\fs18\lang2052{\*\listtag0}randint }{\s29\f0\fs18\b\lang2052{\*\listtag0}as }{\s29\f0\fs18\lang2052{\*\listtag0}ri}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch print }{\s29\f0\fs18\lang2052{\*\listtag0}[n }{\s29\f0\fs18\b\lang2052{\*\listtag0}for }{\s29\f0\fs18\lang2052{\*\listtag0}n }{\s29\f0\fs18\b\lang2052{\*\listtag0}in }{\s29\f0\fs18\lang2052{\*\listtag0}[ri(1,99) }{\s29\f0\fs18\b\lang2052{\*\listtag0}for }{\s29\f0\fs18\lang2052{\*\listtag0}i }{\s29\f0\fs18\b\lang2052{\*\listtag0}in }{\s29\f0\fs18\lang2052{\*\listtag0}range(9)] }{\s29\f0\fs18\b\lang2052{\*\listtag0}if }{\s29\f0\fs18\lang2052{\*\listtag0}n%2]}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li1743\ri2474\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Although longer than it should be, the line of code making up the core part of this example is not as obfuscated as one might think.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs28\lang2052{\*\listtag0}\abinodiroverride\ltrch map()}{\s29\f0\fs28\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2637\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The }{\s29\f0\fs20\lang2052{\*\listtag0}map() }{\s29\f0\fs22\lang2052{\*\listtag0}built-in function is similar to }{\s29\f0\fs20\lang2052{\*\listtag0}filter() }{\s29\f0\fs22\lang2052{\*\listtag0}in that it can process a sequence through a function. However, unlike }{\s29\f0\fs20\lang2052{\*\listtag0}filter()}{\s29\f0\fs22\lang2052{\*\listtag0}, }{\s29\f0\fs20\lang2052{\*\listtag0}map() }{\s29\f0\fs22\lang2052{\*\listtag0}\uc1\u8220\'93maps\uc1\u8221\'94 the function call to each sequence item and returns a list consisting of all the return values.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2639\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch In its simplest form, }{\s29\f0\fs20\lang2052{\*\listtag0}map() }{\s29\f0\fs22\lang2052{\*\listtag0}takes a function and sequence, applies the function to each item of the sequence, and creates a return value list that is comprised of each application of the function. So if your mapping function is}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2636\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch to add 2 to each number that comes in and you feed that function to }{\s29\f0\fs20\lang2052{\*\listtag0}map() }{\s29\f0\fs22\lang2052{\*\listtag0}along with a list of numbers, the resulting list returned is the same set of numbers as the original, but with 2 added to each number. If we were to code how this simple form of }{\s29\f0\fs20\lang2052{\*\listtag0}map() }{\s29\f0\fs22\lang2052{\*\listtag0}works in Python, it might look something like the code below that is illustrated in Figure 11\uc1\u8211\'962.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}map(}{\s29\f0\fs18\i\lang2052{\*\listtag0}func}{\s29\f0\fs18\lang2052{\*\listtag0}, }{\s29\f0\fs18\i\lang2052{\*\listtag0}seq}{\s29\f0\fs18\lang2052{\*\listtag0}):}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2669\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch mapped_seq = []}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2669\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch for }{\s29\f0\fs18\lang2052{\*\listtag0}eachItem }{\s29\f0\fs18\b\lang2052{\*\listtag0}in }{\s29\f0\fs18\i\lang2052{\*\listtag0}seq}{\s29\f0\fs18\lang2052{\*\listtag0}:}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3136\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch mapped_seq.append(func(eachItem))}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2679\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch return }{\s29\f0\fs18\lang2052{\*\listtag0}mapped_seq}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\itap0 \sect\sectd\sbknone\colsx360\margtsxn99\margbsxn0\marglsxn80\margrsxn80\pgncont\ltrsect \pard\plain\ltrpar\ql\itap0{\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li4234\ri-20\s29\itap0\tx4819{\s29\f0\fs16\b\lang2052{\*\listtag0}\abinodiroverride\ltrch seq\tab }{\s29\f0\fs36\lang2052{\*\listtag0}[}{\s29\f0\fs16\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3922\ri-20\s29\itap0{\s29\f0\fs16\b\lang2052{\*\listtag0}\abinodiroverride\ltrch mapped_s}{\s29\f0\fs16\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li4827\ri-20\s29\itap0{\shp{\*\shpinst\shpz0\shpbxmargin\shpbypara\shpwr2\shpwrk0\shpfblwtxt0\shpleft0\shptop0\shpbottom634\shpright3437\shplid436190580{\sp{\sn shapeType}{\sv 202}}{\sp{\sn dxTextLeft}{\sv 27305}}{\sp{\sn dxTextRight}{\sv 27305}}{\sp{\sn dxTextTop}{\sv 27305}}{\sp{\sn dxTextBottom}{\sv 27305}}{\shptxt{\*\abitableprops table-line-thickness:0.8pt; table-col-spacing:0.03in; table-column-leftpos:0.0000in; table-column-props:0.2361in/0.5000in/0.5000in/0.8826in/0.2681in/0.2361in/0.5000in/0.5000in/0.8826in/0.2681in/; table-sdh:4b7e308}\par{\*\abicellprops left-attach:0; right-attach:5; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.500000px; left-color:000000; left-style:1; left-thickness:0.500000px; right-color:000000; right-style:1; right-thickness:0.500000px; top-color:000000; top-style:1; top-thickness:0.500000pt; background-color:ffffff}{ \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw10\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3458 \pard\plain\ltrpar\ql\s29\intbl\itap1{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qc\li1541\ri1521\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.500000px; top-color:000000; top-style:1; top-thickness:0.500000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw10\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx361\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw10\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx1081\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw10\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx1801\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw10\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3072\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw10\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3458 \pard\plain\ltrpar\ql\li-113\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.500000px; right-color:000000; right-style:1; right-thickness:0.500000px; top-color:000000; top-style:1; top-thickness:0.500000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.500000px; right-color:000000; right-style:1; right-thickness:0.500000px; top-color:000000; top-style:1; top-thickness:0.500000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:3; right-attach:4; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.500000px; right-color:000000; right-style:1; right-thickness:0.500000px; top-color:000000; top-style:1; top-thickness:0.500000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:4; right-attach:5; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.500000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.500000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}\row}{\*\abiendtable} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0}}}\par \pard\plain\ltrpar\ql\itap0{\f0\fs36\lang2052{\*\listtag0}\abinodiroverride\ltrch [}{\f0\fs36\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\ri-20\s29\itap0\tx720\tx1440\tx2600{\s29\f0\fs16\lang2052{\*\listtag0}\abinodiroverride\ltrch seq[0]\tab seq[1]\tab seq[2]\tab seq[}{\s29\f0\fs16\i\lang2052{\*\listtag0}N}{\s29\f0\fs16\lang2052{\*\listtag0}-1]}{\s29\f0\fs16\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\ri-20\s29\itap0\tx720\tx1440\tx2600{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\itap0 \sect\sectd\sbknone\colsx360\margtsxn99\margbsxn0\marglsxn80\margrsxn80\pgncont\ltrsect \pard\plain\ltrpar\ql\itap0{\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li4746\ri-20\sb20\s29\itap0{\s29\f0\fs16\lang2052{\*\listtag0}\abinodiroverride\ltrch func(seq[0])}{\s29\f0\fs16\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\ri-20\sb20\s29\itap0\tx1160{\s29\f0\fs16\lang2052{\*\listtag0}\abinodiroverride\ltrch func(seq[2])\tab func(seq[}{\s29\f0\fs16\i\lang2052{\*\listtag0}N}{\s29\f0\fs16\lang2052{\*\listtag0}-1])}{\s29\f0\fs16\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li5481\ri-20\sb60\s29\itap0\tx7960{\s29\f0\fs16\lang2052{\*\listtag0}\abinodiroverride\ltrch func(seq[1])\tab map()}{\s29\f0\fs16\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3683\ri-20\s29\itap0{\s29\f0\fs18\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Figure 11\uc1\u8211\'962 }{\s29\f0\fs18\lang2052{\*\listtag0}How the map() built-in function works}{\s29\f0\fs18\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch We can whip up a few quick }{\s29\f0\fs20\b\lang2052{\*\listtag0}lambda }{\s29\f0\fs22\lang2052{\*\listtag0}functions to show you how }{\s29\f0\fs20\lang2052{\*\listtag0}map()}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch works on real data:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> map((}{\s29\f0\fs18\b\lang2052{\*\listtag0}lambda }{\s29\f0\fs18\lang2052{\*\listtag0}x: x+2), [0, 1, 2, 3, 4, 5])}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch [2, 3, 4, 5, 6, 7]}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>>}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> map(}{\s29\f0\fs18\b\lang2052{\*\listtag0}lambda }{\s29\f0\fs18\lang2052{\*\listtag0}x: x**2, range(6))}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch [0, 1, 4, 9, 16, 25]}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> [x+2 }{\s29\f0\fs18\b\lang2052{\*\listtag0}for }{\s29\f0\fs18\lang2052{\*\listtag0}x }{\s29\f0\fs18\b\lang2052{\*\listtag0}in }{\s29\f0\fs18\lang2052{\*\listtag0}range(6)]}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch [2, 3, 4, 5, 6, 7]}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>>}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>>[x**2 }{\s29\f0\fs18\b\lang2052{\*\listtag0}for }{\s29\f0\fs18\lang2052{\*\listtag0}x }{\s29\f0\fs18\b\lang2052{\*\listtag0}in }{\s29\f0\fs18\lang2052{\*\listtag0}range(6)]}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch [0, 1, 4, 9, 16, 25]}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li2704\ri1514\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch We have also discussed how map () can sometimes can be replaced by list comprehensions, so here we refactor our two examples above.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The more general form of }{\s29\f0\fs20\lang2052{\*\listtag0}map() }{\s29\f0\fs22\lang2052{\*\listtag0}can take more than a single sequence as}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch its input. If this is the case, then }{\s29\f0\fs20\lang2052{\*\listtag0}map() }{\s29\f0\fs22\lang2052{\*\listtag0}will iterate through each sequence in}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch parallel. On the first invocation, it will bundle the first element of each}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1680\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch sequence into a tuple, apply the }{\s29\f0\fs20\lang2052{\*\listtag0}func }{\s29\f0\fs22\lang2052{\*\listtag0}function to it, and return the result as a tuple into the }{\s29\f0\fs20\i\lang2052{\*\listtag0}mapped_seq }{\s29\f0\fs22\lang2052{\*\listtag0}mapped sequence that is finally returned as a whole when }{\s29\f0\fs20\lang2052{\*\listtag0}map() }{\s29\f0\fs22\lang2052{\*\listtag0}has completed execution.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Figure 11\uc1\u8211\'962 illustrated how }{\s29\f0\fs20\lang2052{\*\listtag0}map() }{\s29\f0\fs22\lang2052{\*\listtag0}works with a single sequence. If}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch we used }{\s29\f0\fs20\lang2052{\*\listtag0}map() }{\s29\f0\fs22\lang2052{\*\listtag0}with }{\s29\f0\fs22\i\lang2052{\*\listtag0}M }{\s29\f0\fs22\lang2052{\*\listtag0}sequences of }{\s29\f0\fs22\i\lang2052{\*\listtag0}N }{\s29\f0\fs22\lang2052{\*\listtag0}objects each, our previous dia-}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch gram would be converted to something like the diagram presented in}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Figure 11\uc1\u8211\'963.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\sb20\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\sb20\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\itap0 \sect\sectd\sbknone\colsx360\margtsxn99\margbsxn0\marglsxn80\margrsxn80\pgncont\ltrsect \pard\plain\ltrpar\ql\itap0{\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2678\ri-20\s29\itap0{\s29\f0\fs16\lang2052{\*\listtag0}\abinodiroverride\ltrch seq}{\s29\f0\fs16\i\lang2052{\*\listtag0}M}{\s29\f0\fs16\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li238\ri-20\s29\itap0\tx1739\tx3219{\s29\f0\fs16\lang2052{\*\listtag0}\abinodiroverride\ltrch 0\tab 1\tab }{\s29\f0\fs16\i\lang2052{\*\listtag0}N}{\s29\f0\fs16\lang2052{\*\listtag0}-1}{\s29\f0\fs16\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\ri-20\s29\itap0{\s29\f0\fs36\lang2052{\*\listtag0}\abinodiroverride\ltrch [}{\s29\f0\fs36\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2859\ri-20\s29\itap0\tx3660\tx6740\tx11380{\s29\f0\fs16\lang2052{\*\listtag0}\abinodiroverride\ltrch :.\tab .:\tab :.\tab }{\s29\f0\fs16\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2686\ri-20\s29\itap0\tx3399{\s29\f0\fs16\lang2052{\*\listtag0}\abinodiroverride\ltrch seq2\tab }{\s29\f0\fs36\lang2052{\*\listtag0}[}{\s29\f0\fs16\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2686\ri-20\sb60\s29\itap0\tx3399{\s29\f0\fs16\lang2052{\*\listtag0}\abinodiroverride\ltrch seq1\tab }{\s29\f0\fs36\lang2052{\*\listtag0}[}{\s29\f0\fs16\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\itap0 \sect\sectd\sbknone\colsx360\margtsxn99\margbsxn0\marglsxn80\margrsxn80\pgncont\ltrsect \pard\plain\ltrpar\ql\itap0{\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2617\ri-20\s29\itap0{\shp{\*\shpinst\shpz0\shpbxmargin\shpbypara\shpwr2\shpwrk0\shpfblwtxt0\shpleft0\shptop0\shpbottom634\shpright3480\shplid1472545772{\sp{\sn shapeType}{\sv 202}}{\sp{\sn dxTextLeft}{\sv 27305}}{\sp{\sn dxTextRight}{\sv 27305}}{\sp{\sn dxTextTop}{\sv 27305}}{\sp{\sn dxTextBottom}{\sv 27305}}{\shptxt{\*\abitableprops table-line-thickness:0.8pt; table-col-spacing:0.03in; table-column-leftpos:0.0000in; table-column-props:0.1403in/0.9597in/1.1889in/0.1278in/0.1403in/0.9597in/1.1889in/0.1278in/; table-sdh:4b81a58}\par{\*\abicellprops left-attach:0; right-attach:4; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.500000px; left-color:000000; left-style:1; left-thickness:0.500000px; right-color:000000; right-style:1; right-thickness:0.500000px; top-color:000000; top-style:1; top-thickness:0.500000pt; background-color:ffffff}{ \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw10\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3501 \pard\plain\ltrpar\ql\s29\intbl\itap1{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qc\li1560\ri1544\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.500000px; top-color:000000; top-style:1; top-thickness:0.500000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw10\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx223\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw10\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx1605\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw10\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3317\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw10\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3501 \pard\plain\ltrpar\ql\li-81\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.500000px; right-color:000000; right-style:1; right-thickness:0.500000px; top-color:000000; top-style:1; top-thickness:0.500000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.500000px; right-color:000000; right-style:1; right-thickness:0.500000px; top-color:000000; top-style:1; top-thickness:0.500000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:3; right-attach:4; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.500000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.500000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}\row}{\*\abiendtable} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0}}}\par \pard\plain\ltrpar\ql\itap0{\f0\fs16\b\lang2052{\*\listtag0}\abinodiroverride\ltrch mapped_s}{\f0\fs16\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2918\ri-86\s29\itap0\tx3719\tx4200{\s29\f0\fs36\lang2052{\*\listtag0}\abinodiroverride\ltrch [(\tab }{\s29\f0\fs16\lang2052{\*\listtag0}...\tab }{\s29\f0\fs36\lang2052{\*\listtag0}),(}{\s29\f0\fs36\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\ri-20\s29\itap0\tx440\tx1700\tx2160{\s29\f0\fs16\lang2052{\*\listtag0}\abinodiroverride\ltrch ...\tab }{\s29\f0\fs36\lang2052{\*\listtag0}),...(\tab }{\s29\f0\fs16\lang2052{\*\listtag0}...\tab }{\s29\f0\fs36\lang2052{\*\listtag0})]}{\s29\f0\fs16\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2470\ri-20\sb60\s29\itap0\tx5780{\s29\f0\fs16\lang2052{\*\listtag0}\abinodiroverride\ltrch func(seq1[0], seq2[0], ... seq}{\s29\f0\fs16\i\lang2052{\*\listtag0}M }{\s29\f0\fs16\lang2052{\*\listtag0}[0])\tab func(seq1[}{\s29\f0\fs16\i\lang2052{\*\listtag0}N}{\s29\f0\fs16\lang2052{\*\listtag0}-1], ... seq}{\s29\f0\fs16\i\lang2052{\*\listtag0}M }{\s29\f0\fs16\lang2052{\*\listtag0}[}{\s29\f0\fs16\i\lang2052{\*\listtag0}N}{\s29\f0\fs16\lang2052{\*\listtag0}-1])}{\s29\f0\fs16\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qc\li4148\ri4755\sb60\s29\itap0{\s29\f0\fs16\lang2052{\*\listtag0}\abinodiroverride\ltrch func(seq1[1], seq2[1], ... seq}{\s29\f0\fs16\i\lang2052{\*\listtag0}M }{\s29\f0\fs16\lang2052{\*\listtag0}[1])}{\s29\f0\fs16\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li7500\ri-20\s29\itap0{\s29\f0\fs16\lang2052{\*\listtag0}\abinodiroverride\ltrch map()}{\s29\f0\fs16\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2204\ri-20\s29\itap0{\s29\f0\fs18\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Figure 11\uc1\u8211\'963 }{\s29\f0\fs18\lang2052{\*\listtag0}How the }{\s29\f0\fs18\b\lang2052{\*\listtag0}map() }{\s29\f0\fs18\lang2052{\*\listtag0}built-in function works with > 1 sequence}{\s29\f0\fs18\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Here are several examples using }{\s29\f0\fs20\lang2052{\*\listtag0}map()}{\s29\f0\fs22\lang2052{\*\listtag0}with multiple sequences:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> map(}{\s29\f0\fs18\b\lang2052{\*\listtag0}lambda }{\s29\f0\fs18\lang2052{\*\listtag0}x, y: x + y, [1,3,5], [2,4,6])}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch [3, 7, 11]}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>>}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> map(}{\s29\f0\fs18\b\lang2052{\*\listtag0}lambda }{\s29\f0\fs18\lang2052{\*\listtag0}x, y: (x+y, x-y), [1,3,5], [2,4,6])}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch [(3, -1), (7, -1), (11, -1)]}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>>}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> map(None, [1,3,5], [2,4,6])}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch [(1, 2), (3, 4), (5, 6)]}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2636\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The last example above uses }{\s29\f0\fs20\lang2052{\*\listtag0}map() }{\s29\f0\fs22\lang2052{\*\listtag0}and a function object of }{\s29\f0\fs20\lang2052{\*\listtag0}None }{\s29\f0\fs22\lang2052{\*\listtag0}to merge elements of unrelated sequences together. This idiom was so com- monly used prior to Python 2.0 that a new built-in function, }{\s29\f0\fs20\lang2052{\*\listtag0}zip()}{\s29\f0\fs22\lang2052{\*\listtag0}, was added just to address it:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\sb20\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> zip([1,3,5], [2,4,6])}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch [(1, 2), (3, 4), (5, 6)]}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\sb20\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs28\lang2052{\*\listtag0}\abinodiroverride\ltrch reduce()}{\s29\f0\fs28\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2637\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The final functional programming piece is }{\s29\f0\fs20\lang2052{\*\listtag0}reduce()}{\s29\f0\fs22\lang2052{\*\listtag0}, which takes a }{\s29\f0\fs22\i\lang2052{\*\listtag0}binary function }{\s29\f0\fs22\lang2052{\*\listtag0}(a function that takes two values, performs some calculation and returns one value as output), a sequence, and an optional initializer, and}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri1502\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch methodologically \uc1\u8220\'93reduces\uc1\u8221\'94 the contents of that list down to a single value, hence its name. In other languages, this concept is known as }{\s29\f0\fs22\i\lang2052{\*\listtag0}folding}{\s29\f0\fs22\lang2052{\*\listtag0}.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch It does this by taking the first two elements of the sequence and passing them to the binary function to obtain a single value. It then takes this value and the next item of the sequence to get yet another value, and so on until the sequence is exhausted and one final value is computed.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch You may try to visualize }{\s29\f0\fs20\lang2052{\*\listtag0}reduce() }{\s29\f0\fs22\lang2052{\*\listtag0}as the following equivalence example:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3291\ri-20\s29\itap0\tx6439\tx6920{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch reduce(func, [1, 2, 3])\tab \'ba\tab func(func(1, 2), 3)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1677\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Some argue that the \uc1\u8220\'93proper functional\uc1\u8221\'94 use of }{\s29\f0\fs20\lang2052{\*\listtag0}reduce() }{\s29\f0\fs22\lang2052{\*\listtag0}requires only one item to be taken at a time for }{\s29\f0\fs20\lang2052{\*\listtag0}reduce()}{\s29\f0\fs22\lang2052{\*\listtag0}. In our first iteration above, we took two items because we did not have a \uc1\u8220\'93result\uc1\u8221\'94 from the previous values}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1681\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch (because we did not }{\s29\f0\fs22\i\lang2052{\*\listtag0}have }{\s29\f0\fs22\lang2052{\*\listtag0}any previous values). This is where the optional ini- tializer comes in (see the }{\s29\f0\fs20\lang2052{\*\listtag0}init }{\s29\f0\fs22\lang2052{\*\listtag0}variable below). If the initializer is given, then the first iteration is performed on the initializer and the first item of the sequence, and follows normally from there.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li2704\ri1499\s29\itap0{\shp{\*\shpinst\shpz0\shpbxmargin\shpbypara\shpwr2\shpwrk0\shpfblwtxt0\shpleft0\shptop0\shpbottom487\shpright10620\shplid1977534773{\sp{\sn shapeType}{\sv 202}}{\sp{\sn dxTextLeft}{\sv 27305}}{\sp{\sn dxTextRight}{\sv 27305}}{\sp{\sn dxTextTop}{\sv 27305}}{\sp{\sn dxTextBottom}{\sv 27305}}{\shptxt{\*\abitableprops table-line-thickness:0.8pt; table-col-spacing:0.03in; table-column-leftpos:0.0000in; table-column-props:2.2938in/1.7417in/3.3396in/2.2938in/1.7417in/3.3396in/; table-sdh:4b842b8}\par{\*\abicellprops left-attach:0; right-attach:1; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.250000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}{ \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3324\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx5832\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx10641 \pard\plain\ltrpar\ql\li2893\ri-20\sb20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li57\ri-20\sb20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li57\ri-20\sb20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.250000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3324\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx5832\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx10641 \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li57\ri-20\sb20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li21\ri-20\sb20\s29\intbl\itap1\cell{\*\abiendcell}\row}{\*\abiendtable} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0}}}\par \pard\plain\ltrpar\ql\itap0{\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch If we were to try to implement }{\f0\fs20\lang2052{\*\listtag0}reduce() }{\f0\fs22\lang2052{\*\listtag0}in pure Python, it might look something like this:}{\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3640\ri-20\s29\itap0\tx6099{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch if }{\s29\f0\fs18\lang2052{\*\listtag0}init }{\s29\f0\fs18\b\lang2052{\*\listtag0}is }{\s29\f0\fs18\lang2052{\*\listtag0}None:\tab # initializer?}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qc\li4065\ri4476\s29\itap0\tx6599{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch res = lseq.pop(0) #\tab no}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3640\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch else}{\s29\f0\fs18\lang2052{\*\listtag0}:}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qc\li4064\ri4362\s29\itap0\tx6099\tx6599{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch res = init\tab #\tab yes}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3640\ri-20\s29\itap0\tx6099{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch for }{\s29\f0\fs18\lang2052{\*\listtag0}item }{\s29\f0\fs18\b\lang2052{\*\listtag0}in }{\s29\f0\fs18\lang2052{\*\listtag0}lseq:\tab # reduce sequence}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li4095\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch res = bin_func(res, item) # apply function}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3640\ri-20\s29\itap0\tx7139{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch return }{\s29\f0\fs18\lang2052{\*\listtag0}res\tab # return result}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li2704\ri1482\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch This may be the most difficult of the four conceptually, so we should again show you an example as well as a functional diagram (see Figure 11\uc1\u8211\'964). The}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8220\'93hello world\uc1\u8221\'94 of }{\s29\f0\fs20\lang2052{\*\listtag0}reduce() }{\s29\f0\fs22\lang2052{\*\listtag0}is its use of a simple addition function or its}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs20\b\lang2052{\*\listtag0}\abinodiroverride\ltrch lambda }{\s29\f0\fs22\lang2052{\*\listtag0}equivalent seen earlier in this chapter:}{\s29\f0\fs20\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8226\'95 }{\s29\f0\fs18\b\lang2052{\*\listtag0}def }{\s29\f0\fs18\lang2052{\*\listtag0}mySum(x,y): }{\s29\f0\fs18\b\lang2052{\*\listtag0}return }{\s29\f0\fs18\lang2052{\*\listtag0}x+y}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8226\'95 }{\s29\f0\fs18\b\lang2052{\*\listtag0}lambda }{\s29\f0\fs18\lang2052{\*\listtag0}x,y: x+y}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1683\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Given a list, we can get the sum of all the values by simply creating a loop, iteratively going through the list, adding the current element to a running subtotal, and being presented with the result once the loop has completed:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> }{\s29\f0\fs18\b\lang2052{\*\listtag0}def }{\s29\f0\fs18\lang2052{\*\listtag0}mySum(x,y): }{\s29\f0\fs18\b\lang2052{\*\listtag0}return }{\s29\f0\fs18\lang2052{\*\listtag0}x+y}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0\tx6259{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> allNums = range(5)\tab # [0, 1, 2, 3, 4]}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> total = 0}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\itap0 \sect\sectd\sbknone\colsx360\margtsxn99\margbsxn0\marglsxn80\margrsxn80\pgncont\ltrsect \pard\plain\ltrpar\ql\itap0{\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2510\ri-20\s29\itap0{\s29\f0\fs16\b\lang2052{\*\listtag0}\abinodiroverride\ltrch seq }{\s29\f0\fs36\lang2052{\*\listtag0}[}{\s29\f0\fs16\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\ri-20\s29\itap0\tx2700\tx3420{\s29\f0\fs16\lang2052{\*\listtag0}\abinodiroverride\ltrch 0 1 2\tab }{\s29\f0\fs16\i\lang2052{\*\listtag0}N}{\s29\f0\fs16\lang2052{\*\listtag0}-2\tab }{\s29\f0\fs16\i\lang2052{\*\listtag0}N}{\s29\f0\fs16\lang2052{\*\listtag0}-1}{\s29\f0\fs16\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3074\ri-20\s29\itap0{\s29\f0\fs16\lang2052{\*\listtag0}\abinodiroverride\ltrch bin\uc1\u8211\'96func}{\s29\f0\fs16\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3360\ri-20\s29\itap0{\s29\f0\fs16\lang2052{\*\listtag0}\abinodiroverride\ltrch (a)}{\s29\f0\fs16\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\itap0 \sect\sectd\sbknone\colsx360\margtsxn99\margbsxn0\marglsxn80\margrsxn80\pgncont\ltrsect \pard\plain\ltrpar\ql\itap0{\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3783\ri-20\s29\itap0{\s29\f0\fs16\lang2052{\*\listtag0}\abinodiroverride\ltrch bin\uc1\u8211\'96func}{\s29\f0\fs16\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li4083\ri-20\s29\itap0{\s29\f0\fs16\lang2052{\*\listtag0}\abinodiroverride\ltrch (b)}{\s29\f0\fs16\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li11\ri-20\s29\itap0{\*\shppict{\pict\pngblip\picw24\pich109\picwgoal479\picscalex18\pichgoal2180\picscaley18 \bliptag10016{\*\blipuid 00000000000000000000000000002720} 89504e470d0a1a0a0000000d49484452000000180000006d0806000000bb98a1 8a00000fed49444154789cad9a7d5c8f67fbc7dff5bddadc9656b4344d1e928a 5a25216a9d1e266ed930f61331b6791a73b78571d9e8645a37a6c63cb4d7dc8b 883c84d093a7524d12a2511ea28ca61172dfd94c7c7f7fa46fdff84665c7eb75 5dafd7759dc7eb38cecf791cd7f1709e1773ce36c52330167cb3a92223bd7bad 570629d1368bd83063505400d403491ccc5274cf8ad1f56e1cdf301a6b2a3990 12cfb6e54668ce7d4bfabd97b9dffe539c46afa49f369eeeb1a1c84edee4b898 70e9d579e46e69cd78f7a1bc7dff733eb2bdc840efe1c43bad21f4ce6586967a 73d9ff57c6bbc7c1943503d9befa01438564fafb2d39fd8d35e0fb0c0486e164 01c689b6a89b67030a6e80a21e4093b3e72213c72ca44b444f3e1b3c939521ab 284d2ac6b5fd496ef5b9cccc32e8621ac308d72bac76fe0d8b45797c167a86f9 36e59cb9799c8121979933289f4e150a776f4fe7b0992365030ad9bfda99bc5f 1cc0df64055bcf16b142488afc4d905bcff2ab9940d352836f81539d089e6116 6cb360b671228abab9ca489b26eb19697f5b0eb8d51809d03e7959ce15acf38b 43c8581c2bd269151ec80ae1a69be0ae0b82fc300b84db19740cc6c20dd56b01 32a612cbb9c2a06003d7b3cc528791628a00a5be0ab45e0b8c89a954891092b2 dc61bc79dc1e7d841862a8af701d8afa7e347ad41005da79da343a086f52d7bc 828c2ea3c05d6075a119c26526ccd9b78337fb6ea183702675cd2b0d160e689f e565354f3526d3d240728b3b65b46af94edeefb392b6cbe6e196bb0db3851efc 6ceb02333f76e7c74d5b192f24a10bbd1b8560628720f02d358800034f0d5f22 d0da00fb63a7203b17c27581cf1b69885eaba0a94f10e6d1f9588a5e8d160e68 df10921f734228db7895a762d9df81204c5151d414000e8743a06305423a4096 693076ae63311392712ba7355a81a59014fbc521d7a80c7c5b703bfa36bee5fd 204eb8e0f8f55fe0fbbf4623d890aa17cb92ee90825ec2c999338802bfa66452 4971b68651dd1ed250eab4c994c5de71a40f7f99972ffc83c18bbdb99fde0abf ae2b4071594ab8a3170b85a4ed958ac62e514d2cdbd00350980c286a52d50c12 8be08ea2d6bc6880f0ea09de1612b3d8121cce25e3b254e0e8a5206438f42e6c c562d39bb412929bbd0b918b4df96299688892a7c8360b761a27a2a8d118cfea 1dc7eb6f585192711fcb4376dc77f1a7f7f98c7aadbd905f1b75f84f3fbc3cc6 d04a74d44db07ba9c03dfd18dedb02a09ae1b8e8484e4e0e72be29796e826d3b ee21e4d77521697884d619697d14a0900b286a026a6211a0e0041c0e0f445a79 62a90a8afde210ddaf9093739cf9a639202400f611d49ea021869ce302d39c1c 849caf1bdf2f24bb6cda63e26e0b88069735b5c8360b228c1351d47500240c80 918a8aa2260230b505e0548e9096648e9c8443a40d374577967c1a8a9cd38514 0f4164c14284bd31466d4cbb12ec57c8a8b216fce4f221f74cb7e19562c6e58d 7dd934783e7d2217533e6133735a0fe6271713ee996e63d27233be483b4db16f 04a915639fc827550fb553cc736acf754df442c1de5412726b42415e4100cd7d cd081092b7a6f9d36d421c07970aecba2e40c8608c12dc3693b06732bf057e86 34dac310ed007ef04f67c2e63eb41e5ccee5256904fb156255d682c9b34cf92c 610f3e6d0375e33767d831762bcc8afa0a52cbea83e039b5675408a0d00350d4 bda8090300052d905c340e69fe07112f098e669c4778ae45e397de8ced5d0e72 fede69fcbe0b61b0990b5d776be872ce8ba68faeb0ca761d1639fb493e31872d 3f97f055ae1d61edc1c2ef3b8ccc7713b07228163929bc75620e4bda0f6587a6 099b8fc5b1f63fc11495c4d78de079b5678871228a1aa57b97fa1811405a25b8 06a722a4391adba461101e88f5315ffa1c7b9b57fe3d939ff2ae121ef88863be 4348cc3663f9d4456434398ddf77ff66b0990bf6ef6ab85b70892669cbf92eac 17662e7eecd00ce6ede15a069bb930c54c43b2ab1509df7f04ab4c169170260b 448f5ab3ac5f7d56e56560cc1d40518fa2ee71e471e90980727547673ee9eccd 432a99959a86d990e9fcdcde82efb7bfcb84e16b1914dd9d13a16ff1d9d52276 7f728254ff1bcc0d7c090f8f4b8ca8ec4d57e5ff78e4f12ec3c36e2237dca6f2 5a3a49c346e8c65972f6230202d7112d24e3e3b368fbf1559e1d0a0c53b59701 1cbd03518a8aa2ee46e3396607ff0cedc757053d486dd3825bdf7565dca3228e f42c22d33e8a8b3dbb503c258d6365e97c39a92326afe6e13ae5087f05adc2b1 780153932ab02c0fa26773775aba82765d0bde0bb263ddf43731ff5f0aa4c45b e3bffb0c7f09c9fd6f7c91c3ee528e206a9533a2c56203089e0fa7ca2c89b58d 5404286a166a7c04bba3f443c1289afb9a512224133e3980fbeac3c45b0b769f 4941487ffcbeb6678f9f0d7f091fdd04ffb55ce09e9c80f02944c7602d7c3893 128ff4df5d4b40f3925cd67f9003e2955a08eaeb65068d7424179a282a8a1a8f badb1a50680e38954f455ac2aef3353dd8c9d224fa6f98879d9024ae74c1e74b bb5a1334c8105d20c8f6094248a11b2f14925d366dea9170ea41fa46528fe4b2 2b4421e23122804027f03c1c8e9056385664d02a3c9002e1864f50345264d3d4 5710149d8ff0f1847efb5a5174b68202e16d98c140d2efbc566075bd39c2c8c4 008267d5d54f53dddd8ea21a51198ae6d67a5ebb798bb913cb1915718ade0ff3 f8578c0ddffef612560e15f060c5623cb35b335148d25ebb8cf73c2d6b8385c1 993f7909d98b94e0a6b43b5b0abe95b5e6fc3c1cf52e1dd55d218042083070e3 04a44d29056eb5baccedbcd9770bd6c299535e7d916e710d5250bd02fe8f8be7 3fb627f2b777383bae2bfca9a828ea4e0034991018938d906d30ca329dc168bb df79cbc20efbbefb50bfcaa8dbb07550e7c2fd46651f65927cff303bff98cabe 66cb1970603afbfe52e1f690b9f4bb1d0dbee58d4600c6ec0414351375c73876 06e9edd6a83bae030acb00c78ac38d5480d646f4d2b5b1536c0485fb6311b233 541c0ec721d0912821f931674ea315e8c7b28c2828505414350ed40c6be28628 8cab82d428e180364848f29bfad0cb3c1ad36081ebd82c84b4836c4d266d0263 081692b159a62fa24447fab14c29b3d150bc21908d3ce2667c06e05d97b3d449 25ef9c30faf6ee546e84e56137da8e1bfd2d30197b8993e743e007e7c994bc73 824ce1454cb6a6b1089e4f7a466ab807950ec44148ba0db1c5abcf35349942f7 a1b17142084f3234584983f367038457379151a223119a5b48ebf314fd5750b8 ed16a2c72a88b354b952ec4794e85e8ba13ec27d2fbd56359d17c89f752b781c 0a82a2f311d93e688544abd5621fae25d049e8522ae5535b6089139384c42673 24dd1d226b31c459d6fe00a525b5c635c7cfe0a46909be05b510342c7152bbac 49fb13362b2a8aba15755b12a0900ccc3b598aecbf8114cf9a2e9336a69e2c7f cf8200d101b3bc0264735ffc0304716f4d43749b6010e1d41642d7c6568fbf26 24d3dfef6df878e0456a4f35f53a5bdb2ab8292a8aba0d80786b748597e61bdf 07bc7afa4b9c8f98b0a55d05296d3fe49dcbc61ce9994aa67d1429431ee126d3 78e5621e57761f448dcde3e1cd7684599453dad29585d7021894d803aff4eb14 cdea831a9b87b6a81d891995947b9e822649e7e965d10c7c0f3dc348755375f1 7c1d50d454d42d6bd8ba593fe16c6d0b287c08ac5b72161910c88c6b8269fe01 880e66a4a65562ee1a4c3321c9f04ba76beef78cd30afe482e424873ce47bcc4 daa3196885a7ae8dd51fd709f84b481676cc6743e282a78dd4402f4b1d07e68a 8aa26e01f5d01062c314d654bf009286c18d45b608f901f94d7d781814cd3061 c722db24e4ab3758d4469034f406c2e3914184699542d7c6929af61073d76086 09a913d0b1a360c142070e6d483480a0911dce1040510fa1c6c216f31a23edfa a10f13d5c99408897fc00c3a984d23ed61cd0cc3fdbae07ce132c3848741843a 8687c283e0d434a4b96b2d014da6385579d9a1c6799941231d14305b5151d4cd a8b16180c266c03cc10d39ed2a9eef09befaa537a283a068dc23ccff48a6a790 5caa54e9f2414cad091a64281825f035cb43c8e6baf19342123b278d6c8f40e0 d0dfd8e11c146cba536513458dad42b814dd86531bd3ae2c7fcf82517ab1ec40 89e0f0844f10eeabc162d779cee487314ab81964a86e634709a91b777610584f 7f9f43a7bf3180a08170aabdacfaf053dd3499cdb36bbcecd3d09bcce9b2040f 2129589882bd7124539b0b5db4253cd0092bcfc3640849a063056eadc26b3154 2374126eba7d53fd714dc1f8aa8473e86f4c3807dca0485151d418d44d770085 e3a0db39060180b08fa8d95a5eaf57150c5b21b02fcb45bc79dc2042fd94593d 5e2a244b4b7fe1d26b6ff09497d5d348ba0aae9697eddf4ccc4885c98a8aa26e 0220cf8d9aade5eaedfd5d4292b960041d2b8b991022281db8b15aa8c1ab1aa1 e6d67aaccf47b05e48dd0a5c8a13d81fc8e3d0150f702f79999fbe380b87ae3d 89a05e3569b597ad0114751feac65c628af4134ecc48406129e0a5b820c31d29 b92deaab40dbacc08d995617c8142ec4646b906d02752b20a44d4d7fd0524882 7a7d4ce9c40ef516ae6f177d2fdb670e03141545dd88919a1246a797bec4b9df 2cbaceea4c65e8e85a06ad0fb5098c315a76f5020fbd7ab2606f1845fd1f62f7 7b181676a3a1e2f0321c021d99f1621d4e2d32987080eaa3c2062b381719c90c e1c4d82c53a49d2bdee3058f4217223add87c8c8d59c8b8cc44638b13f76cadf 82c020bd48870368b70b899973731c4f4ce2f0325173581a3bc586ce85fbd95e 7586d328e1f546f1981aa5407fb7a6e49620d92c16e1700e168cd849657126d6 a223a7bcfabe088ac7f4fcd0dc60e1d165a9b80bc9856605b8ccb462c5624176 eb0708e98951ffb59f53f1ed75fe61e5c0eb575b137df1c306ad2740bbb3a546 974b5b406f8527cf700cfdf6c0534fcf25c5c8984a667b2de0e54f554efdde8f bc3111d8f47e58f3f34cbedebe674396a7ffdacfe9d56914ad85e47a73678c4c ac80d47a259c7a29501347b22e42797c5eb01e00cbb9d4fc3c53fd03d3052109 b3d885db997c4a9345bd1408fb704e9626d37fc33cf285d4ad40c71302db5d36 a49ab843f35fbdab76d753ebdc5d7fe647551dcb46028a9a88baae09ebadf513 ceba08406120f060ca1ae4f6d51cb85a5378551f60780a89451b533a2c7f8fd2 64c186792711b23f0b533c318e2c2059d8ebda58fd719d80782159e57c97168b a39e365203cb9a845c08515414350a4deb31de78f79bc5b8c93dd8fbe10d2ae6 8de3d59828f21f8ee1544008177bfe4af1943472f4ce702a9c8ff0d1967618a7 b4e587a83fb93dea285b7f6bc9bd0d077863e160de9ed4925647c670edfc4ff0 8def0386ddbdcf03bd339cf450c1d5f1f1a4b6fdd800828675383aee1e408eba 97cad0414485c09aaf557266f56276d7bb78dcbf8d8cbcc18e777f66f8daef89 ee368150df415c2d3ac1ebff5dcade3f2751f64b018ffc6c083bb69b3d9a7718 30df88f4215a8c02665c63ef9f93e8f74b011e97bea7b2b7072334237402de5f 729eb64757f2cf1b4120b230f4d93f8bfe1f5b0113280080e3e2000000004945 4e44ae426082}}{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\ri-20\s29\itap0{\s29\f0\fs16\lang2052{\*\listtag0}\abinodiroverride\ltrch bin\uc1\u8211\'96func}{\s29\f0\fs16\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\itap0 \sect\sectd\sbknone\colsx360\margtsxn99\margbsxn0\marglsxn80\margrsxn80\pgncont\ltrsect \pard\plain\ltrpar\ql\itap0{\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2514\ri-20\s29\itap0{\s29\f0\fs16\lang2052{\*\listtag0}\abinodiroverride\ltrch reduce()}{\s29\f0\fs16\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\ri-20\s29\itap0{\s29\f0\fs16\lang2052{\*\listtag0}\abinodiroverride\ltrch bin\uc1\u8211\'96func}{\s29\f0\fs16\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qc\li6829\ri4265\s29\itap0{\s29\f0\fs16\b\lang2052{\*\listtag0}\abinodiroverride\ltrch res}{\s29\f0\fs16\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2414\ri-20\s29\itap0{\s29\f0\fs14\lang2052{\*\listtag0}\abinodiroverride\ltrch (a) The value of this result is bin\uc1\u8211\'96func(seq[0], seq[1])}{\s29\f0\fs14\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2414\ri-20\s29\itap0{\s29\f0\fs14\lang2052{\*\listtag0}\abinodiroverride\ltrch (b) The value of this result is bin\uc1\u8211\'96func(bin_func(seq[0], seq[1]), seq[2]), etc.}{\s29\f0\fs14\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2394\ri-20\s29\itap0{\s29\f0\fs18\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Figure 11\uc1\u8211\'964 }{\s29\f0\fs18\lang2052{\*\listtag0}How the reduce() built-in function works}{\s29\f0\fs18\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> }{\s29\f0\fs18\b\lang2052{\*\listtag0}for }{\s29\f0\fs18\lang2052{\*\listtag0}eachNum }{\s29\f0\fs18\b\lang2052{\*\listtag0}in }{\s29\f0\fs18\lang2052{\*\listtag0}allNums:}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0\tx3120{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch ...\tab total = mySum(total, eachNum)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch ...}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri5388\s29\sl264\slmult1\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> }{\s29\f0\fs18\b\lang2052{\*\listtag0}print }{\s29\f0\fs18\lang2052{\*\listtag0}'the total is:', total the total is: 10}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Using }{\s29\f0\fs20\b\lang2052{\*\listtag0}lambda }{\s29\f0\fs22\lang2052{\*\listtag0}and }{\s29\f0\fs20\lang2052{\*\listtag0}reduce()}{\s29\f0\fs22\lang2052{\*\listtag0}, we can do the same thing on a single line:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> }{\s29\f0\fs18\b\lang2052{\*\listtag0}print }{\s29\f0\fs18\lang2052{\*\listtag0}'the total is:', reduce((}{\s29\f0\fs18\b\lang2052{\*\listtag0}lambda }{\s29\f0\fs18\lang2052{\*\listtag0}x,y: x+y), range(5))}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch the total is: 10}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li1743\ri2461\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The }{\s29\f0\fs20\lang2052{\*\listtag0}reduce() }{\s29\f0\fs22\lang2052{\*\listtag0}function performs the following mathematical operations given the input above:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch ((((0 + 1) + 2) + 3) + 4) \'de 10}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2637\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch It takes the first two elements of the list (0 and 1), calls }{\s29\f0\fs20\lang2052{\*\listtag0}mySum() }{\s29\f0\fs22\lang2052{\*\listtag0}to get 1, then calls }{\s29\f0\fs20\lang2052{\*\listtag0}mySum() }{\s29\f0\fs22\lang2052{\*\listtag0}again with that result and the next item 2, gets the result from that, pairs it with the next item 3 and calls }{\s29\f0\fs20\lang2052{\*\listtag0}mySum()}{\s29\f0\fs22\lang2052{\*\listtag0}, and finally takes the entire subtotal and calls }{\s29\f0\fs20\lang2052{\*\listtag0}mySum() }{\s29\f0\fs22\lang2052{\*\listtag0}with 4 to obtain 10, which is the final return value.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch 11.7.3 Partial Function Application}{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1678\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The notion of }{\s29\f0\fs22\i\lang2052{\*\listtag0}currying }{\s29\f0\fs22\lang2052{\*\listtag0}combines the concepts of functional programming and default and variable arguments together. A function taking N arguments that is \uc1\u8220\'93curried\uc1\u8221\'94 embalms the first argument as a fixed parameter and returns another function object taking (the remaining) N-1 arguments, akin to the actions of the LISP primitive functions }{\s29\f0\fs20\lang2052{\*\listtag0}car }{\s29\f0\fs22\lang2052{\*\listtag0}and }{\s29\f0\fs20\lang2052{\*\listtag0}cdr}{\s29\f0\fs22\lang2052{\*\listtag0}, respectively. Currying can be generalized into }{\s29\f0\fs22\i\lang2052{\*\listtag0}partial function application }{\s29\f0\fs22\lang2052{\*\listtag0}(PFA), in which any number (and order) of arguments is parlayed into another function object with the remainder of the arguments to be supplied later.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch In a way, this seems similar to default arguments where if arguments are not provided, they take on a \uc1\u8220\'93default\uc1\u8221\'94 value. In the case of PFAs, the argu- ments do not have a default value for all calls to a function, only to a specific set of calls. You can have multiple partial function calls, each of which may pass in different arguments to the function, hence the reason why default arguments cannot be used.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li2704\ri1514\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch This feature was introduced in Python 2.5 and made available to users via the }{\s29\f0\fs20\lang2052{\*\listtag0}functools }{\s29\f0\fs22\lang2052{\*\listtag0}module.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs28\lang2052{\*\listtag0}\abinodiroverride\ltrch Simple Functional Example}{\s29\f0\fs28\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1679\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch How about creating a simple little example? Let us take two simple functions }{\s29\f0\fs20\lang2052{\*\listtag0}add() }{\s29\f0\fs22\lang2052{\*\listtag0}and }{\s29\f0\fs20\lang2052{\*\listtag0}mul()}{\s29\f0\fs22\lang2052{\*\listtag0}, both found in the }{\s29\f0\fs20\lang2052{\*\listtag0}operator }{\s29\f0\fs22\lang2052{\*\listtag0}module. These are just func- tional interfaces to the }{\s29\f0\fs20\lang2052{\*\listtag0}+ }{\s29\f0\fs22\lang2052{\*\listtag0}and }{\s29\f0\fs20\lang2052{\*\listtag0}* }{\s29\f0\fs22\lang2052{\*\listtag0}operators that we are already familiar with, e.g., }{\s29\f0\fs20\lang2052{\*\listtag0}add(x, y) }{\s29\f0\fs22\lang2052{\*\listtag0}is the same as }{\s29\f0\fs20\lang2052{\*\listtag0}x + y}{\s29\f0\fs22\lang2052{\*\listtag0}. Say that we wanted to add one to a num- ber or multiply another by 100 quite often in our applications.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1676\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Rather than having multiple calls like }{\s29\f0\fs20\lang2052{\*\listtag0}add(1, foo), add(1, bar), mul(100, foo), mul(100, bar)}{\s29\f0\fs22\lang2052{\*\listtag0}, would it not be nice to just have existing functions that simplify the function call, i.e., }{\s29\f0\fs20\lang2052{\*\listtag0}add1(foo), add1(bar), mul100(foo), mul100(bar)}{\s29\f0\fs22\lang2052{\*\listtag0}, but without having to write functions }{\s29\f0\fs20\lang2052{\*\listtag0}add1() }{\s29\f0\fs22\lang2052{\*\listtag0}and }{\s29\f0\fs20\lang2052{\*\listtag0}mul100()}{\s29\f0\fs22\lang2052{\*\listtag0}? Well, now you can with PFAs. You can create a PFA}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch by using the }{\s29\f0\fs20\lang2052{\*\listtag0}partial() }{\s29\f0\fs22\lang2052{\*\listtag0}function found in the functional module:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> }{\s29\f0\fs18\b\lang2052{\*\listtag0}from }{\s29\f0\fs18\lang2052{\*\listtag0}operator }{\s29\f0\fs18\b\lang2052{\*\listtag0}import }{\s29\f0\fs18\lang2052{\*\listtag0}add, mul}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> }{\s29\f0\fs18\b\lang2052{\*\listtag0}from }{\s29\f0\fs18\lang2052{\*\listtag0}functools }{\s29\f0\fs18\b\lang2052{\*\listtag0}import }{\s29\f0\fs18\lang2052{\*\listtag0}partial}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0\tx6660{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> add1 = partial(add, 1)\tab # add1(x) == add(1, x)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> mul100 = partial(mul, 100) # mul100(x) == mul(100, x)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>>}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> add1(10)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch 11}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> add1(1)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch 2}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> mul100(10)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch 1000}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> mul100(500)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch 50000}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi345\li1743\ri2643\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch This example may or may not open your eyes to the power of PFAs, but we have to start somewhere. PFAs are best used when calling functions that take many parameters. It is also easier to use PFAs with keyword arguments, because specific arguments can be given explicitly, either as curried argu- ments, or those more \uc1\u8220\'93variable\uc1\u8221\'94 that are passed in at runtime, and we do not have to worry about ordering. Below is an example from the Python docu- mentation for use in applications where binary data (as strings) need to be converted to integers fairly often:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> baseTwo = partial(int, base=2)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> baseTwo.__doc__ = 'Convert base 2 string to an int.'}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> baseTwo('10010')}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch 18}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2636\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch This example uses the }{\s29\f0\fs20\lang2052{\*\listtag0}int() }{\s29\f0\fs22\lang2052{\*\listtag0}built-in function and fixes the base to 2 spe- cifically for binary string conversion. Now instead of multiple calls to }{\s29\f0\fs20\lang2052{\*\listtag0}int() }{\s29\f0\fs22\lang2052{\*\listtag0}all with the same second parameter (of 2), e.g., }{\s29\f0\fs20\lang2052{\*\listtag0}int('10010', 2)}{\s29\f0\fs22\lang2052{\*\listtag0}, we can simply use our new }{\s29\f0\fs20\lang2052{\*\listtag0}baseTwo() }{\s29\f0\fs22\lang2052{\*\listtag0}function with a single argument. Good style}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2643\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch is also followed because it adds a documentation string to the \uc1\u8220\'93new (partial) function,\uc1\u8221\'94 and it is also another good use of \uc1\u8220\'93function attributes\uc1\u8221\'94 (see Sec- tion 11.3.4 above). One important thing to note is that the keyword argument }{\s29\f0\fs20\lang2052{\*\listtag0}base }{\s29\f0\fs22\lang2052{\*\listtag0}is required here.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs28\lang2052{\*\listtag0}\abinodiroverride\ltrch Be Wary of Keywords}{\s29\f0\fs28\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2636\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch If you create the partial function without the }{\s29\f0\fs20\lang2052{\*\listtag0}base }{\s29\f0\fs22\lang2052{\*\listtag0}keyword, e.g., }{\s29\f0\fs20\lang2052{\*\listtag0}baseTwo- BAD = partial(int, 2)}{\s29\f0\fs22\lang2052{\*\listtag0}, it would pass the arguments to }{\s29\f0\fs20\lang2052{\*\listtag0}int() }{\s29\f0\fs22\lang2052{\*\listtag0}in the wrong order because the fixed arguments are always placed to the left of the runtime arguments, meaning that }{\s29\f0\fs20\lang2052{\*\listtag0}baseTwoBAD(x) == int(2, x)}{\s29\f0\fs22\lang2052{\*\listtag0}. If you call it, it would pass in 2 as the number to convert and the base as }{\s29\f0\fs20\lang2052{\*\listtag0}'10010'}{\s29\f0\fs22\lang2052{\*\listtag0}, resulting in an exception:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> baseTwoBAD = partial(int, 2)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> baseTwoBAD('10010')}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi-227\li2452\ri4798\s29\sl264\slmult1\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch Traceback (most recent call last): File "", line 1, in }{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch TypeError: an integer is required}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch With the keyword in place, the order is preserved properly since, as you know, keyword arguments always come after the formal arguments, so }{\s29\f0\fs20\lang2052{\*\listtag0}baseTwo(x) == int(x, base=2)}{\s29\f0\fs22\lang2052{\*\listtag0}.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs28\lang2052{\*\listtag0}\abinodiroverride\ltrch Simple GUI Class Example}{\s29\f0\fs28\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch PFAs also extended to all callables like classes and methods. An excellent example of using PFAs is in providing \uc1\u8220\'93partial-GUI templating.\uc1\u8221\'94 GUI wid- gets often have many parameters, such as text, length, maximum size, back- ground and foreground colors, both active and otherwise, etc. If we wanted}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch to \uc1\u8220\'93fix\uc1\u8221\'94 some of those arguments, such as making all text labels be in white letters on a blue background, you can customize it exactly that way into a pseudo template for similar objects.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2783\ri-20\s29\itap0{\s29\f0\fs24\lang2052{\*\listtag0}\abinodiroverride\ltrch Example 11.6 Partial Function Application GUI (pfaGUI.py)}{\s29\f0\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2783\ri-20\s29\itap0{\s29\f0\fs22\i\lang2052{\*\listtag0}\abinodiroverride\ltrch This a more useful example of partial function application, or more accurately,}{\s29\f0\fs22\i\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2783\ri-20\s29\itap0{\s29\f0\fs22\i\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8220\'93partial class instantiation\uc1\u8221\'94 in this case . . . why?}{\s29\f0\fs22\i\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx3500{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 1\tab #!/usr/bin/env python}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 2}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx3500{\shp{\*\shpinst\shpz0\shpbxmargin\shpbypara\shpwr2\shpwrk0\shpfblwtxt0\shpleft0\shptop0\shpbottom640\shpright2640\shplid263199958{\sp{\sn shapeType}{\sv 202}}{\sp{\sn dxTextLeft}{\sv 27305}}{\sp{\sn dxTextRight}{\sv 27305}}{\sp{\sn dxTextTop}{\sv 27305}}{\sp{\sn dxTextBottom}{\sv 27305}}{\shptxt{\*\abitableprops table-line-thickness:0.8pt; table-col-spacing:0.03in; table-column-leftpos:0.0000in; table-column-props:0.1597in/0.6319in/1.0417in/0.1597in/0.6319in/1.0417in/0.1597in/0.6319in/1.0417in/; table-sdh:4b8bd10}\par{\*\abicellprops left-attach:0; right-attach:1; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}{ \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx251\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx1161\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx2661 \pard\plain\ltrpar\ql\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li130\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx251\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx1161\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx2661 \pard\plain\ltrpar\ql\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx251\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx1161\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx2661 \pard\plain\ltrpar\ql\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li130\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-58\s29\intbl\itap1\cell{\*\abiendcell}\row}{\*\abiendtable} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0}}}\par \pard\plain\ltrpar\ql\itap0{\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 3\tab }{\f0\fs20\b\lang2052{\*\listtag0}from }{\f0\fs20\lang2052{\*\listtag0}functools }{\f0\fs20\b\lang2052{\*\listtag0}import }{\f0\fs20\lang2052{\*\listtag0}partial}{\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx3500{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 7\tab MyButton = partial(Tkinter.Button, root,}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx3980{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 8\tab fg='white', bg='blue')}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx3500{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 9\tab b1 = MyButton(text='Button 1')}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 10 b2 = MyButton(text='Button 2')}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 11 qb = MyButton(text='QUIT', bg='red',}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0\tx3980{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 12\tab command=root.quit)}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 13 b1.pack()}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 14 b2.pack()}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 15 qb.pack(fill=Tkinter.X, expand=True)}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 16 root.title('PFAs!')}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3143\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 17 root.mainloop()}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch In lines 7\uc1\u8211\'968, we create the \uc1\u8220\'93partial class instantiator\uc1\u8221\'94 (because that is what}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1677\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch it is instead of a partial function) for }{\s29\f0\fs20\lang2052{\*\listtag0}Tkinter.Button}{\s29\f0\fs22\lang2052{\*\listtag0}, fixing the parent win- dow argument root and both foreground and background colors. We create two buttons }{\s29\f0\fs20\lang2052{\*\listtag0}b1 }{\s29\f0\fs22\lang2052{\*\listtag0}and }{\s29\f0\fs20\lang2052{\*\listtag0}b2 }{\s29\f0\fs22\lang2052{\*\listtag0}matching this template providing only the text label as unique to each. The quit button (lines 11\uc1\u8211\'9612) is slightly more customized, taking on a different background color (red, which overrides the blue default) and installing a callback to close the window when it is pressed. (The other two buttons have no function when they are pressed.)}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Without the }{\s29\f0\fs20\lang2052{\*\listtag0}MyButton }{\s29\f0\fs22\lang2052{\*\listtag0}\uc1\u8220\'93template,\uc1\u8221\'94 you would have to use the \uc1\u8220\'93full\uc1\u8221\'94 syntax}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch each time (because you are still not giving all the arguments as there are}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch plenty of parameters you are not passing that have default values):}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2074\ri3026\sb80\s29\sl264\slmult1\itap0{\s29\f0\fs16\lang2052{\*\listtag0}\abinodiroverride\ltrch b1 = Tkinter.Button(root, fg='white', bg='blue', text='Button 1') b2 = Tkinter.Button(root, fg='white', bg='blue', text='Button 2') qb = Tkinter.Button(root, fg='white', text='QUIT', bg='red',}{\s29\f0\fs16\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs16\lang2052{\*\listtag0}\abinodiroverride\ltrch command=root.quit)}{\s29\f0\fs16\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2133\ri-20\sb60\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Here is a snapshot of what this simple GUI looks like:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li4574\ri-20\s29\itap0{\*\shppict{\pict\pngblip\picw65\pich87\picwgoal1300\picscalex99\pichgoal1739\picscaley99 \bliptag10017{\*\blipuid 00000000000000000000000000002721} 89504e470d0a1a0a0000000d49484452000000410000005708030000006ca6d8 f100000300504c5445a3a3a37676766c6c6c9f9f9f5858588e8e8e8787875b5b 5ba0a0a06969697171719d9d9d5757579191918383835d5d5da1a1a167676775 75759b9b9b9393938080805f5f5f6464647878789999999797977c7c7c616161 636363afafaf686868c2c2c27d7d7d868686bebebe666666abababa2a2a2c3c3 c37979798a8a8abcbcbc6565659e9e9e8f8f8fb9b9b9b3b3b36f6f6fb6b6b6ba babac0c0c0b5b5b5bdbdbdc1c1c1b8b8b8bfbfbfb7b7b7bbbbbbb0b0b0b2b2b2 aeaeaeb1b1b15959590808080303032020202222222727270000001b1b1b2323 23242424121212a6a6a69595958b8b8b929292888888969696050505ccccccd1 d1d16e6e6e7b7b7bcdcdcdd6d6d6d5d5d5d3d3d35c5c5ca7a7a7c6c6c6303030 3f3f3f4343430d0d0d8c8c8c2b2b2b333333c5c5c5282828c8c8c8c7c7c74040 401e1e1e5353535151515555552f2f2f343434414141565656090909dadada3a 3a3ad0d0d07e7e7ea9a9a9cecece6b6b6b5454548585850606063232320f0f0f 8d8d8d4d4d4d040404d7d7d70b0b0b363636a8a8a8131313d2d2d29090902c2c 2c1c1c1c1919191f1f1f4b4b4b0707075e5e5e3e3e3e181818cfcfcf46464670 7070c9c9c93c3c3c494949141414e1e1e17474746d6d6d7f7f7fadadadd9d9d9 acacac3838382a2a2a818181737373010101101010cbcbcb1a1a1a989898caca ca2626267777779a9a9aa5a5a5aaaaaadddddddedededbdbdbdfdfdfd8d8d89c 9c9c444444474747484848e0e0e0898989fffffffdfdfd373737454545fcfcfc 606060efefefeaeaeaedededeeeeeef3f3f3f1f1f1828282fefefe4e4e4ef7f7 f7e3e3e34c4c4cf8f8f84f4f4f505050e5e5e5e7e7e7e2e2e2ebebeb3b3b3be6 e6e6f2f2f2ececec2e2e2ef6f6f6e9e9e9f0f0f0fafafadcdcdcf9f9f9000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 00000000000000000016c5022500000d4c49444154789c9d57ff43134996af10 bee40bc418124c04034924dd847c21242480046ee2f4ad27a807a22201869515 4622384874605d3c8e39f0849135409f1a974cb873d88da823861e6a93dd1bc7 635dc7d5dd9ddbfb3273f7cf5c557f49c2ecfc7077afbbeabd575dfde957559f 7a950020ca11e7e6e51748a432796191628f72afaab850ad2951eed3ea0af797 9629cb4af717eab4fb94251a7561b16aaf728fa2a8502e934a0af2f372c53922 004407f4e51506a3e960a5594a9055966abd358750d9ecfb1cba1a42a676ee73 aa65448dceb1cf6e531139567db5a58a24a4e6ca8326a3a1a25c7f400472f4b5 2e775d9dd3e3b5bbdc260bd6f5ee7a8bd3d580daeb1b1b3c0d8dc8af6df0382d 587b9136b95df6068f1bebda4339405cee7137391c0ebddea7d737b991380ef9 b0e36b76389d4e37baecb5b5f65a6703aaed0d6e67ad17b7a2e2f6d63a3de562 d0e2713afee29d77def1fbfd87dfa5ca095729f5973ff01ff61f3ef257d4d106 dcd72b6e6dab3a56af6fcdab3a6eb59bd495260ce074dbcd27dc6e570bc837d6 35fd354551ed4445c7497f09e1eaa474a74e9fe9eaea3a4b75b33d033d546fdf 7bd27eea87bde7640335d48fbabddef38301e7e010e5b018f3419ea1eed0fb17 286a78c01414755ea8400836fdc59173a3ed9710829b45f8a07decf2077954ff f87953e0fd500f3978a5e75c5f7d0021980c7920b7c2ad3f726a08415cf5377e 388111f2bc0ae364d5f94be9187eac6fbcf693294aebf00d5cff9be91c4afeb7 331ffddde5d95ecae1aec80572a94befaf18384c9dcd55131f0689fa4e6a4e7f e3dc3536063c0feec11eeac80ffeded746dd9c1f1d1ba28e2d50e0dd8f6f59eb 028b3f75bba4722033dbf57ed7ed7787c3332e42cac660735497ef5d5ac6086e 8410b8f8c1323160aaa2aaae0e5a7f7a7985fe87923be03d8a24eed6d9ed6619 90567a7dfef69cbd57286a64e0c3093c9336e7bda525ed323b0a3411818b1fd7 3a9d755554c4441ca4ee2fff6c88baa1707ce0bf2a1a727857a54072d0a53fdc 3133e739405151511023ccf98efcf093687b108f02410c8cbc8711daa8988928 a724dec1de8fd7fef1c63f4996d13cb80e4a4081c9a9f7e7184e3d68fd31f569 4b2e4658ff793d92ae023c0a8e3d1c85308bd08d8adddde4f6b2a6a900f1c1e2 a07e216d6929bf815871102384f7b42029fb04318a7d9d7f5b80c9003add751c 1fdce4d281eaea033571d5d2c346bb5226dd578d64df495133ff1ef775ce71bb d3c120a30ef361c0e975118487f054a0aaceedb563877061bf016d01bbd36b77 db1b9cc8f43aed0d0dc8e7b41b69af73201788afbbd4f56250af7637b77ae41b 75ea06df09577177a3dabebaeed23d6a54d73ed2b9d657ed6acb47c59efd7aa7 ba6e43ee696d76a8eb81d8a5765d1703b254758f5c92913922a46b908edfc55a 8bf449f2e49a3647bb86f4dd788e565643de439ac45a25427a09e95212949df1 3d56de5e064f0e393f537604369ef8ec63922ea2fb69a5655372da75e5e915d7 69c9a6a5f26937d12519b3fb9e6c043a249f390f3d01cbb7958f7d67ca80384e 14591f3eb4aecb9fad5b75acd6891f16235d8cfc6239d23ab1ee9975dd5aacb3 ae3f93afb39d59ad13ab5d71941fc61f4d7692e8ea24495228b8c24d9d9dac95 ae798bab48d270563ad60262e2e6c9c4e8ff45fa847b74e8a6e8a318b04d3914 f416b3c5df5bbcc1995b5b1943e8c33fc657785e7bc20682d38f1434f7060fc0 64bdcb6461304cdae79098adf99acf834017736304f659381abd1c5da4b9fe7d d104939849d05c408c80198e0ed15b7c18613fb9ad03b2263d1703021d2e5656 ae8a6658bbafa4bb60e856f79e04fb7501805eb92c560d6df16de1f9bb8d3250 4ddc9fe4bf9ab805896df04b32b9488faeac8860ce880cca7a132b2b8bcce84a 6a6514bd73d93c0d7d33fc34a11864edd5404c3a3102fe0a4298fbc5306cabbb d363fdd5afff197e71eb39fcf2bae1c5e74f87d450f62f4757c25ba9827b509f 14c20acf933b6270f6eaea24cdcd50a204d6c65b7f231d7f71f10aa449284b8a a0e825545efc6d600a3e38090d8b0c937a8910326bb1347d16844033bf164cea 16dc749c7ff5d51916c100ef26b530fe12826baf0379302c83a15ed46b988d81 9b99f0bc6a35048e55213eb00b85e761eec8efe076fb8b1b002e18e05a0f09b5 0c043daf510c1764d0d08bde7a037d496145111fd4c7c0c4e6237e35310258a8 810ae2b9f69770410b776a97a0e236bcbff5da92072faca151a05e6ff04c0a8c 9bafb93301f62bdc0a7ecd53b96367a69f80e8688764e7ce7074eaed7074fbf7 f4de3ffc2c30b2fdf64df91f654328d0974f5abf4e13ce4ff6ef07a2fb873002 3b8cd44c3239b34233c995a1912d7a71244cf78e841323c9288dfcbe9151bc66 e1995e9a2737e6835304ca0657d979105ab7d2210a96e00b7686f5880fe36598 0f7c0cdc04338cb03318618764ed076617489a0f0a7a4bf8149355a7772693c6 cb6a67d87dc1f361f22b9aa617e8ef9385ddd6773bf9311f5a8d0ee3c8b56b3d 3d3db8fcaf85ebfcbed6d60a26a61df44834994c72055d51ce8c0a4dc94c6392 33b80a3917b59f4f80d6d017afde7ebfbc7afb2a637edfe3b7fffadcd00ac88d f3faa6e66c696a6e6ae2346b675ab37dd4e51032af021294b47f1431e61b79c9 672fc1c9c70d19df986d63ebb82c3e5bc2f2e177d733f2125dbbe4cf1aae671a 8ec4111f4a1eacf2398a5ffa30bec3bc1fe6979e4b49e936be63785ed65502c8 2b87840c93211593c568de66d29415305199bfdb44623e286881ba612469b430 fbbd0c1385cc1f4eef1594ab311f362bd308f4a5825f97bc1ce536c442cb4218 970ca9f13d74a1644f2ac5133bec3f89ce0b14c324cd0d3455027f3f7e676c18 efe6e4d732587eee1ebcb7d88708440fcd2492e89c6046effd69f6c523e1f8e1 6260f324374e94a3f250962bca377fddd954380bdb276ec371e642a345d21377 7e55bf1465b6166d4abf0296a4f8899e17a17d71f66aa5828b01239c1829c079 1265da0b57a032bc0137de3c27eefed65c043bcc3067089d38d74a60778a5f0e 2e5773f9811d2c42f8f2f1bfcd26a7d95c1d872747d6e0da4b28f90467fbb21c 364ff6de82be684a48196c7ee072143b0c94edd5ff9e8b63f89184cdf69fa05c 3dba2b578f56bf589d496713c40794a344f7f5dce9cfc6603bf20621fcf1e517 18a15a2d82e595b078fe3f10c2840c9f3849e237ef4667c242b6995f437992cd d5dc522384ffec7ab5491f7cdd6481c3ccc097b194e71bcdb3d75d7f2a7c88b3 7d68716b8680a7a79fb624787eb0b99a3d2f7846d3170a0b5abeeaeb9b186682 4c1f5d9048d005a389dc82e1a1eb4166e1d2028afb4db0a5a5801612317b5e70 67567a6802f3c31c1fc35b0231b96dc1a4370b9769f19985f3249db51f842ccf 08bf5998f48ec8ec07be53d89fe643f6afa5ccc1919dd9b3a264322e9babc55a 349334c35e7cc50816cdb5b12657d89a7b8c14c7876a62b56d7491935e5cad70 8ab5d826c1cdeac33d5b59617fc3c81c7afae6cd4f6f7222e86cfb53c1fa7457 0f6cfce4438b0ce83a1febf1bfe6ff97345f35e840707cf3f4f4f7cb69f6fe6e 53b66c3e1e0f025b1b21e93eda7d94956eb6b06ef7d18d0dce4056e609d709df 1be889d8976703b16715e663456999c3375b6537f0c69fc9819d8d1868b96a31 4742bc184206035b639b536c2bebf156ba6bc850da6b3cdd02acf141732ca689 61e16aac788b37324f054ba3c166243117b1826a4f9d39d32ffd66169c260394 86e2fc482a7f19f141ef320baf6b62c255aa12913bb188a834a65195eec44983 282e1289b4d9b06c0cdb5ec4875040b9f3dd9845eee75f0caa34dbdf3469b7bf 71dcfd7ca0fbcbb7af5ebd7d8ac3d764628d24f28c3a70a9abd1bcc37e3f263c d3841c509c0703a56db05ed50f5db26fef688fcfc1c1503edf43c30f2d9298fc af4ba0df4620040d3f38f68e4cc1061529815623748958843f8834db9010ed9a 271c43aa7f7f3f985c27d818d8f8351c421eb4c4d7ba5904158a0321a8220841 c5f5c9cc4428d12f9944fff51a953b59cb884a280f36aa3a94d03a094daa2a2e 86181b83b030fc302209c526e283765029c4c07f20d2067fae7a05bf3da180a7 540fa163eddb3baa58f62834e951d83456505e6732678786a5d3f6dfa71ae058 be560e977f35b66448c790bd5e783553f903e5a0c6512fcc640643db5ae17278 8a3a6d7693fd6869a8e98a41a3a8951b3283e006124a1cb7d480e2d280399bb4 dc5d1ad7c6e3a19d0852240244ecd2c44b77d25fe0ab48c2a628467cb02805d8 f400359aec2da2c9849ef9060e229212f8b06b43f07d34597b2a33f66c448c30 c5f36117d9b376d2aecf6bb22c61d1126d880f85b38d003544221a41901949fb ac16dc08df8a3b602f94507c5608e464602a9c4a2452c2c509a7135c7b2253b2 1a9175b96a470ea49eaea29dfefe495bfe719b62aa6d72ce783c4f315585f4b6 4d9157659c33564d296cdbc6b9c936acf36dac3e9e3fa768eb576cfb0252a02a 6f0c8d17e94e95363a221d53f2079df5fad86c95f93c59f148316b3c1a200347 8db38a4715e47973d56c4c5fdff9403ed5117134969ed2158d871acb5500a8a4 f24bfd932dd6f29ae2a02d5620ae5ed3058f85f688cb44fb83ad6489b8846c0d ee179589f7848e05756bd5e282982d585c536e6d99ecbf2497aac0ff0082f377 fa6e2d02870000000049454e44ae426082}}{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi389\li1743\ri2643\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Why bother with so much repetition when your code can be more com- pact and easy to read? You can find out more about GUI programming in Chapter 18 (Section 18.3.5), where we feature a longer example of using PFAs. From what you have seen so far, you can see that PFA takes on the flavors}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2639\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch of templating and \uc1\u8220\'93style-sheeting\uc1\u8221\'94 in terms of providing defaults in a more functional programming environment. You can read more about them in the documentation for the }{\s29\f0\fs20\lang2052{\*\listtag0}functools }{\s29\f0\fs22\lang2052{\*\listtag0}module documentation found in the Python Library Reference, the \uc1\u8220\'93What\uc1\u8217\'92s New in Python 2.5\uc1\u8221\'94 document, and the specifying PEP 309.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs36\b\lang2052{\*\listtag0}\abinodiroverride\ltrch 11.8 Variable Scope}{\s29\f0\fs36\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2642\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The }{\s29\f0\fs22\i\lang2052{\*\listtag0}scope }{\s29\f0\fs22\lang2052{\*\listtag0}of an identifier is defined to be the portion of the program where its declaration applies, or what we refer to as \uc1\u8220\'93variable visibility.\uc1\u8221\'94 In other words, it is like asking yourself in which parts of a program do you have access to a specific identifier. Variables either have local or global scope.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch 11.8.1 Global versus Local Variables}{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2638\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Variables defined within a function have }{\s29\f0\fs22\i\lang2052{\*\listtag0}local }{\s29\f0\fs22\lang2052{\*\listtag0}scope, and those at the highest level in a module have }{\s29\f0\fs22\i\lang2052{\*\listtag0}global }{\s29\f0\fs22\lang2052{\*\listtag0}scope. In their famous \uc1\u8220\'93dragon\uc1\u8221\'94 book on compiler theory, Aho, Sethi, and Ullman summarize it this way:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch \uc1\u8220\'93The portion of the program to which a declaration applies is called the }{\s29\f0\fs22\i\lang2052{\*\listtag0}scope }{\s29\f0\fs22\lang2052{\*\listtag0}of that declaration. An occurrence of a name in a procedure is said to be }{\s29\f0\fs22\i\lang2052{\*\listtag0}local }{\s29\f0\fs22\lang2052{\*\listtag0}to the procedure if it is in the scope of a declaration within the pro- cedure; otherwise, the occurrence is said to be }{\s29\f0\fs22\i\lang2052{\*\listtag0}nonlocal}{\s29\f0\fs22\lang2052{\*\listtag0}.\uc1\u8221\'94}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch One characteristic of global variables is that unless deleted, they have a lifespan that lasts as long as the script that is running and whose values are accessible to all functions, whereas local variables, like the stack frame they reside in, live temporarily, only as long as the functions they are defined in are currently active. When a function call is made, its local variables come into scope as they are declared. At that time, a new local name is created for that object, and once that function has completed and the frame deallocated, that variable will go out of scope.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch global_str = 'foo'}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}foo():}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3640\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch local_str = 'bar'}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3640\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch return }{\s29\f0\fs18\lang2052{\*\listtag0}global_str + local_str}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch In the above example, }{\s29\f0\fs20\lang2052{\*\listtag0}global_str }{\s29\f0\fs22\lang2052{\*\listtag0}is a global variable while }{\s29\f0\fs20\lang2052{\*\listtag0}local_str }{\s29\f0\fs22\lang2052{\*\listtag0}is}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch a local variable. The }{\s29\f0\fs20\lang2052{\*\listtag0}foo() }{\s29\f0\fs22\lang2052{\*\listtag0}function has access to both global and local vari-}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch ables while the main block of code has access only to global variables.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3087\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch CORE NOTE: Searching for identifiers (aka variables, names, etc.)}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li3087\ri2326\s29\itap0{\s29\f0\fs22\i\lang2052{\*\listtag0}\abinodiroverride\ltrch When searching for an identifier, Python searches the local scope first. If the name is not found within the local scope, then an identifier must be found in the global scope or else a }{\s29\f0\fs20\lang2052{\*\listtag0}NameError }{\s29\f0\fs22\i\lang2052{\*\listtag0}exception is raised.}{\s29\f0\fs22\i\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3087\ri1947\sb40\s29\itap0{\s29\f0\fs22\i\lang2052{\*\listtag0}\abinodiroverride\ltrch A variable\uc1\u8217\'92s scope is related to the }{\s29\f0\fs22\lang2052{\*\listtag0}namespace }{\s29\f0\fs22\i\lang2052{\*\listtag0}in which it resides. We will cover namespaces formally in Chapter 12; suffice it to say for now that namespaces are just naming domains that map names to objects, a virtual set of what variable names are currently in use, if you will.The concept}{\s29\f0\fs22\i\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3087\ri1948\s29\itap0{\s29\f0\fs22\i\lang2052{\*\listtag0}\abinodiroverride\ltrch of scope relates to the namespace search order that is used to find a variable. All names in the local namespace are within the local scope when}{\s29\f0\fs22\i\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qr\li2909\ri2128\s29\itap0{\s29\f0\fs22\i\lang2052{\*\listtag0}\abinodiroverride\ltrch a function is executing.That is the first namespace searched when looking for a variable. If it is not found there, then perhaps a globally scoped variable with that name can be found.These variables are stored (and searched) in}{\s29\f0\fs22\i\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3087\ri-20\s29\itap0{\s29\f0\fs22\i\lang2052{\*\listtag0}\abinodiroverride\ltrch the global and built-in namespaces.}{\s29\f0\fs22\i\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3087\ri1974\sb60\s29\itap0{\s29\f0\fs22\i\lang2052{\*\listtag0}\abinodiroverride\ltrch It is possible to \uc1\u8220\'93hide\uc1\u8221\'94 or override a global variable just by creating a local one. Recall that the local namespace is searched first, being in its local scope. If the name is found, the search does not continue to search for}{\s29\f0\fs22\i\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3087\ri-20\s29\itap0{\s29\f0\fs22\i\lang2052{\*\listtag0}\abinodiroverride\ltrch a globally scoped variable, hence overriding any matching name in either}{\s29\f0\fs22\i\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3087\ri-20\s29\itap0{\s29\f0\fs22\i\lang2052{\*\listtag0}\abinodiroverride\ltrch the global or built-in namespaces.}{\s29\f0\fs22\i\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Also, be careful when using local variables with the same names as global}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2636\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch variables. If you use such names in a function (to access the global value) before you assign the local value, you will get an exception (}{\s29\f0\fs20\lang2052{\*\listtag0}NameError }{\s29\f0\fs22\lang2052{\*\listtag0}or }{\s29\f0\fs20\lang2052{\*\listtag0}Unbound- LocalError}{\s29\f0\fs22\lang2052{\*\listtag0}), depending on which version of Python you are using.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} {\listtext\pard\fi-1125\li3108\ri-20 2. }\pard\plain{\ltrpar\ql\fi-1125\li3108\ri-20\s29{\*\abilist\abilistid1009\abilistparentid0\abilistlevel1\abistartat2{\abifieldfont Times New Roman}{\abilistdecimal .}{\abilistdelim %L.}{\abiliststyle Numbered List}}{\*\pn\pnql\pnstart2\pnlvlbody\pndec{\pntxtb }{\pntxta .}}\fn-1125\li3108\ls10\ilvl0\itap0\tx3108{\s29\f0\fs32\b\lang2052{\*\listtag0}\abinodiroverride\ltrch global }{\s29\f0\fs32\i\b\lang2052{\*\listtag0}Statement}{\s29\f1\fs24\lang2052{\*\listtag0}\par} }\pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs32\b\lang2052{\*\listtag0}\abinodiroverride\ltrch global\uc0\u22768 \uc0\u26126 }{\s29\f0\fs32\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2642\sb40\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Global variable names can be overridden by local variables if they are declared within the function. Here is another example, similar to the first, but the global and local nature of the variable are not as clear.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}foo():}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2707\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch print }{\s29\f0\fs18\lang2052{\*\listtag0}"\\ncalling foo()..."}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2707\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch bar = 200}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2707\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch print }{\s29\f0\fs18\lang2052{\*\listtag0}"in foo(), bar is", bar}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\sb40\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch bar = 100}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri5388\s29\sl264\slmult1\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch print }{\s29\f0\fs18\lang2052{\*\listtag0}"in __main__, bar is", bar foo()}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch print }{\s29\f0\fs18\lang2052{\*\listtag0}"\\nin __main__, bar is (still)", bar}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch It gave the following output:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch in __main__, bar is 100}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\sb60\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch calling foo()...}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch in foo(), bar is 200}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\sb60\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch in __main__, bar is (still) 100}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2637\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Our local }{\s29\f0\fs20\lang2052{\*\listtag0}bar }{\s29\f0\fs22\lang2052{\*\listtag0}pushed the global }{\s29\f0\fs20\lang2052{\*\listtag0}bar }{\s29\f0\fs22\lang2052{\*\listtag0}out of the local scope. To specifically reference a named global variable, one must use the }{\s29\f0\fs20\b\lang2052{\*\listtag0}global }{\s29\f0\fs22\lang2052{\*\listtag0}statement. The syntax for global is:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\sb20\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch global }{\s29\f0\fs18\i\lang2052{\*\listtag0}var1}{\s29\f0\fs18\lang2052{\*\listtag0}[, }{\s29\f0\fs18\i\lang2052{\*\listtag0}var2}{\s29\f0\fs18\lang2052{\*\listtag0}[, ... }{\s29\f0\fs18\i\lang2052{\*\listtag0}varN}{\s29\f0\fs18\lang2052{\*\listtag0}]]]}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri2445\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Modifying the example above, we can update our code so that we use the glo- bal version of }{\s29\f0\fs20\lang2052{\*\listtag0}is_this_global }{\s29\f0\fs22\lang2052{\*\listtag0}rather than create a new local variable.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> is_this_global = 'xyz'}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> }{\s29\f0\fs18\b\lang2052{\*\listtag0}def }{\s29\f0\fs18\lang2052{\*\listtag0}foo():}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0\tx3120{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch ...\tab }{\s29\f0\fs18\b\lang2052{\*\listtag0}global }{\s29\f0\fs18\lang2052{\*\listtag0}is_this_global}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0\tx3120{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch ...\tab this_is_local = 'abc'}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0\tx3120{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch ...\tab is_this_global = 'def'}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0\tx3120{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch ...\tab }{\s29\f0\fs18\b\lang2052{\*\listtag0}print }{\s29\f0\fs18\lang2052{\*\listtag0}this_is_local + is_this_global}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch ...}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> foo()}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch abcdef}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2223\ri6320\s29\sl264\slmult1\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> }{\s29\f0\fs18\b\lang2052{\*\listtag0}print }{\s29\f0\fs18\lang2052{\*\listtag0}is_this_global def}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} {\listtext\pard\fi-1125\li3108\ri-20 3. }\pard\plain{\ltrpar\ql\fi-1125\li3108\ri-20\s29{\*\abilist\abilistid1009\abilistparentid0\abilistlevel1\abistartat2{\abifieldfont Times New Roman}{\abilistdecimal .}{\abilistdelim %L.}{\abiliststyle Numbered List}}{\*\pn\pnql\pnstart2\pnlvlbody\pndec{\pntxtb }{\pntxta .}}\fn-1125\li3108\ls10\ilvl0\itap0\tx3108{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch Number of Scopes}{\s29\f1\fs24\lang2052{\*\listtag0}\par} }\pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Python syntactically supports multiple levels of functional nesting, and as of}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Python 2.1, matching statically nested scoping. However, in versions prior to}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch 2.1, a maximum of two scopes was imposed: a function\uc1\u8217\'92s local scope and the global scope. Even though more levels of functional nesting exist, you could not access more than two scopes:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}foo():}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3640\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch m = 3}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3640\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}bar():}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qc\li4090\ri6668\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch n = 4}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qc\li4080\ri5978\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch print }{\s29\f0\fs18\lang2052{\*\listtag0}m + n}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3640\ri6885\s29\sl264\slmult1\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch print }{\s29\f0\fs18\lang2052{\*\listtag0}m bar()}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Although this code executes perfectly fine today . . .}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> foo()}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch 3}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch 7}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch . . . executing it resulted in errors in Python before 2.1:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> foo()}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi-114\li3298\ri4771\s29\sl264\slmult1\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch Traceback (innermost last): File "", line 1, in ?}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi114\li3183\ri4621\s29\sl264\slmult1\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch File "", line 7, in foo File "", line 5, in bar NameError: m}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1676\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The access to }{\s29\f0\fs20\lang2052{\*\listtag0}foo()}{\s29\f0\fs22\lang2052{\*\listtag0}\uc1\u8217\'92s local variable }{\s29\f0\fs20\lang2052{\*\listtag0}m }{\s29\f0\fs22\lang2052{\*\listtag0}within function }{\s29\f0\fs20\lang2052{\*\listtag0}bar() }{\s29\f0\fs22\lang2052{\*\listtag0}is illegal because }{\s29\f0\fs20\lang2052{\*\listtag0}m }{\s29\f0\fs22\lang2052{\*\listtag0}is declared local to }{\s29\f0\fs20\lang2052{\*\listtag0}foo()}{\s29\f0\fs22\lang2052{\*\listtag0}. The only scopes accessible from }{\s29\f0\fs20\lang2052{\*\listtag0}bar() }{\s29\f0\fs22\lang2052{\*\listtag0}are }{\s29\f0\fs20\lang2052{\*\listtag0}bar()}{\s29\f0\fs22\lang2052{\*\listtag0}\uc1\u8217\'92s local scope and the global scope. }{\s29\f0\fs20\lang2052{\*\listtag0}foo()}{\s29\f0\fs22\lang2052{\*\listtag0}\uc1\u8217\'92s local scope is }{\s29\f0\fs22\i\lang2052{\*\listtag0}not }{\s29\f0\fs22\lang2052{\*\listtag0}included in that short list of two. Note that the output for the \uc1\u8220\'93}{\s29\f0\fs20\b\lang2052{\*\listtag0}print}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1678\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch m}{\s29\f0\fs22\lang2052{\*\listtag0}\uc1\u8221\'94 statement succeeded, and it is the function call to }{\s29\f0\fs20\lang2052{\*\listtag0}bar() }{\s29\f0\fs22\lang2052{\*\listtag0}that fails. For- tunately with Python\uc1\u8217\'92s current nested scoping rules, this is not a problem today.}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\abinodiroverride\ltrch 11.8.4 Closures}{\s29\f0\fs32\i\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1682\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch With Python\uc1\u8217\'92s statically nested scoping, it becomes useful to define inner functions as we have seen earlier. In the next section, we will focus on scope and }{\s29\f0\fs20\b\lang2052{\*\listtag0}lambda}{\s29\f0\fs22\lang2052{\*\listtag0}, but inner functions also suffered the same problem before Python 2.1 when the scoping rules changed to what they are today.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch If references are made from inside an inner function to an object defined in}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch any outer scope (but not in the global scope), the inner function then is known}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li1743\ri2639\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch as a }{\s29\f0\fs22\i\lang2052{\*\listtag0}closure}{\s29\f0\fs22\lang2052{\*\listtag0}. The variables defined in the outer function but used or referred to by the inner function are called }{\s29\f0\fs22\i\lang2052{\*\listtag0}free variables}{\s29\f0\fs22\lang2052{\*\listtag0}. Closures are an important con- cept in functional programming languages, with Scheme and Haskell being two of them. Closures are syntactically simple (as simple as inner functions) yet still very powerful.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2643\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch A closure combines an inner function\uc1\u8217\'92s own code and scope along with the scope of an outer function. Closure lexical variables do not belong to the glo- bal namespace scope or the local one\uc1\u8212\'97they belong to someone else\uc1\u8217\'92s namespace and carry an \uc1\u8220\'93on the road\uc1\u8221\'94 kind of scope. (Note that they differ from objects in that those variables live in an object\uc1\u8217\'92s namespace while closure variables live in a function\uc1\u8217\'92s namespace and scope.) So why would you want to use closures?}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2643\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Closures are useful for setting up calculations, hiding state, letting you move around function objects and scope at will. Closures come in handy in GUI or event-driven programming where a lot of APIs support callbacks. The same applies for retrieving database rows and processing the data in the exact same manner. Callbacks are just functions. Closures are functions, too, but they carry some additional scope with them. They are just functions with an extra feature . . . another scope.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2643\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch You will probably feel that the use of closures draws a strong parallel to partial function application as introduced earlier in this chapter, but PFA is really more like currying than the use of closures because it is not as much as about function calling as it is about using variables defined in another scope.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1984\ri-20\s29\itap0{\s29\f0\fs28\lang2052{\*\listtag0}\abinodiroverride\ltrch Simple Closure Example}{\s29\f0\fs28\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri2441\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Below is a short example of using closures. We will simulate a counter and also simulate making an integer mutable by enclosing it as a single element}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1743\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch of a list.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi-548\li2773\ri6320\s29\sl264\slmult1\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch def }{\s29\f0\fs18\lang2052{\*\listtag0}counter(start_at=0): count = [start_at] }{\s29\f0\fs18\b\lang2052{\*\listtag0}def }{\s29\f0\fs18\lang2052{\*\listtag0}incr():}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3240\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch count[0] += 1}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3240\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch return }{\s29\f0\fs18\lang2052{\*\listtag0}count[0]}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2786\ri-20\s29\itap0{\s29\f0\fs18\b\lang2052{\*\listtag0}\abinodiroverride\ltrch return }{\s29\f0\fs18\lang2052{\*\listtag0}incr}{\s29\f0\fs18\b\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li1743\ri2637\sb80\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The only thing }{\s29\f0\fs20\lang2052{\*\listtag0}counter() }{\s29\f0\fs22\lang2052{\*\listtag0}does is to accept an initial value to start counting at and assigns it as the sole member of the list count. Then an }{\s29\f0\fs20\lang2052{\*\listtag0}incr() }{\s29\f0\fs22\lang2052{\*\listtag0}inner func- tion is defined. By using the variable count inside it, we have created a closure because it now carries with it the scope of }{\s29\f0\fs20\lang2052{\*\listtag0}counter()}{\s29\f0\fs22\lang2052{\*\listtag0}. }{\s29\f0\fs20\lang2052{\*\listtag0}incr() }{\s29\f0\fs22\lang2052{\*\listtag0}increments the}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch running count and returns it. Then the final magic is that }{\s29\f0\fs20\lang2052{\*\listtag0}counter() }{\s29\f0\fs22\lang2052{\*\listtag0}returns}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch incr}{\s29\f0\fs22\lang2052{\*\listtag0}, a (callable) function object.}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch If we run this interactively, we get the output below\uc1\u8212\'97note how similar it}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch looks to instantiating a counter object and executing the instance:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> count = counter(5)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> }{\s29\f0\fs18\b\lang2052{\*\listtag0}print }{\s29\f0\fs18\lang2052{\*\listtag0}count()}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch 6}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> }{\s29\f0\fs18\b\lang2052{\*\listtag0}print }{\s29\f0\fs18\lang2052{\*\listtag0}count()}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch 7}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> count2 = counter(100)}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> }{\s29\f0\fs18\b\lang2052{\*\listtag0}print }{\s29\f0\fs18\lang2052{\*\listtag0}count2()}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch 101}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch >>> }{\s29\f0\fs18\b\lang2052{\*\listtag0}print }{\s29\f0\fs18\lang2052{\*\listtag0}count()}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch 8}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\fi240\li2704\ri1482\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The one difference is that we were able to do something that previously required us to write a class, and not only that, but to have to override the}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri1496\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch __call__() }{\s29\f0\fs22\lang2052{\*\listtag0}special method of that class to make its instances callable. Here we were able to do it with a pair of functions.}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\fi240\li2704\ri1683\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch Now, in many cases, a class is the right thing to use. Closures are more appropriate in cases whenever you need a callback that has to have its own scope, especially if it is something small and simple, and often, clever. As usual,}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2704\ri1507\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch if you use a closure, it is a good idea to comment your code and/or use doc strings to explain what you are doing.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs28\lang2052{\*\listtag0}\abinodiroverride\ltrch *Chasing Down Closure Lexical Variables}{\s29\f0\fs28\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\qj\li2704\ri1681\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch The next two sections contain material for advanced readers . . . feel free to skip it if you wish. We will discuss how you can track down free variables with a function\uc1\u8217\'92s }{\s29\f0\fs20\lang2052{\*\listtag0}func_closure }{\s29\f0\fs22\lang2052{\*\listtag0}attribute. Here is a code snippet that dem- onstrates it.}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2943\ri-20\s29\itap0{\s29\f0\fs22\lang2052{\*\listtag0}\abinodiroverride\ltrch If we run this piece of code, we get the following output:}{\s29\f0\fs22\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch no f1 closure vars}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch f2 closure vars: ['']}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch f3 closure vars: ['', '']}{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch }{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch }{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch }{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li3183\ri-20\s29\itap0{\s29\f0\fs18\lang2052{\*\listtag0}\abinodiroverride\ltrch }{\s29\f0\fs18\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1824\ri-20\s29\itap0{\s29\f0\fs24\lang2052{\*\listtag0}\abinodiroverride\ltrch Example 11.7 Tracking Closure Variables (closureVars.py)}{\s29\f0\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1824\ri-20\s29\itap0{\s29\f0\fs22\i\lang2052{\*\listtag0}\abinodiroverride\ltrch This example shows how we can track closure variables by using a function\uc1\u8217\'92s}{\s29\f0\fs22\i\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li1824\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch func_closure }{\s29\f0\fs22\i\lang2052{\*\listtag0}variable.}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\sb20\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx2540{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 1\tab #!/usr/bin/env python}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 2}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx2540{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 3\tab output = ''}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx2540{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 4\tab w = x = y = z = 1}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 5}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx2540{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 6\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}def }{\s29\f0\fs20\lang2052{\*\listtag0}f1():}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx2760{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 7\tab x = y = z = 2}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 8}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx3019{\s29\f0\fs20\lang2052{\*\listtag0}\abinodiroverride\ltrch 9\tab }{\s29\f0\fs20\b\lang2052{\*\listtag0}def }{\s29\f0\fs20\lang2052{\*\listtag0}f2():}{\s29\f0\fs20\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\li2184\ri-20\s29\itap0\tx3440{\shp{\*\shpinst\shpz0\shpbxmargin\shpbypara\shpwr2\shpwrk0\shpfblwtxt0\shpleft0\shptop0\shpbottom1595\shpright10620\shplid668528752{\sp{\sn shapeType}{\sv 202}}{\sp{\sn dxTextLeft}{\sv 27305}}{\sp{\sn dxTextRight}{\sv 27305}}{\sp{\sn dxTextTop}{\sv 27305}}{\sp{\sn dxTextBottom}{\sv 27305}}{\shptxt{\*\abitableprops table-line-thickness:0.8pt; table-col-spacing:0.03in; table-column-leftpos:0.0000in; table-column-props:1.8500in/0.6806in/0.5000in/0.5833in/0.1667in/0.5000in/0.5833in/2.5111in/1.8500in/0.6806in/0.5000in/0.5833in/0.1667in/0.5000in/0.5833in/2.5111in/1.8500in/0.6806in/0.5000in/0.5833in/0.1667in/0.5000in/0.5833in/2.5111in/1.8500in/0.6806in/0.5000in/0.5833in/0.1667in/0.5000in/0.5833in/2.5111in/1.8500in/0.6806in/0.5000in/0.5833in/0.1667in/0.5000in/0.5833in/2.5111in/1.8500in/0.6806in/0.5000in/0.5833in/0.1667in/0.5000in/0.5833in/2.5111in/1.8500in/0.6806in/0.5000in/0.5833in/0.1667in/0.5000in/0.5833in/2.5111in/1.8500in/0.6806in/0.5000in/0.5833in/0.1667in/0.5000in/0.5833in/2.5111in/; table-sdh:4b95ca0}\par{\*\abicellprops left-attach:0; right-attach:1; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}{ \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx2685\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3665\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx4385\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx5225\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx5465\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx6185\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx7025\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx10641 \pard\plain\ltrpar\ql\li1899\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:3; right-attach:4; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:4; right-attach:5; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:5; right-attach:6; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:6; right-attach:7; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:7; right-attach:8; top-attach:0; bot-attach:1; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx2685\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3665\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx4385\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx5225\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx5465\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx6185\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx7025\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx10641 \pard\plain\ltrpar\ql\li1899\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li560\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:3; right-attach:4; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:4; right-attach:5; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:5; right-attach:6; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:6; right-attach:7; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:7; right-attach:8; top-attach:1; bot-attach:2; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx2685\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3665\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx4385\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx5225\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx5465\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx6185\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx7025\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx10641 \pard\plain\ltrpar\ql\li1899\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:3; right-attach:4; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:4; right-attach:5; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:5; right-attach:6; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:6; right-attach:7; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:7; right-attach:8; top-attach:2; bot-attach:3; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:3; bot-attach:4; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx2685\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3665\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx4385\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx5225\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx5465\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx6185\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx7025\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx10641 \pard\plain\ltrpar\ql\li1899\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:3; bot-attach:4; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:3; bot-attach:4; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:3; right-attach:4; top-attach:3; bot-attach:4; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:4; right-attach:5; top-attach:3; bot-attach:4; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:5; right-attach:6; top-attach:3; bot-attach:4; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:6; right-attach:7; top-attach:3; bot-attach:4; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:7; right-attach:8; top-attach:3; bot-attach:4; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:4; bot-attach:5; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx2685\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3665\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx4385\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx5225\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx5465\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx6185\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx7025\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx10641 \pard\plain\ltrpar\ql\li1899\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:4; bot-attach:5; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:4; bot-attach:5; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:3; right-attach:4; top-attach:4; bot-attach:5; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:4; right-attach:5; top-attach:4; bot-attach:5; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:5; right-attach:6; top-attach:4; bot-attach:5; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:6; right-attach:7; top-attach:4; bot-attach:5; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:7; right-attach:8; top-attach:4; bot-attach:5; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:5; bot-attach:6; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx2685\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3665\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx4385\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx5225\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx5465\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx6185\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx7025\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx10641 \pard\plain\ltrpar\ql\li1899\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:5; bot-attach:6; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:5; bot-attach:6; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:3; right-attach:4; top-attach:5; bot-attach:6; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:4; right-attach:5; top-attach:5; bot-attach:6; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:5; right-attach:6; top-attach:5; bot-attach:6; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:6; right-attach:7; top-attach:5; bot-attach:6; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:7; right-attach:8; top-attach:5; bot-attach:6; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:6; bot-attach:7; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.250000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx2685\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3665\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx4385\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx5225\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx5465\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx6185\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx7025\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx10641 \pard\plain\ltrpar\ql\li1897\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:6; bot-attach:7; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:6; bot-attach:7; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:3; right-attach:4; top-attach:6; bot-attach:7; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:4; right-attach:5; top-attach:6; bot-attach:7; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:5; right-attach:6; top-attach:6; bot-attach:7; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:6; right-attach:7; top-attach:6; bot-attach:7; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:7; right-attach:8; top-attach:6; bot-attach:7; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\li60\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:0; right-attach:1; top-attach:7; bot-attach:8; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.250000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff}\row \trowd \itap1\trgaph10\trql\trrh0\trleft0\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx2685\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx3665\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx4385\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx5225\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx5465\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx6185\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx7025\clvertalt\cltxlrtb\clbrdrt\brdrs\brdrw0\brdrcf0 \clcbpat1\clbrdrl\brdrs\brdrw0\brdrcf0 \clbrdrb\brdrs\brdrw0\brdrcf0 \clbrdrr\brdrs\brdrw0\brdrcf0 \cellx10641 \pard\plain\ltrpar\ql\li1897\ri-20\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:1; right-attach:2; top-attach:7; bot-attach:8; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:2; right-attach:3; top-attach:7; bot-attach:8; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:3; right-attach:4; top-attach:7; bot-attach:8; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:4; right-attach:5; top-attach:7; bot-attach:8; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:5; right-attach:6; top-attach:7; bot-attach:8; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:6; right-attach:7; top-attach:7; bot-attach:8; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}{\*\abicellprops left-attach:7; right-attach:8; top-attach:7; bot-attach:8; color:000000; bot-color:000000; bot-style:1; bot-thickness:0.000000px; left-color:000000; left-style:1; left-thickness:0.000000px; right-color:000000; right-style:1; right-thickness:0.000000px; top-color:000000; top-style:1; top-thickness:0.000000pt; background-color:ffffff} \pard\plain\ltrpar\ql\s29\intbl\itap1\cell{\*\abiendcell}\row}{\*\abiendtable} \pard\plain\ltrpar\ql\s29\itap0{\s29\f1\fs24\lang2052{\*\listtag0}\par} \pard\plain\ltrpar\ql\s29\itap0}}}\par \pard\plain\ltrpar\ql\itap0{\f0\fs20