table of contentsashton/classes/429/byte-of-python.pdf · tutorial or guide to the python language...
TRANSCRIPT
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
1.10
1.11
1.12
1.13
1.14
1.15
1.16
1.17
1.18
1.19
1.20
1.21
1.22
1.23
1.24
1.25
TableofContentsIntroduction
Dedication
Preface
AboutPython
Installation
FirstSteps
Basics
OperatorsandExpressions
Controlflow
Functions
Modules
DataStructures
ProblemSolving
ObjectOrientedProgramming
InputandOutput
Exceptions
StandardLibrary
More
WhatNext
Appendix:FLOSS
Appendix:About
Appendix:RevisionHistory
Appendix:Translations
Appendix:TranslationHow-to
Feedback
1
AByteofPython"AByteofPython"isafreebookonprogrammingusingthePythonlanguage.ItservesasatutorialorguidetothePythonlanguageforabeginneraudience.Ifallyouknowaboutcomputersishowtosavetextfiles,thenthisisthebookforyou.
ForPythonversion3ThisbookwillteachyoutousePythonversion3.TherewillalsobeguidanceforyoutoadapttotheolderandmorecommonPythonversion2inthebook.
WhoreadsAByteofPython?Herearewhatpeoplearesayingaboutthebook:
Thisisthebestbeginner'stutorialI'veeverseen!Thankyouforyoureffort.--WaltMichalik
Thebestthingifoundwas"AByteofPython",whichissimplyabrilliantbookforabeginner.It'swellwritten,theconceptsarewellexplainedwithselfevidentexamples.--JoshuaRobin
Excellentgentleintroductiontoprogramming#Pythonforbeginners--ShanRajasekaran
Bestnewbieguidetopython--NicksonKaigi
starttolovepythonwitheverysinglepageread--HerbertFeutl
perfectbeginnersguideforpython,willgiveukeytounlockmagicalworldofpython--Dilip
Ishouldbedoingmyactual"work"butjustfound"AByteofPython".Agreatguidewithgreatexamples.--BiologistJohn
RecentlystartedreadingaByteofpython.Awesomework.Andthattooforfree.Highlyrecommendedforaspiringpythonistas.--Mangesh
AByteofPython,writtenbySwaroop.(thisisthebookI'mcurrentlyreading).Probablythebesttostartwith,andprobablythebestintheworldforeverynewbieorevenamoreexperienceduser.--Apostolos
Introduction
2
EnjoyingReading#ByteOfPythonby@swaroopchbestbookever--YuvrajSharma
ThankyousomuchforwritingAByteOfPython.IjuststartedlearninghowtocodetwodaysagoandI'malreadybuildingsomesimplegames.YourguidehasbeenadreamandIjustwantedtoletyouknowhowvaluableithasbeen.--Franklin
I'mfromDayanandasagarCollegeofEngineering(7thsem,CSE).Firstlyiwanttosaythatyourbook"Thebyteofpython"istoogoodabookforabeginnerinpythonlikeme.Theconceptsaresowellexplainedwithsimpleexamplesthathelpedmetoeasilylearnpython.Thankyousomuch.--Madhura
Iama18yearoldITstudentstudyingatUniversityinIreland.Iwouldliketoexpressmygratitudetoyouforwritingyourbook"AByteofPython",Ialreadyhadknowledgeof3programminglangagues-C,JavaandJavascript,andPythonwasbyfartheeasiestlangagueIhaveeverlearned,andthatwasmainlybecauseyourbookwasfantasticandmadelearningpythonverysimpleandinteresting.ItisoneofthebestwrittenandeasytofollowprogrammingbooksIhaveeverread.Congratulationsandkeepupthegreatwork.--Matt
Hi,I'mfromDominicanRepublic.MynameisPavel,recentlyIreadyourbookAByteofPythonandIconsideritexcellent!!:).Ilearntmuchfromalltheexamples.Yourbookisofgreathelpfornewbieslikeme...--PavelSimo
IamastudentfromChina,Now,IhavereadyoubookAbyteofPython,Ohit'sbeautiful.Thebookisverysimplebutcanhelpallthefirstlearnners.YouknowIaminterestinginJavaandcloudcomputingmanytimes,ihavetocodingprogrammfortheserver,soithinkpythonisagoodchoice,finishyourbook,ithinkitsnotonlyagoodchoiceitsmustusethePython.MyEnglishisnotverywell,theemailtoyou,ijustwannathankyou!BestWishesforyouandyourfamily.--RoyLau
IrecentlyfinishedreadingByteofPython,andIthoughtIreallyoughttothankyou.IwasverysadtoreachthefinalpagesasInowhavetogobacktodull,tediousoreillyoretc.manualsforlearningaboutpython.Anyway,Ireallyappreciateyourbook.SamuelYoung
DearSwaroop,Iamtakingaclassfromaninstructorthathasnointerestinteaching.WeareusingLearningPython,secondedition,byO'Reilly.Itisnotatextforbeginnerwithoutanyprogrammingknowledge,andaninstructorthatshouldbeworkinginanotherfield.Thankyouverymuchforyourbook,withoutitIwouldbecluelessaboutPythonandprogramming.Thanksamillion,youareabletobreakthemessagedowntoalevelthatbeginnerscanunderstandandnoteveryonecan.--JosephDuarte
Iloveyourbook!ItisthegreatestPythontutorialever,andaveryusefulreference.Brilliant,atruemasterpiece!Keepupthegoodwork!--Chris-AndréSommerseth
Introduction
3
Firstofall,Iwanttosaythankstoyouforthisgreatebook.Ithinkitisagoodbookforthosewhoarelookingforabeginner'stutorialforPython.Itisabouttwoorthereyearsago,Ithink,whenIfirstheardofthisbook.Atthattime,IamnotabletoreadsomebookinEnglishyet,soIgotachinesetranslation,whichtookmeintothegateofPythonprogramming.Recently,Irereadthisbook.Thistime,ofcourse,theenglishversion.Icouldn'tbelievethatIcanreadthewholebookwithoutmydictionaryathand.Ofcourse,itallduestoyourefforttomakethisbookaneasy-to-understandone.--myd7349
I'mjuste-mailingyoutothankyouforwritingByteofPythononline.IhadbeenattemptingPythonforafewmonthspriortostumblingacrossyourbook,andalthoughImadelimitedsuccesswithpyGame,Inevercompletedaprogram.Thankstoyoursimplificationofthecategories,Pythonactuallyseemsareachablegoal.ItseemslikeIhavefinallylearnedthefoundationsandIcancontinueintomyrealgoal,gamedevelopment....Onceagain,thanksVERYmuchforplacingsuchastructuredandhelpfulguidetobasicprogrammingontheweb.ItshovedmeintoandoutofOOPwithanunderstandingwheretwotextbookshadfailed.--MattGallivan
IwouldliketothankyouforyourbookAByteofPythonwhichimyselffindthebestwaytolearnpython.Iama15yearoldiliveinegyptmynameisAhmed.Pythonwasmysecondprogramminglanguageilearnvisualbasic6atschoolbutdidn'tenjoyit,howeverireallyenjoyedlearningpython.Imadetheaddressbookprogramandiwassucessful.iwilltrytostartmakemoreprogramsandreadpythonprograms(ifyoucouldtellmesourcethatwouldbehelpful).Iwillalsostartonlearningjavaandifyoucantellmewheretofindatutorialasgoodasyoursforjavathatwouldhelpmealot.Thanx.--AhmedMohammed
AwonderfulresourceforbeginnerswantingtolearnmoreaboutPythonisthe110-pagePDFtutorialAByteofPythonbySwaroopCH.Itiswell-written,easytofollow,andmaybethebestintroductiontoPythonprogrammingavailable.--DrewAmes
YesterdayIgotthroughmostofByteofPythononmyNokiaN800andit'stheeasiestandmostconciseintroductiontoPythonIhaveyetencountered.HighlyrecommendedasastartingpointforlearningPython.--JasonDelport
ByteofVimandPythonby@swaroopchisbyfarthebestworksintechnicalwritingtome.Excellentreads#FeelGoodFactor--Surendran
"Byteofpython"bestonebyfarman(inresponsetothequestion"Cananyonesuggestagood,inexpensiveresourceforlearningthebasicsofPython?")--JustinLoveTrue
TheBookByteofpythonwasveryhelpful..Thanksbigtime:)Chinmay
Introduction
4
AlwaysbeenafanofAByteofPython-madeforbothnewandexperiencedprogrammers.--PatrickHarrington
Istartedlearningpythonfewdaysagofromyourbook..thanksforsuchanicebook.itissowellwritten,youmademylifeeasy..soyoufoundanewfanofyours..thatsme:)tonsofthanks.--GadadhariBheem
BeforeIstartedtolearnPython,I'veacquiredbasicprogrammingskillsinAssembly,C,C++,C#andJava.TheveryreasonIwantedtolearnPythonisit'spopular(peoplearetalkingaboutit)andpowerful(reality).ThisbookwrittenbyMr.Swaroopisaverygoodguideforbothbrand-newprogrammersandnewpythonprogrammers.Took10halfdaystogothroughit.GreatHelp!--FangBiyi(PhDCandidateECE,MichiganStateUniversity)
Thankyoueversomuchforthisbook!!ThisbookclearedupmanyquestionsIhadaboutcertainaspectsofPythonsuchasobjectorientedprogramming.IdonotfeellikeanexpertatOObutIknowthisbookhelpedmeonafirststeportwo.Ihavenowwrittenseveralpythonprogramsthatactuallydorealthingsformeasasystemadministrator.Theyareallproceduralorientedbuttheyaresmallbymostpeoplesstandards.Again,thanksforthisbook.Thankyouforhavingitontheweb.--Bob
IjustwanttothankyouforwritingthefirstbookonprogrammingI'veeverreallyread.Pythonisnowmyfirstlanguage,andIcanjustimagineallthepossibilities.SothankyouforgivingmethetoolstocreatethingsIneverwouldhaveimaginedIcoulddobefore.--"TheWalrus"
IwantedtothankyouforwritingAByteOfPython(2&3Versions).IthasbeeninvaluabletomylearningexperienceinPython&Programmingingeneral.Needlesstosay,Iamabeginnerintheprogrammingworld,acoupleofmonthsofselfstudyuptothispoint.Ihadbeenusingyoutubetutorials&someotheronlinetutorialsincludingotherfreebooks.Idecidedtodigintoyourbookyesterday,&I'velearnedmoreonthefirstfewpagesthananyotherbookortutorial.AfewthingsIhadbeenconfusedabout,wereclearedrightupwithaGREATexample&explanation.Can'twaittoread(andlearn)more!!Thankyousomuchfornotonlywritingthebook,butforputtingitunderthecreativecommonslicense(free).Thankgoodnessthereareunselfishpeoplelikeyououttheretohelp&teachtherestofus.--Chris
Introduction
5
Iwroteyoubackin2011andIwasjustgettingintoPythonandwantedtothankyouforyourtutorial"AByteofPython".Withoutit,Iwouldhavefallenbythewayside.SincethenIhavegoneontoprogramanumberoffunctionsinmyorganizationwiththislanguagewithyetmoreonthehorizon.IwouldnotcallmyselfanadvancedprogrammerbyanystretchbutInoticetheoccasionalrequestforassistancenowfromotherssinceIstartedusingit.Idiscovered,whilereading"Byte"whyIhadceasedstudyingCandC++anditwasbecausethebookgiventomestartedoutwithanexamplecontaininganaugmentedassignment.Ofcourse,therewasnoexplanationforthisarrangementofoperatorsandIfellonmyheadtryingtomakesenseofwhatwasonthewrittenpage.AsIrecallitwasamostfrustratingexercisewhichIeventuallyabandoned.Doesn'tmeanCorC++isimpossibletolearn,oreventhatIamstupid,butitdoesmeanthatthedocumentationIworkedmywaythroughdidnotdefinethesymbolsandwordswhichisanessentialpartofanyinstruction.Justascomputerswillnotbeabletounderstandacomputerwordorcomputersymbolthatisoutsidethesyntaxforthelanguagebeingused,astudentnewtoanyfieldwillnotgrasphissubjectifheencounterswordsorsymbolsforwhichtherearenodefinitions.Yougeta"bluescreen"asitwereineithercase.Thesolutionissimple,though:findthewordorsymbolandgettheproperdefinitionorsymbolandloandbehold,thecomputerorstudentcanproceed.YourbookwassowellputtogetherthatIfoundverylittleinitIcouldn'tgrasp.So,thankyou.Iencourageyoutocontinuetoincludefulldefinitionsofterms.ThedocumentationwithPythonisgood,onceyouknow,(theexamplesareitsstrengthfromwhatIsee)butinmanycasesitseemsthatyouhavetoknowinordertounderstandthedocumentationwhichtomymindisnotwhatshouldbe.Thirdpartytutorialsexpresstheneedforclarificationofthedocumentationandtheirsuccesslargelydependsonthewordsthatareusedtodescribetheterminology.Ihaverecommendedyourbooktomanyothers.SomeinAustralia,someintheCaribbeanandyetothersintheUS.Itfillsanichenoothersdo.Ihopeyouaredoingwellandwishyouallthesuccessinthefuture.--Nick
hey,thisisankush(19).Iwasfacingagreatdifficultytostartwithpython.Itriedalotofbooksbutallwerebulkierandnottargetoriented;andthenifoundthislovelyone,whichmademelovepythoninnotime.Thanksalotforthis"beautifulpieceofbook".--Ankush
IwouldliketothankyouforyourexcellentguideonPython.Iamamolecularbiologist(withlittleprogrammingbackground)andformyworkIneedtohandlebigdatasetsofDNAsequencesandtoanalysemicroscopeimages.Forboththings,programminginpythonhasbeenuseful,ifnotessentialtocompleteandpublisha6-yearsproject.Thatsuchaguideisfreelyavailableisaclearsignthattheforcesofevilarenotyetrulingtheworld!:)--Luca
Introduction
6
Sincethisisgoingtobethefirstlanguageyoulearn,youshoulduseAByteofPython.ItreallygivesaproperintroductionintoprogramminginPythonanditispacedwellenoughfortheaveragebeginner.Themostimportantthingfromthenonwillbeactuallystartingtopracticemakingyourownlittleprograms.--"{Unregistered}"
Justtosayaloudandhappythankyouverymuchforpublishing"AByteofPython"and"AByteofVim".ThosebookswereveryusefultomefourorfiveyearsagowhenIstartinglearningprogramming.RightnowI'mdevelopingaprojectthatwasadreamforalong,longtimeandjustwanttosaythankyou.Keepwalking.Youareasourceofmotivation.Allthebest.--Jocimar
FinishedreadingAbyteofPythonin3days.Itisthoroughlyinteresting.Notasinglepagewasboring.IwanttounderstandtheOrcascreenreadercode.Yourbookhashopefullyequippedmeforit.--Dattatray
Hi,'Abyteofpython'isreallyagoodreadingforpythonbeginners.So,again,NICEWORK!i'ma4yearsexperiencedJava&CdeveloperfromChina.Recently,iwanttodosomeworkonzim-wikinoteprojectwhichusespygtktoimplement.ireadyourbookin6days,andicanreadandwritepythoncodeexamplesnow.thxforyourcontribution.plzkeepyourenthusiasmtomakethisworldbetter,thisisjustalittleencouragefromChina.--Lee
IamIsenfromTaiwan,whoisagraduatingPhDstudentinElectricalEngineeringDepartmentofNationalTaiwanUniversity.Iwouldliketothankyouforyourgreatbook.IthinkitisnotonlyjusteasytoreadbutalsocomprehensiveandcompleteforanewcomerofPython.ThereasonIreadyourbookisthatIamstartingtoworkontheGNURadioframework.YourbookletmecatchmostofimportantcoreideasandskillofPythonwithaminimumtime.Ialsosawthatyoudonotmindthatreaderssendyouathanknoteinyourbook.SoIreallylikeyourbookandappreciateit.Thanks.--IsenI-ChunChao
ThebookisevenusedbyNASA!ItisusedintheirJetPropulsionLaboratorywiththeirDeepSpaceNetworkproject.
AcademicCoursesThisbookis/wasbeingusedasinstructionalmaterialinvariouseducationalinstitutions:
'PrinciplesofProgrammingLanguages'courseatVrijeUniversiteit,Amsterdam'BasicConceptsofComputing'courseatUniversityofCalifornia,Davis'ProgrammingWithPython'courseatHarvardUniversity'IntroductiontoProgramming'courseatUniversityofLeeds
Introduction
7
'IntroductiontoApplicationProgramming'courseatBostonUniversity'InformationTechnologySkillsforMeteorology'courseatUniversityofOklahoma'Geoprocessing'courseatMichiganStateUniversity'MultiAgentSemanticWebSystems'courseattheUniversityofEdinburgh'IntroductiontoComputerScienceandProgramming'atMITOpenCourseWare'BasicprogrammingattheFacultyofSocialSciences,UniversityofLjubljana,Slovenia'--AlešŽibernasays"I(andmypredecessor)havebeenusingyourbookasthemainliteratureforthiscourse"'Introductiontoprogramming',DepartmentofInformationSciences,UniversityofZadar,Croatia--KrešimirZaudersays"IwouldliketoinformyouthatAByteofPythonisamandatoryreadatmycourse"
LicenseThisbookislicensedunderaCreativeCommonsAttribution-ShareAlike4.0InternationalLicense.
Thismeans:
YouarefreetoSharei.e.tocopy,distributeandtransmitthisbookYouarefreetoRemixi.e.tomakechangestothisbook(especiallytranslations)Youarefreetouseitforcommercialpurposes
Pleasenote:
Pleasedonotsellelectronicorprintedcopiesofthebookunlessyouhaveclearlyandprominentlymentionedinthedescriptionthatthesecopiesarenotfromtheoriginalauthorofthisbook.Attributionmustbeshownintheintroductorydescriptionandfrontpageofthedocumentbylinkingbacktohttp://python.swaroopch.com/andclearlyindicatingthattheoriginaltextcanbefetchedfromthislocation.Allthecode/scriptsprovidedinthisbookislicensedunderthe3-clauseBSDLicenseunlessotherwisenoted.
ReadNowYoucanreaditonlineathttp://python.swaroopch.com/
BuyTheBook
Introduction
8
Aprintedhardcopyofthebookcanbepurchasedathttp://www.swaroopch.com/buybook/foryourofflinereadingpleasure,andtosupportthecontinueddevelopmentandimprovementofthisbook.
DownloadVisithttps://www.gitbook.com/book/swaroopch/byte-of-python/detailsforthefollowingtypesofdownloads:
PDF(fordesktopreading,etc.)EPUB(foriPhone/iPad,ebookreaders,etc.)Mobi(forKindle)
Visithttps://github.com/swaroopch/byte-of-pythonfortherawcontent(forsuggestingcorrections,changes,translating,etc.)
ReadthebookinyournativelanguageIfyouareinterestedinreadingorcontributingtranslationsofthisbooktootherhumanlanguages,pleaseseeTranslations.
Introduction
9
DedicationToKalyanVarmaandmanyotherseniorsatPESITwhointroducedustoGNU/Linuxandtheworldofopensource.
TothememoryofAtulChitnis,afriendandguidewhoshallbemissedgreatly.
TothepioneerswhomadetheInternethappen.Thisbookwasfirstwrittenin2003.Itstillremainspopular,thankstothenatureofsharingknowledgeontheInternetasenvisionedbythepioneers.
Dedication
10
PrefacePythonisprobablyoneofthefewprogramminglanguageswhichisbothsimpleandpowerful.Thisisgoodforbeginnersaswellasforexperts,andmoreimportantly,isfuntoprogramwith.Thisbookaimstohelpyoulearnthiswonderfullanguageandshowhowtogetthingsdonequicklyandpainlessly-ineffect'TheAnti-venomtoyourprogrammingproblems'.
WhoThisBookIsForThisbookservesasaguideortutorialtothePythonprogramminglanguage.Itismainlytargetedatnewbies.Itisusefulforexperiencedprogrammersaswell.
Theaimisthatifallyouknowaboutcomputersishowtosavetextfiles,thenyoucanlearnPythonfromthisbook.Ifyouhavepreviousprogrammingexperience,thenyoucanalsolearnPythonfromthisbook.
Ifyoudohavepreviousprogrammingexperience,youwillbeinterestedinthedifferencesbetweenPythonandyourfavoriteprogramminglanguage-Ihavehighlightedmanysuchdifferences.Alittlewarningthough,Pythonissoongoingtobecomeyourfavoriteprogramminglanguage!
OfficialWebsiteTheofficialwebsiteofthebookishttp://python.swaroopch.com/whereyoucanreadthewholebookonline,downloadthelatestversionsofthebook,buyaprintedhardcopyandalsosendmefeedback.
SomethingToThinkAboutTherearetwowaysofconstructingasoftwaredesign:onewayistomakeitsosimplethatthereareobviouslynodeficiencies;theotheristomakeitsocomplicatedthattherearenoobviousdeficiencies.--C.A.R.Hoare
Successinlifeisamatternotsomuchoftalentandopportunityasofconcentrationandperseverance.--C.W.Wendte
Preface
11
Preface
12
AboutPythonPythonisoneofthoserarelanguageswhichcanclaimtobebothsimpleandpowerful.Youwillfindyourselfpleasantlysurprisedtoseehoweasyitistoconcentrateonthesolutiontotheproblemratherthanthesyntaxandstructureofthelanguageyouareprogrammingin.
TheofficialintroductiontoPythonis:
Pythonisaneasytolearn,powerfulprogramminglanguage.Ithasefficienthigh-leveldatastructuresandasimplebuteffectiveapproachtoobject-orientedprogramming.Python'selegantsyntaxanddynamictyping,togetherwithitsinterpretednature,makeitanideallanguageforscriptingandrapidapplicationdevelopmentinmanyareasonmostplatforms.
Iwilldiscussmostofthesefeaturesinmoredetailinthenextsection.
StorybehindthenameGuidovanRossum,thecreatorofthePythonlanguage,namedthelanguageaftertheBBCshow"MontyPython'sFlyingCircus".Hedoesn'tparticularlylikesnakesthatkillanimalsforfoodbywindingtheirlongbodiesaroundthemandcrushingthem.
FeaturesofPython
Simple
Pythonisasimpleandminimalisticlanguage.ReadingagoodPythonprogramfeelsalmostlikereadingEnglish,althoughverystrictEnglish!Thispseudo-codenatureofPythonisoneofitsgreateststrengths.Itallowsyoutoconcentrateonthesolutiontotheproblemratherthanthelanguageitself.
EasytoLearn
Asyouwillsee,Pythonisextremelyeasytogetstartedwith.Pythonhasanextraordinarilysimplesyntax,asalreadymentioned.
FreeandOpenSource
AboutPython
13
PythonisanexampleofaFLOSS(Free/LibréandOpenSourceSoftware).Insimpleterms,youcanfreelydistributecopiesofthissoftware,readitssourcecode,makechangestoit,andusepiecesofitinnewfreeprograms.FLOSSisbasedontheconceptofacommunitywhichsharesknowledge.ThisisoneofthereasonswhyPythonissogood-ithasbeencreatedandisconstantlyimprovedbyacommunitywhojustwanttoseeabetterPython.
High-levelLanguage
WhenyouwriteprogramsinPython,youneverneedtobotheraboutthelow-leveldetailssuchasmanagingthememoryusedbyyourprogram,etc.
Portable
Duetoitsopen-sourcenature,Pythonhasbeenportedto(i.e.changedtomakeitworkon)manyplatforms.AllyourPythonprogramscanworkonanyoftheseplatformswithoutrequiringanychangesatallifyouarecarefulenoughtoavoidanysystem-dependentfeatures.
YoucanusePythononGNU/Linux,Windows,FreeBSD,Macintosh,Solaris,OS/2,Amiga,AROS,AS/400,BeOS,OS/390,z/OS,PalmOS,QNX,VMS,Psion,AcornRISCOS,VxWorks,PlayStation,SharpZaurus,WindowsCEandPocketPC!
YoucanevenuseaplatformlikeKivytocreategamesforyourcomputerandforiPhone,iPad,andAndroid.
Interpreted
Thisrequiresabitofexplanation.
AprogramwritteninacompiledlanguagelikeCorC++isconvertedfromthesourcelanguagei.e.CorC++intoalanguagethatisspokenbyyourcomputer(binarycodei.e.0sand1s)usingacompilerwithvariousflagsandoptions.Whenyouruntheprogram,thelinker/loadersoftwarecopiestheprogramfromharddisktomemoryandstartsrunningit.
Python,ontheotherhand,doesnotneedcompilationtobinary.Youjustruntheprogramdirectlyfromthesourcecode.Internally,Pythonconvertsthesourcecodeintoanintermediateformcalledbytecodesandthentranslatesthisintothenativelanguageofyourcomputerandthenrunsit.Allthis,actually,makesusingPythonmucheasiersinceyoudon'thavetoworryaboutcompilingtheprogram,makingsurethattheproperlibrariesarelinkedandloaded,etc.ThisalsomakesyourPythonprogramsmuchmoreportable,sinceyoucanjustcopyyourPythonprogramontoanothercomputeranditjustworks!
AboutPython
14
ObjectOriented
Pythonsupportsprocedure-orientedprogrammingaswellasobject-orientedprogramming.Inprocedure-orientedlanguages,theprogramisbuiltaroundproceduresorfunctionswhicharenothingbutreusablepiecesofprograms.Inobject-orientedlanguages,theprogramisbuiltaroundobjectswhichcombinedataandfunctionality.PythonhasaverypowerfulbutsimplisticwayofdoingOOP,especiallywhencomparedtobiglanguageslikeC++orJava.
Extensible
Ifyouneedacriticalpieceofcodetorunveryfastorwanttohavesomepieceofalgorithmnottobeopen,youcancodethatpartofyourprograminCorC++andthenuseitfromyourPythonprogram.
Embeddable
YoucanembedPythonwithinyourC/C++programstogivescriptingcapabilitiesforyourprogram'susers.
ExtensiveLibraries
ThePythonStandardLibraryishugeindeed.Itcanhelpyoudovariousthingsinvolvingregularexpressions,documentationgeneration,unittesting,threading,databases,webbrowsers,CGI,FTP,email,XML,XML-RPC,HTML,WAVfiles,cryptography,GUI(graphicaluserinterfaces),andothersystem-dependentstuff.Remember,allthisisalwaysavailablewhereverPythonisinstalled.ThisiscalledtheBatteriesIncludedphilosophyofPython.
Besidesthestandardlibrary,therearevariousotherhigh-qualitylibrarieswhichyoucanfindatthePythonPackageIndex.
Summary
Pythonisindeedanexcitingandpowerfullanguage.IthastherightcombinationofperformanceandfeaturesthatmakewritingprogramsinPythonbothfunandeasy.
Python3versus2Youcanignorethissectionifyou'renotinterestedinthedifferencebetween"Pythonversion2"and"Pythonversion3".Butpleasedobeawareofwhichversionyouareusing.ThisbookiswrittenforPythonversion3.
AboutPython
15
Rememberthatonceyouhaveproperlyunderstoodandlearntouseoneversion,youcaneasilylearnthedifferencesandusetheotherone.ThehardpartislearningprogrammingandunderstandingthebasicsofPythonlanguageitself.Thatisourgoalinthisbook,andonceyouhaveachievedthatgoal,youcaneasilyusePython2orPython3dependingonyoursituation.
FordetailsondifferencesbetweenPython2andPython3,see:
ThefutureofPython2PortingPython2CodetoPython3WritingcodethatrunsunderbothPython2and3SupportingPython3:Anin-depthguide
WhatProgrammersSayYoumayfinditinterestingtoreadwhatgreathackerslikeESRhavetosayaboutPython:
EricS.Raymondistheauthorof"TheCathedralandtheBazaar"andisalsothepersonwhocoinedthetermOpenSource.HesaysthatPythonhasbecomehisfavoriteprogramminglanguage.ThisarticlewastherealinspirationformyfirstbrushwithPython.BruceEckelistheauthorofthefamous'ThinkinginJava'and'ThinkinginC++'books.HesaysthatnolanguagehasmadehimmoreproductivethanPython.HesaysthatPythonisperhapstheonlylanguagethatfocusesonmakingthingseasierfortheprogrammer.Readthecompleteinterviewformoredetails.PeterNorvigisawell-knownLispauthorandDirectorofSearchQualityatGoogle(thankstoGuidovanRossumforpointingthatout).HesaysthatwritingPythonislikewritinginpseudocode.HesaysthatPythonhasalwaysbeenanintegralpartofGoogle.YoucanactuallyverifythisstatementbylookingattheGoogleJobspagewhichlistsPythonknowledgeasarequirementforsoftwareengineers.
AboutPython
16
InstallationWhenwereferto"Python3"inthisbook,wewillbereferringtoanyversionofPythonequaltoorgreaterthanversionPython3.5.1.
InstallationonWindowsVisithttps://www.python.org/downloads/anddownloadthelatestversion.Atthetimeofthiswriting,itwasPython3.5.1TheinstallationisjustlikeanyotherWindows-basedsoftware.
CAUTION:MakesureyoucheckoptionAddPython3.5toPATH.
Tochangeinstalllocation,clickonCustomizeinstallation,thenNextandenterC:\python35asinstalllocation.
Ifnotchecked,checkAddPythontoenvironmentvariables.ThisdoesthesamethingasAddPython3.5toPATHonthefirstinstallscreen.
YoucanchoosetoinstallLauncherforallusersornot,itdoesnotmattermuch.LauncherisusedtoswitchbetweendifferentversionsofPythoninstalled.
Ifyourpathwasnotsetcorrectly,thenfollowthesestepstofixit.Otherwise,gotoRunningPythonpromptonWindows.
NOTE:Forpeoplewhoalreadyknowprogramming,ifyouarefamiliarwithDocker,checkoutPythoninDockerandDockeronWindows.
DOSPrompt
IfyouwanttobeabletousePythonfromtheWindowscommandlinei.e.theDOSprompt,thenyouneedtosetthePATHvariableappropriately.
ForWindows2000,XP,2003,clickonControlPanel->System->Advanced->EnvironmentVariables.ClickonthevariablenamedPATHintheSystemVariablessection,thenselectEditandadd;C:\Python35(pleaseverifythatthisfolderexists,itwillbedifferentfornewerversionsofPython)totheendofwhatisalreadythere.Ofcourse,usetheappropriatedirectoryname.
ForolderversionsofWindows,openthefileC:\AUTOEXEC.BATandaddthelinePATH=%PATH%;C:\Python35andrestartthesystem.ForWindowsNT,usetheAUTOEXEC.NTfile.
Installation
17
ForWindowsVista:
ClickStartandchooseControlPanelClickSystem,ontherightyou'llsee"Viewbasicinformationaboutyourcomputer"Ontheleftisalistoftasks,thelastofwhichisAdvancedsystemsettings.Clickthat.TheAdvancedtaboftheSystemPropertiesdialogboxisshown.ClicktheEnvironmentVariablesbuttononthebottomright.InthelowerboxtitledSystemVariablesscrolldowntoPathandclicktheEditbutton.Changeyourpathasneedbe.Restartyoursystem.Vistadidn'tpickupthesystempathenvironmentvariablechangeuntilIrestarted.
ForWindows7and8:
RightclickonComputerfromyourdesktopandselectPropertiesorclickStartandchooseControlPanel->SystemandSecurity->System.ClickonAdvancedsystemsettingsontheleftandthenclickontheAdvancedtab.AtthebottomclickonEnvironmentVariablesandunderSystemvariables,lookforthePATHvariable,selectandthenpressEdit.GototheendofthelineunderVariablevalueandappend;C:\Python35(pleaseverifythatthisfolderexists,itwillbedifferentfornewerversionsofPython)totheendofwhatisalreadythere.Ofcourse,usetheappropriatefoldername.Ifthevaluewas%SystemRoot%\system32;Itwillnowbecome%SystemRoot%\system32;C:\Python35
ClickOKandyouaredone.Norestartisrequired,howeveryoumayhavetocloseandreopenthecommandline.
RunningPythonpromptonWindows
ForWindowsusers,youcanruntheinterpreterinthecommandlineifyouhavesetthePATHvariableappropriately.
ToopentheterminalinWindows,clickthestartbuttonandclickRun.Inthedialogbox,typecmdandpress[enter]key.
Then,typepythonandensuretherearenoerrors.
InstallationonMacOSXForMacOSXusers,useHomebrew:brewinstallpython3.
Installation
18
Toverify,opentheterminalbypressing[Command+Space]keys(toopenSpotlightsearch),typeTerminalandpress[enter]key.Now,runpython3andensuretherearenoerrors.
InstallationonGNU/LinuxForGNU/Linuxusers,useyourdistribution'spackagemanagertoinstallPython3,e.g.onDebian&Ubuntu:sudoapt-getupdate&&sudoapt-getinstallpython3.
Toverify,opentheterminalbyopeningtheTerminalapplicationorbypressingAlt+F2andenteringgnome-terminal.Ifthatdoesn'twork,pleasereferthedocumentationofyourparticularGNU/Linuxdistribution.Now,runpython3andensuretherearenoerrors.
YoucanseetheversionofPythononthescreenbyrunning:
$python3-V
Python3.5.1
NOTE:$isthepromptoftheshell.Itwillbedifferentforyoudependingonthesettingsoftheoperatingsystemonyourcomputer,henceIwillindicatethepromptbyjustthe$symbol.
CAUTION:Outputmaybedifferentonyourcomputer,dependingontheversionofPythonsoftwareinstalledonyourcomputer.
SummaryFromnowon,wewillassumethatyouhavePythoninstalledonyoursystem.
Next,wewillwriteourfirstPythonprogram.
Installation
19
FirstStepsWewillnowseehowtorunatraditional'HelloWorld'programinPython.Thiswillteachyouhowtowrite,saveandrunPythonprograms.
TherearetwowaysofusingPythontorunyourprogram-usingtheinteractiveinterpreterpromptorusingasourcefile.Wewillnowseehowtousebothofthesemethods.
UsingTheInterpreterPromptOpentheterminalinyouroperatingsystem(asdiscussedpreviouslyintheInstallationchapter)andthenopenthePythonpromptbytypingpython3andpressing[enter]key.
OnceyouhavestartedPython,youshouldsee>>>whereyoucanstarttypingstuff.ThisiscalledthePythoninterpreterprompt.
AtthePythoninterpreterprompt,type:
print("HelloWorld")
followedbythe[enter]key.YoushouldseethewordsHelloWorldprintedtothescreen.
Hereisanexampleofwhatyoushouldbeseeing,whenusingaMacOSXcomputer.ThedetailsaboutthePythonsoftwarewilldifferbasedonyourcomputer,butthepartfromtheprompt(i.e.from>>>onwards)shouldbethesameregardlessoftheoperatingsystem.
>python3
Python3.5.1(default,Jan142016,06:54:11)
[GCC4.2.1CompatibleAppleLLVM7.0.2(clang-700.1.81)]ondarwin
Type"help","copyright","credits"or"license"formoreinformation.
>>>print("HelloWorld")
HelloWorld
NoticethatPythongivesyoutheoutputofthelineimmediately!WhatyoujustenteredisasinglePythonstatement.Weuseprintto(unsurprisingly)printanyvaluethatyousupplytoit.Here,wearesupplyingthetextHelloWorldandthisispromptlyprintedtothescreen.
HowtoQuittheInterpreterPrompt
FirstSteps
20
IfyouareusingaGNU/LinuxorOSXshell,youcanexittheinterpreterpromptbypressing[ctrl+d]orenteringexit()(note:remembertoincludetheparentheses,())followedbythe[enter]key.
IfyouareusingtheWindowscommandprompt,press[ctrl+z]followedbythe[enter]key.
ChoosingAnEditorWecannottypeoutourprogramattheinterpreterprompteverytimewewanttorunsomething,sowehavetosavetheminfilesandcanrunourprogramsanynumberoftimes.
TocreateourPythonsourcefiles,weneedaneditorsoftwarewhereyoucantypeandsave.Agoodprogrammer'seditorwillmakeyourlifeeasierinwritingthesourcefiles.Hence,thechoiceofaneditoriscrucialindeed.Youhavetochooseaneditorasyouwouldchooseacaryouwouldbuy.AgoodeditorwillhelpyouwritePythonprogramseasily,makingyourjourneymorecomfortableandhelpsyoureachyourdestination(achieveyourgoal)inamuchfasterandsaferway.
OneoftheverybasicrequirementsissyntaxhighlightingwhereallthedifferentpartsofyourPythonprogramarecolorizedsothatyoucanseeyourprogramandvisualizeitsrunning.
Ifyouhavenoideawheretostart,IwouldrecommendusingPyCharmEducationalEditionsoftwarewhichisavailableonWindows,MacOSXandGNU/Linux.Detailsinthenextsection.
IfyouareusingWindows,donotuseNotepad-itisabadchoicebecauseitdoesnotdosyntaxhighlightingandalsoimportantlyitdoesnotsupportindentationofthetextwhichisveryimportantinourcaseaswewillseelater.Goodeditorswillautomaticallydothis.
Ifyouareanexperiencedprogrammer,thenyoumustbealreadyusingVimorEmacs.Needlesstosay,thesearetwoofthemostpowerfuleditorsandyouwillbenefitfromusingthemtowriteyourPythonprograms.Ipersonallyusebothformostofmyprograms,andhaveevenwrittenanentirebookonVim.
IncaseyouarewillingtotakethetimetolearnVimorEmacs,thenIhighlyrecommendthatyoudolearntouseeitherofthemasitwillbeveryusefulforyouinthelongrun.However,asImentionedbefore,beginnerscanstartwithPyCharmandfocusthelearningonPythonratherthantheeditoratthismoment.
Toreiterate,pleasechooseapropereditor-itcanmakewritingPythonprogramsmorefunandeasy.
FirstSteps
21
PyCharmPyCharmEducationalEditionisafreeeditorwhichyoucanuseforwritingPythonprograms.
WhenyouopenPyCharm,you'llseethis,clickonCreateNewProject:
SelectPurePython:
FirstSteps
22
Changeuntitledtohelloworldasthelocationoftheproject,youshouldseedetailssimilartothis:
FirstSteps
23
ClicktheCreatebutton.
Right-clickonthehelloworldinthesidebarandselectNew->PythonFile:
FirstSteps
24
Youwillbeaskedtotypethename,typehello:
Youcannowseeafileopenedforyou:
FirstSteps
25
Deletethelinesthatarealreadypresent,andnowtypethefollowing:
print("helloworld")
Nowright-clickonwhatyoutyped(withoutselectingthetext),andclickonRun'hello'.
FirstSteps
26
Youshouldnowseetheoutput(whatitprints)ofyourprogram:
Phew!Thatwasquiteafewstepstogetstarted,buthenceforth,everytimeweaskyoutocreateanewfile,remembertojustright-clickonhelloworldontheleft->New->PythonFileandcontinuethesamestepstotypeandrunasshownabove.
YoucanfindmoreinformationaboutPyCharminthePyCharmQuickstartpage.
Vim1. InstallVim
MacOSXusersshouldinstallmacvimpackageviaHomeBrewWindowsusersshoulddownloadthe"self-installingexecutable"fromVimwebsiteGNU/LinuxusersshouldgetVimfromtheirdistribution'ssoftwarerepositories,e.g.DebianandUbuntuuserscaninstallthevimpackage.
2. Installjedi-vimpluginforautocompletion.3. Installcorrespondingjedipythonpackage:pipinstall-Ujedi
Emacs1. InstallEmacs24+.
MacOSXusersshouldgetEmacsfromhttp://emacsformacosx.comWindowsusersshouldgetEmacsfromhttp://ftp.gnu.org/gnu/emacs/windows/
FirstSteps
27
GNU/LinuxusersshouldgetEmacsfromtheirdistribution'ssoftwarerepositories,e.g.DebianandUbuntuuserscaninstalltheemacs24package.
2. InstallELPY
UsingASourceFileNowlet'sgetbacktoprogramming.Thereisatraditionthatwheneveryoulearnanewprogramminglanguage,thefirstprogramthatyouwriteandrunisthe'HelloWorld'program-allitdoesisjustsay'HelloWorld'whenyourunit.AsSimonCozens says,itisthe"traditionalincantationtotheprogramminggodstohelpyoulearnthelanguagebetter."
Startyourchoiceofeditor,enterthefollowingprogramandsaveitashello.py.
IfyouareusingPyCharm,wehavealreadydiscussedhowtorunfromasourcefile.
Forothereditors,openanewfilehello.pyandtypethis:
print("helloworld")
Whereshouldyousavethefile?Toanyfolderforwhichyouknowthelocationofthefolder.Ifyoudon'tunderstandwhatthatmeans,createanewfolderandusethatlocationtosaveandrunallyourPythonprograms:
/tmp/pyonMacOSX/tmp/pyonGNU/LinuxC:\pyonWindows
Tocreatetheabovefolder(fortheoperatingsystemyouareusing),usethemkdircommandintheterminal,forexample,mkdir/tmp/py.
IMPORTANT:Alwaysensurethatyougiveitthefileextensionof.py,forexample,foo.py.
TorunyourPythonprogram:
1. Openaterminalwindow(seethepreviousInstallationchapteronhowtodothat)2. Changedirectorytowhereyousavedthefile,forexample,cd/tmp/py3. Runtheprogrambyenteringthecommandpythonhello.py.Theoutputisasshown
below.
$pythonhello.py
helloworld
1
FirstSteps
28
Ifyougottheoutputasshownabove,congratulations!-youhavesuccessfullyrunyourfirstPythonprogram.Youhavesuccessfullycrossedthehardestpartoflearningprogramming,whichis,gettingstartedwithyourfirstprogram!
Incaseyougotanerror,pleasetypetheaboveprogramexactlyasshownaboveandruntheprogramagain.NotethatPythoniscase-sensitivei.e.printisnotthesameasPrint-notethelowercasepintheformerandtheuppercasePinthelatter.Also,ensuretherearenospacesortabsbeforethefirstcharacterineachline-wewillseewhythisisimportantlater.
HowItWorks
APythonprogramiscomposedofstatements.Inourfirstprogram,wehaveonlyonestatement.Inthisstatement,wecalltheprintstatementtowhichwesupplythetext"helloworld".
GettingHelpIfyouneedquickinformationaboutanyfunctionorstatementinPython,thenyoucanusethebuilt-inhelpfunctionality.Thisisveryusefulespeciallywhenusingtheinterpreterprompt.Forexample,runhelp('len')-thisdisplaysthehelpforthelenfunctionwhichisusedtocountnumberofitems.
FirstSteps
29
TIP:Pressqtoexitthehelp.
Similarly,youcanobtaininformationaboutalmostanythinginPython.Usehelp()tolearnmoreaboutusinghelpitself!
Incaseyouneedtogethelpforoperatorslikereturn,thenyouneedtoputthoseinsidequotessuchashelp('return')sothatPythondoesn'tgetconfusedonwhatwe'retryingtodo.
SummaryYoushouldnowbeabletowrite,saveandrunPythonprogramsatease.
NowthatyouareaPythonuser,let'slearnsomemorePythonconcepts.
.theauthoroftheamazing'BeginningPerl'book↩1
FirstSteps
30
BasicsJustprintinghelloworldisnotenough,isit?Youwanttodomorethanthat-youwanttotakesomeinput,manipulateitandgetsomethingoutofit.WecanachievethisinPythonusingconstantsandvariables,andwe'lllearnsomeotherconceptsaswellinthischapter.
CommentsCommentsareanytexttotherightofthe#symbolandismainlyusefulasnotesforthereaderoftheprogram.
Forexample:
print('helloworld')#Notethatprintisafunction
or:
#Notethatprintisafunction
print('helloworld')
Useasmanyusefulcommentsasyoucaninyourprogramto:
explainassumptionsexplainimportantdecisionsexplainimportantdetailsexplainproblemsyou'retryingtosolveexplainproblemsyou'retryingtoovercomeinyourprogram,etc.
Codetellsyouhow,commentsshouldtellyouwhy.
Thisisusefulforreadersofyourprogramsothattheycaneasilyunderstandwhattheprogramisdoing.Remember,thatpersoncanbeyourselfaftersixmonths!
LiteralConstantsAnexampleofaliteralconstantisanumberlike5,1.23,orastringlike'Thisisastring'or"It'sastring!".
Basics
31
Itiscalledaliteralbecauseitisliteral-youuseitsvalueliterally.Thenumber2alwaysrepresentsitselfandnothingelse-itisaconstantbecauseitsvaluecannotbechanged.Hence,allthesearereferredtoasliteralconstants.
NumbersNumbersaremainlyoftwotypes-integersandfloats.
Anexampleofanintegeris2whichisjustawholenumber.
Examplesoffloatingpointnumbers(orfloatsforshort)are3.23and52.3E-4.TheEnotationindicatespowersof10.Inthiscase,52.3E-4means52.3*10^-4^.
NoteforExperiencedProgrammers
Thereisnoseparatelongtype.Theinttypecanbeanintegerofanysize.
StringsAstringisasequenceofcharacters.Stringsarebasicallyjustabunchofwords.
YouwillbeusingstringsinalmosteveryPythonprogramthatyouwrite,sopayattentiontothefollowingpart.
SingleQuote
Youcanspecifystringsusingsinglequotessuchas'Quotemeonthis'.
Allwhitespacei.e.spacesandtabs,withinthequotes,arepreservedas-is.
DoubleQuotes
Stringsindoublequotesworkexactlythesamewayasstringsinsinglequotes.Anexampleis"What'syourname?".
TripleQuotes
Youcanspecifymulti-linestringsusingtriplequotes-("""or''').Youcanusesinglequotesanddoublequotesfreelywithinthetriplequotes.Anexampleis:
Basics
32
'''Thisisamulti-linestring.Thisisthefirstline.
Thisisthesecondline.
"What'syourname?,"Iasked.
Hesaid"Bond,JamesBond."
'''
StringsAreImmutable
Thismeansthatonceyouhavecreatedastring,youcannotchangeit.Althoughthismightseemlikeabadthing,itreallyisn't.Wewillseewhythisisnotalimitationinthevariousprogramsthatweseelateron.
NoteforC/C++Programmers
ThereisnoseparatechardatatypeinPython.ThereisnorealneedforitandIamsureyouwon'tmissit.
NoteforPerl/PHPProgrammers
Rememberthatsingle-quotedstringsanddouble-quotedstringsarethesame-theydonotdifferinanyway.
Theformatmethod
Sometimeswemaywanttoconstructstringsfromotherinformation.Thisiswheretheformat()methodisuseful.
Savethefollowinglinesasafilestr_format.py:
age=20
name='Swaroop'
print('{0}was{1}yearsoldwhenhewrotethisbook'.format(name,age))
print('Whyis{0}playingwiththatpython?'.format(name))
Output:
$pythonstr_format.py
Swaroopwas20yearsoldwhenhewrotethisbook
WhyisSwaroopplayingwiththatpython?
HowItWorks
Astringcanusecertainspecificationsandsubsequently,theformatmethodcanbecalledtosubstitutethosespecificationswithcorrespondingargumentstotheformatmethod.
Basics
33
Observethefirstusagewhereweuse{0}andthiscorrespondstothevariablenamewhichisthefirstargumenttotheformatmethod.Similarly,thesecondspecificationis{1}correspondingtoagewhichisthesecondargumenttotheformatmethod.NotethatPythonstartscountingfrom0whichmeansthatfirstpositionisatindex0,secondpositionisatindex1,andsoon.
Noticethatwecouldhaveachievedthesameusingstringconcatenation:
name+'is'+str(age)+'yearsold'
butthatismuchuglieranderror-prone.Second,theconversiontostringwouldbedoneautomaticallybytheformatmethodinsteadoftheexplicitconversiontostringsneededinthiscase.Third,whenusingtheformatmethod,wecanchangethemessagewithouthavingtodealwiththevariablesusedandvice-versa.
Alsonotethatthenumbersareoptional,soyoucouldhavealsowrittenas:
age=20
name='Swaroop'
print('{}was{}yearsoldwhenhewrotethisbook'.format(name,age))
print('Whyis{}playingwiththatpython?'.format(name))
whichwillgivethesameexactoutputasthepreviousprogram.
WhatPythondoesintheformatmethodisthatitsubstituteseachargumentvalueintotheplaceofthespecification.Therecanbemoredetailedspecificationssuchas:
#decimal(.)precisionof3forfloat'0.333'
print('{0:.3f}'.format(1.0/3))
#fillwithunderscores(_)withthetextcentered
#(^)to11width'___hello___'
print('{0:_^11}'.format('hello'))
#keyword-based'SwaroopwroteAByteofPython'
print('{name}wrote{book}'.format(name='Swaroop',book='AByteofPython'))
Output:
0.333
___hello___
SwaroopwroteAByteofPython
Basics
34
Sincewearediscussingformatting,notethatprintalwaysendswithaninvisible"newline"character(\n)sothatrepeatedcallstoprintwillallprintonaseparatelineeach.Topreventthisnewlinecharacterfrombeingprinted,youcanspecifythatitshouldendwithablank:
print('a',end='')
print('b',end='')
Outputis:
ab
Oryoucanendwithaspace:
print('a',end='')
print('b',end='')
print('c')
Outputis:
abc
EscapeSequences
Suppose,youwanttohaveastringwhichcontainsasinglequote('),howwillyouspecifythisstring?Forexample,thestringis"What'syourname?".Youcannotspecify'What'syourname?'becausePythonwillbeconfusedastowherethestringstartsandends.So,youwillhavetospecifythatthissinglequotedoesnotindicatetheendofthestring.Thiscanbedonewiththehelpofwhatiscalledanescapesequence.Youspecifythesinglequoteas\':noticethebackslash.Now,youcanspecifythestringas'What\'syourname?'.
Anotherwayofspecifyingthisspecificstringwouldbe"What'syourname?"i.e.usingdoublequotes.Similarly,youhavetouseanescapesequenceforusingadoublequoteitselfinadoublequotedstring.Also,youhavetoindicatethebackslashitselfusingtheescapesequence\\.
Whatifyouwantedtospecifyatwo-linestring?Onewayistouseatriple-quotedstringasshownpreviouslyoryoucanuseanescapesequenceforthenewlinecharacter-\ntoindicatethestartofanewline.Anexampleis:
'Thisisthefirstline\nThisisthesecondline'
Basics
35
Anotherusefulescapesequencetoknowisthetab:\t.TherearemanymoreescapesequencesbutIhavementionedonlythemostusefuloneshere.
Onethingtonoteisthatinastring,asinglebackslashattheendofthelineindicatesthatthestringiscontinuedinthenextline,butnonewlineisadded.Forexample:
"Thisisthefirstsentence.\
Thisisthesecondsentence."
isequivalentto
"Thisisthefirstsentence.Thisisthesecondsentence."
RawString
Ifyouneedtospecifysomestringswherenospecialprocessingsuchasescapesequencesarehandled,thenwhatyouneedistospecifyarawstringbyprefixingrorRtothestring.Anexampleis:
r"Newlinesareindicatedby\n"
NoteforRegularExpressionUsers
Alwaysuserawstringswhendealingwithregularexpressions.Otherwise,alotofbackwhackingmayberequired.Forexample,backreferencescanbereferredtoas'\\1'orr'\1'.
VariableUsingjustliteralconstantscansoonbecomeboring-weneedsomewayofstoringanyinformationandmanipulatethemaswell.Thisiswherevariablescomeintothepicture.Variablesareexactlywhatthenameimplies-theirvaluecanvary,i.e.,youcanstoreanythingusingavariable.Variablesarejustpartsofyourcomputer'smemorywhereyoustoresomeinformation.Unlikeliteralconstants,youneedsomemethodofaccessingthesevariablesandhenceyougivethemnames.
IdentifierNaming
Basics
36
Variablesareexamplesofidentifiers.Identifiersarenamesgiventoidentifysomething.Therearesomerulesyouhavetofollowfornamingidentifiers:
Thefirstcharacteroftheidentifiermustbealetterofthealphabet(uppercaseASCIIorlowercaseASCIIorUnicodecharacter)oranunderscore(_).Therestoftheidentifiernamecanconsistofletters(uppercaseASCIIorlowercaseASCIIorUnicodecharacter),underscores(_)ordigits(0-9).Identifiernamesarecase-sensitive.Forexample,mynameandmyNamearenotthesame.NotethelowercasenintheformerandtheuppercaseNinthelatter.Examplesofvalididentifiernamesarei,name_2_3.Examplesofinvalididentifiernamesare2things,thisisspacedout,my-nameand>a1b2_c3.
DataTypesVariablescanholdvaluesofdifferenttypescalleddatatypes.Thebasictypesarenumbersandstrings,whichwehavealreadydiscussed.Inlaterchapters,wewillseehowtocreateourowntypesusingclasses.
ObjectRemember,Pythonreferstoanythingusedinaprogramasanobject.Thisismeantinthegenericsense.Insteadofsaying"thesomething"',wesay"theobject".
NoteforObjectOrientedProgrammingusers:
Pythonisstronglyobject-orientedinthesensethateverythingisanobjectincludingnumbers,stringsandfunctions.
Wewillnowseehowtousevariablesalongwithliteralconstants.Savethefollowingexampleandruntheprogram.
HowtowritePythonprogramsHenceforth,thestandardproceduretosaveandrunaPythonprogramisasfollows:
ForPyCharm
1. OpenPyCharm.2. Createnewfilewiththefilenamementioned.3. Typetheprogramcodegivenintheexample.
Basics
37
4. Right-clickandrunthecurrentfile.
NOTE:Wheneveryouhavetoprovidecommandlinearguments,clickonRun->EditConfigurationsandtypetheargumentsintheScriptparameters:sectionandclicktheOKbutton:
Forothereditors
1. Openyoureditorofchoice.2. Typetheprogramcodegivenintheexample.3. Saveitasafilewiththefilenamementioned.4. Runtheinterpreterwiththecommandpythonprogram.pytoruntheprogram.
Example:UsingVariablesAndLiteralConstants
Typeandrunthefollowingprogram:
#Filename:var.py
i=5
print(i)
i=i+1
print(i)
s='''Thisisamulti-linestring.
Thisisthesecondline.'''
print(s)
Basics
38
Output:
5
6
Thisisamulti-linestring.
Thisisthesecondline.
HowItWorks
Here'showthisprogramworks.First,weassigntheliteralconstantvalue5tothevariableiusingtheassignmentoperator(=).Thislineiscalledastatementbecauseitstatesthatsomethingshouldbedoneandinthiscase,weconnectthevariablenameitothevalue5.Next,weprintthevalueofiusingtheprintstatementwhich,unsurprisingly,justprintsthevalueofthevariabletothescreen.
Thenweadd1tothevaluestorediniandstoreitback.Wethenprintitandexpectedly,wegetthevalue6.
Similarly,weassigntheliteralstringtothevariablesandthenprintit.
Noteforstaticlanguageprogrammers
Variablesareusedbyjustassigningthemavalue.Nodeclarationordatatypedefinitionisneeded/used.
LogicalAndPhysicalLineAphysicallineiswhatyouseewhenyouwritetheprogram.AlogicallineiswhatPythonseesasasinglestatement.Pythonimplicitlyassumesthateachphysicallinecorrespondstoalogicalline.
Anexampleofalogicallineisastatementlikeprint'helloworld'-ifthiswasonalinebyitself(asyouseeitinaneditor),thenthisalsocorrespondstoaphysicalline.
Implicitly,Pythonencouragestheuseofasinglestatementperlinewhichmakescodemorereadable.
Ifyouwanttospecifymorethanonelogicallineonasinglephysicalline,thenyouhavetoexplicitlyspecifythisusingasemicolon(;)whichindicatestheendofalogicalline/statement.Forexample:
i=5
print(i)
Basics
39
iseffectivelysameas
i=5;
print(i);
whichisalsosameas
i=5;print(i);
andsameas
i=5;print(i)
However,Istronglyrecommendthatyousticktowritingamaximumofasinglelogicallineoneachsinglephysicalline.Theideaisthatyoushouldneverusethesemicolon.Infact,IhaveneverusedorevenseenasemicoloninaPythonprogram.
Thereisonekindofsituationwherethisconceptisreallyuseful:ifyouhavealonglineofcode,youcanbreakitintomultiplephysicallinesbyusingthebackslash.Thisisreferredtoasexplicitlinejoining:
s='Thisisastring.\
Thiscontinuesthestring.'
print(s)
Output:
Thisisastring.Thiscontinuesthestring.
Similarly,
i=\
5
isthesameas
i=5
Sometimes,thereisanimplicitassumptionwhereyoudon'tneedtouseabackslash.Thisisthecasewherethelogicallinehasastartingparentheses,startingsquarebracketsorastartingcurlybracesbutnotanendingone.Thisiscalledimplicitlinejoining.Youcansee
Basics
40
thisinactionwhenwewriteprogramsusinglistinlaterchapters.
IndentationWhitespaceisimportantinPython.Actually,whitespaceatthebeginningofthelineisimportant.Thisiscalledindentation.Leadingwhitespace(spacesandtabs)atthebeginningofthelogicallineisusedtodeterminetheindentationlevelofthelogicalline,whichinturnisusedtodeterminethegroupingofstatements.
Thismeansthatstatementswhichgotogethermusthavethesameindentation.Eachsuchsetofstatementsiscalledablock.Wewillseeexamplesofhowblocksareimportantinlaterchapters.
Onethingyoushouldrememberisthatwrongindentationcangiverisetoerrors.Forexample:
i=5
#Errorbelow!Noticeasinglespaceatthestartoftheline
print('Valueis',i)
print('Irepeat,thevalueis',i)
Whenyourunthis,yougetthefollowingerror:
File"whitespace.py",line3
print('Valueis',i)
^
IndentationError:unexpectedindent
Noticethatthereisasinglespaceatthebeginningofthesecondline.TheerrorindicatedbyPythontellsusthatthesyntaxoftheprogramisinvalidi.e.theprogramwasnotproperlywritten.Whatthismeanstoyouisthatyoucannotarbitrarilystartnewblocksofstatements(exceptforthedefaultmainblockwhichyouhavebeenusingallalong,ofcourse).Caseswhereyoucanusenewblockswillbedetailedinlaterchapterssuchasthecontrolflow.
Howtoindent
Usefourspacesforindentation.ThisistheofficialPythonlanguagerecommendation.Goodeditorswillautomaticallydothisforyou.Makesureyouuseaconsistentnumberofspacesforindentation,otherwiseyourprogramwillnotrunorwillhaveunexpectedbehavior.
Basics
41
Notetostaticlanguageprogrammers
Pythonwillalwaysuseindentationforblocksandwillneverusebraces.Runfrom__future__importbracestolearnmore.
SummaryNowthatwehavegonethroughmanynitty-grittydetails,wecanmoveontomoreinterestingstuffsuchascontrolflowstatements.Besuretobecomecomfortablewithwhatyouhavereadinthischapter.
Basics
42
OperatorsandExpressionsMoststatements(logicallines)thatyouwritewillcontainexpressions.Asimpleexampleofanexpressionis2+3.Anexpressioncanbebrokendownintooperatorsandoperands.
Operatorsarefunctionalitythatdosomethingandcanberepresentedbysymbolssuchas+orbyspecialkeywords.Operatorsrequiresomedatatooperateonandsuchdataiscalledoperands.Inthiscase,2and3aretheoperands.
OperatorsWewillbrieflytakealookattheoperatorsandtheirusage.
Notethatyoucanevaluatetheexpressionsgivenintheexamplesusingtheinterpreterinteractively.Forexample,totesttheexpression2+3,usetheinteractivePythoninterpreterprompt:
>>>2+3
5
>>>3*5
15
>>>
Hereisaquickoverviewoftheavailableoperators:
+(plus)
Addstwoobjects3+5gives8.'a'+'b'gives'ab'.
-(minus)
Givesthesubtractionofonenumberfromtheother;ifthefirstoperandisabsentitisassumedtobezero.-5.2givesanegativenumberand50-24gives26.
*(multiply)
Givesthemultiplicationofthetwonumbersorreturnsthestringrepeatedthatmanytimes.2*3gives6.'la'*3gives'lalala'.
**(power)
Returnsxtothepowerofy
OperatorsandExpressions
43
3**4gives81(i.e.3*3*3*3)/(divide)
Dividexbyy13/3gives4.333333333333333
//(divideandfloor)
Dividexbyyandroundtheanswerdowntothenearestwholenumber13//3gives4-13//3gives-5
%(modulo)
Returnstheremainderofthedivision13%3gives1.-25.5%2.25gives1.5.
<<(leftshift)
Shiftsthebitsofthenumbertotheleftbythenumberofbitsspecified.(Eachnumberisrepresentedinmemorybybitsorbinarydigitsi.e.0and1)2<<2gives8.2isrepresentedby10inbits.Leftshiftingby2bitsgives1000whichrepresentsthedecimal8.
>>(rightshift)
Shiftsthebitsofthenumbertotherightbythenumberofbitsspecified.11>>1gives5.11isrepresentedinbitsby1011whichwhenrightshiftedby1bitgives101whichisthedecimal5.
&(bit-wiseAND)
Bit-wiseANDofthenumbers5&3gives1.
|(bit-wiseOR)
BitwiseORofthenumbers5|3gives7
(bit-wiseXOR)
BitwiseXORofthenumbers5^3gives6
~(bit-wiseinvert)
Thebit-wiseinversionofxis-(x+1)~5gives-6.Moredetailsathttp://stackoverflow.com/a/11810203
<(lessthan)
Returnswhetherxislessthany.AllcomparisonoperatorsreturnTrueorFalse.
OperatorsandExpressions
44
Notethecapitalizationofthesenames.5<3givesFalseand3<5givesTrue.Comparisonscanbechainedarbitrarily:3<5<7givesTrue.
>(greaterthan)
Returnswhetherxisgreaterthany5>3returnsTrue.Ifbothoperandsarenumbers,theyarefirstconvertedtoacommontype.Otherwise,italwaysreturnsFalse.
<=(lessthanorequalto)
Returnswhetherxislessthanorequaltoyx=3;y=6;x<=yreturnsTrue
>=(greaterthanorequalto)
Returnswhetherxisgreaterthanorequaltoyx=4;y=3;x>=3returnsTrue
==(equalto)
Comparesiftheobjectsareequalx=2;y=2;x==yreturnsTruex='str';y='stR';x==yreturnsFalsex='str';y='str';x==yreturnsTrue
!=(notequalto)
Comparesiftheobjectsarenotequalx=2;y=3;x!=yreturnsTrue
not(booleanNOT)
IfxisTrue,itreturnsFalse.IfxisFalse,itreturnsTrue.x=True;notxreturnsFalse.
and(booleanAND)
xandyreturnsFalseifxisFalse,elseitreturnsevaluationofyx=False;y=True;xandyreturnsFalsesincexisFalse.Inthiscase,Pythonwillnotevaluateysinceitknowsthatthelefthandsideofthe'and'expressionisFalsewhichimpliesthatthewholeexpressionwillbeFalseirrespectiveoftheothervalues.Thisiscalledshort-circuitevaluation.
or(booleanOR)
IfxisTrue,itreturnsTrue,elseitreturnsevaluationofyx=True;y=False;xoryreturnsTrue.Short-circuitevaluationapplieshereaswell.
OperatorsandExpressions
45
ShortcutformathoperationandassignmentItiscommontorunamathoperationonavariableandthenassigntheresultoftheoperationbacktothevariable,hencethereisashortcutforsuchexpressions:
a=2
a=a*3
canbewrittenas:
a=2
a*=3
Noticethatvar=varoperationexpressionbecomesvaroperation=expression.
EvaluationOrderIfyouhadanexpressionsuchas2+3*4,istheadditiondonefirstorthemultiplication?Ourhighschoolmathstellsusthatthemultiplicationshouldbedonefirst.Thismeansthatthemultiplicationoperatorhashigherprecedencethantheadditionoperator.
ThefollowingtablegivestheprecedencetableforPython,fromthelowestprecedence(leastbinding)tothehighestprecedence(mostbinding).Thismeansthatinagivenexpression,Pythonwillfirstevaluatetheoperatorsandexpressionslowerinthetablebeforetheoneslistedhigherinthetable.
Thefollowingtable,takenfromthePythonreferencemanual,isprovidedforthesakeofcompleteness.Itisfarbettertouseparenthesestogroupoperatorsandoperandsappropriatelyinordertoexplicitlyspecifytheprecedence.Thismakestheprogrammorereadable.SeeChangingtheOrderofEvaluationbelowfordetails.
lambda:LambdaExpressionif-else:Conditionalexpressionor:BooleanORand:BooleanANDnotx:BooleanNOTin,notin,is,isnot,<,<=,>,>=,!=,==:Comparisons,includingmembershiptestsandidentitytests|:BitwiseOR :BitwiseXOR&:BitwiseAND
OperatorsandExpressions
46
<<,>>:Shifts+,-:Additionandsubtraction*,/,//,%:Multiplication,Division,FloorDivisionandRemainder+x,-x,~x:Positive,Negative,bitwiseNOT**:Exponentiationx[index],x[index:index],x(arguments...),x.attribute:Subscription,slicing,call,attributereference(expressions...),[expressions...],{key:value...},{expressions...}:Bindingortupledisplay,listdisplay,dictionarydisplay,setdisplay
Theoperatorswhichwehavenotalreadycomeacrosswillbeexplainedinlaterchapters.
Operatorswiththesameprecedencearelistedinthesamerowintheabovetable.Forexample,+and-havethesameprecedence.
ChangingtheOrderOfEvaluationTomaketheexpressionsmorereadable,wecanuseparentheses.Forexample,2+(3*4)isdefinitelyeasiertounderstandthan2+3*4whichrequiresknowledgeoftheoperatorprecedences.Aswitheverythingelse,theparenthesesshouldbeusedreasonably(donotoverdoit)andshouldnotberedundant,asin(2+(3*4)).
Thereisanadditionaladvantagetousingparentheses-ithelpsustochangetheorderofevaluation.Forexample,ifyouwantadditiontobeevaluatedbeforemultiplicationinanexpression,thenyoucanwritesomethinglike(2+3)*4.
AssociativityOperatorsareusuallyassociatedfromlefttoright.Thismeansthatoperatorswiththesameprecedenceareevaluatedinalefttorightmanner.Forexample,2+3+4isevaluatedas(2+3)+4.
ExpressionsExample(saveasexpression.py):
OperatorsandExpressions
47
length=5
breadth=2
area=length*breadth
print('Areais',area)
print('Perimeteris',2*(length+breadth))
Output:
$pythonexpression.py
Areais10
Perimeteris14
HowItWorks
Thelengthandbreadthoftherectanglearestoredinvariablesbythesamename.Weusethesetocalculatetheareaandperimeteroftherectanglewiththehelpofexpressions.Westoretheresultoftheexpressionlength*breadthinthevariableareaandthenprintitusingtheprintfunction.Inthesecondcase,wedirectlyusethevalueoftheexpression2*(length+breadth)intheprintfunction.
Also,noticehowPythonpretty-printstheoutput.Eventhoughwehavenotspecifiedaspacebetween'Areais'andthevariablearea,Pythonputsitforussothatwegetacleanniceoutputandtheprogramismuchmorereadablethisway(sincewedon'tneedtoworryaboutspacinginthestringsweuseforoutput).ThisisanexampleofhowPythonmakeslifeeasyfortheprogrammer.
SummaryWehaveseenhowtouseoperators,operandsandexpressions-thesearethebasicbuildingblocksofanyprogram.Next,wewillseehowtomakeuseoftheseinourprogramsusingstatements.
OperatorsandExpressions
48
ControlFlowIntheprogramswehaveseentillnow,therehasalwaysbeenaseriesofstatementsfaithfullyexecutedbyPythoninexacttop-downorder.Whatifyouwantedtochangetheflowofhowitworks?Forexample,youwanttheprogramtotakesomedecisionsanddodifferentthingsdependingondifferentsituations,suchasprinting'GoodMorning'or'GoodEvening'dependingonthetimeoftheday?
Asyoumighthaveguessed,thisisachievedusingcontrolflowstatements.TherearethreecontrolflowstatementsinPython-if,forandwhile.
TheifstatementTheifstatementisusedtocheckacondition:iftheconditionistrue,werunablockofstatements(calledtheif-block),elseweprocessanotherblockofstatements(calledtheelse-block).Theelseclauseisoptional.
Example(saveasif.py):
number=23
guess=int(input('Enteraninteger:'))
ifguess==number:
#Newblockstartshere
print('Congratulations,youguessedit.')
print('(butyoudonotwinanyprizes!)')
#Newblockendshere
elifguess<number:
#Anotherblock
print('No,itisalittlehigherthanthat')
#Youcandowhateveryouwantinablock...
else:
print('No,itisalittlelowerthanthat')
#youmusthaveguessed>numbertoreachhere
print('Done')
#Thislaststatementisalwaysexecuted,
#aftertheifstatementisexecuted.
Output:
Controlflow
49
$pythonif.py
Enteraninteger:50
No,itisalittlelowerthanthat
Done
$pythonif.py
Enteraninteger:22
No,itisalittlehigherthanthat
Done
$pythonif.py
Enteraninteger:23
Congratulations,youguessedit.
(butyoudonotwinanyprizes!)
Done
HowItWorks
Inthisprogram,wetakeguessesfromtheuserandcheckifitisthenumberthatwehave.Wesetthevariablenumbertoanyintegerwewant,say23.Then,wetaketheuser'sguessusingtheinput()function.Functionsarejustreusablepiecesofprograms.We'llreadmoreabouttheminthenextchapter.
Wesupplyastringtothebuilt-ininputfunctionwhichprintsittothescreenandwaitsforinputfromtheuser.Onceweentersomethingandpresskbd:[enter]key,theinput()functionreturnswhatweentered,asastring.Wethenconvertthisstringtoanintegerusingintandthenstoreitinthevariableguess.Actually,theintisaclassbutallyouneedtoknowrightnowisthatyoucanuseittoconvertastringtoaninteger(assumingthestringcontainsavalidintegerinthetext).
Next,wecomparetheguessoftheuserwiththenumberwehavechosen.Iftheyareequal,weprintasuccessmessage.NoticethatweuseindentationlevelstotellPythonwhichstatementsbelongtowhichblock.ThisiswhyindentationissoimportantinPython.Ihopeyouarestickingtothe"consistentindentation"rule.Areyou?
Noticehowtheifstatementcontainsacolonattheend-weareindicatingtoPythonthatablockofstatementsfollows.
Then,wecheckiftheguessislessthanthenumber,andifso,weinformtheuserthattheymustguessalittlehigherthanthat.Whatwehaveusedhereistheelifclausewhichactuallycombinestworelatedifelse-ifelsestatementsintoonecombinedif-elif-elsestatement.Thismakestheprogrameasierandreducestheamountofindentationrequired.
Theelifandelsestatementsmustalsohaveacolonattheendofthelogicallinefollowedbytheircorrespondingblockofstatements(withproperindentation,ofcourse)
Controlflow
50
Youcanhaveanotherifstatementinsidetheif-blockofanifstatementandsoon-thisiscalledanestedifstatement.
Rememberthattheelifandelsepartsareoptional.Aminimalvalidifstatementis:
ifTrue:
print('Yes,itistrue')
AfterPythonhasfinishedexecutingthecompleteifstatementalongwiththeassociatedelifandelseclauses,itmovesontothenextstatementintheblockcontainingtheifstatement.Inthiscase,itisthemainblock(whereexecutionoftheprogramstarts),andthenextstatementistheprint('Done')statement.Afterthis,Pythonseestheendsoftheprogramandsimplyfinishesup.
Eventhoughthisisaverysimpleprogram,Ihavebeenpointingoutalotofthingsthatyoushouldnotice.Alltheseareprettystraightforward(andsurprisinglysimpleforthoseofyoufromC/C++backgrounds).Youwillneedtobecomeawareofallthesethingsinitially,butaftersomepracticeyouwillbecomecomfortablewiththem,anditwillallfeel'natural'toyou.
NoteforC/C++Programmers
ThereisnoswitchstatementinPython.Youcanuseanif..elif..elsestatementtodothesamething(andinsomecases,useadictionarytodoitquickly)
ThewhileStatementThewhilestatementallowsyoutorepeatedlyexecuteablockofstatementsaslongasaconditionistrue.Awhilestatementisanexampleofwhatiscalledaloopingstatement.Awhilestatementcanhaveanoptionalelseclause.
Example(saveaswhile.py):
Controlflow
51
number=23
running=True
whilerunning:
guess=int(input('Enteraninteger:'))
ifguess==number:
print('Congratulations,youguessedit.')
#thiscausesthewhilelooptostop
running=False
elifguess<number:
print('No,itisalittlehigherthanthat.')
else:
print('No,itisalittlelowerthanthat.')
else:
print('Thewhileloopisover.')
#Doanythingelseyouwanttodohere
print('Done')
Output:
$pythonwhile.py
Enteraninteger:50
No,itisalittlelowerthanthat.
Enteraninteger:22
No,itisalittlehigherthanthat.
Enteraninteger:23
Congratulations,youguessedit.
Thewhileloopisover.
Done
HowItWorks
Inthisprogram,wearestillplayingtheguessinggame,buttheadvantageisthattheuserisallowedtokeepguessinguntilheguessescorrectly-thereisnoneedtorepeatedlyruntheprogramforeachguess,aswehavedoneintheprevioussection.Thisaptlydemonstratestheuseofthewhilestatement.
WemovetheinputandifstatementstoinsidethewhileloopandsetthevariablerunningtoTruebeforethewhileloop.First,wecheckifthevariablerunningisTrueandthenproceedtoexecutethecorrespondingwhile-block.Afterthisblockisexecuted,theconditionisagaincheckedwhichinthiscaseistherunningvariable.Ifitistrue,weexecutethewhile-blockagain,elsewecontinuetoexecutetheoptionalelse-blockandthencontinuetothenextstatement.
Controlflow
52
TheelseblockisexecutedwhenthewhileloopconditionbecomesFalse-thismayevenbethefirsttimethattheconditionischecked.Ifthereisanelseclauseforawhileloop,itisalwaysexecutedunlessyoubreakoutoftheloopwithabreakstatement.
TheTrueandFalsearecalledBooleantypesandyoucanconsiderthemtobeequivalenttothevalue1and0respectively.
NoteforC/C++Programmers
Rememberthatyoucanhaveanelseclauseforthewhileloop.
TheforloopThefor..instatementisanotherloopingstatementwhichiteratesoverasequenceofobjectsi.e.gothrougheachiteminasequence.Wewillseemoreaboutsequencesindetailinlaterchapters.Whatyouneedtoknowrightnowisthatasequenceisjustanorderedcollectionofitems.
Example(saveasfor.py):
foriinrange(1,5):
print(i)
else:
print('Theforloopisover')
Output:
$pythonfor.py
1
2
3
4
Theforloopisover
HowItWorks
Inthisprogram,weareprintingasequenceofnumbers.Wegeneratethissequenceofnumbersusingthebuilt-inrangefunction.
Whatwedohereissupplyittwonumbersandrangereturnsasequenceofnumbersstartingfromthefirstnumberanduptothesecondnumber.Forexample,range(1,5)givesthesequence[1,2,3,4].Bydefault,rangetakesastepcountof1.Ifwesupplyathird
Controlflow
53
numbertorange,thenthatbecomesthestepcount.Forexample,range(1,5,2)gives[1,3].Rememberthattherangeextendsuptothesecondnumberi.e.itdoesnotincludethesecondnumber.
Notethatrange()generatesonlyonenumberatatime,ifyouwantthefulllistofnumbers,calllist()ontherange(),forexample,list(range(5))willresultin[0,1,2,3,4].Listsareexplainedinthedatastructureschapter.
Theforlooptheniteratesoverthisrange-foriinrange(1,5)isequivalenttoforiin[1,2,3,4]whichislikeassigningeachnumber(orobject)inthesequencetoi,oneatatime,andthenexecutingtheblockofstatementsforeachvalueofi.Inthiscase,wejustprintthevalueintheblockofstatements.
Rememberthattheelsepartisoptional.Whenincluded,itisalwaysexecutedonceaftertheforloopisoverunlessabreakstatementisencountered.
Rememberthatthefor..inloopworksforanysequence.Here,wehavealistofnumbersgeneratedbythebuilt-inrangefunction,butingeneralwecanuseanykindofsequenceofanykindofobjects!Wewillexplorethisideaindetailinlaterchapters.
NoteforC/C++/Java/C#Programmers
ThePythonforloopisradicallydifferentfromtheC/C++forloop.C#programmerswillnotethattheforloopinPythonissimilartotheforeachloopinC#.Javaprogrammerswillnotethatthesameissimilartofor(inti:IntArray)inJava1.5.
InC/C++,ifyouwanttowritefor(inti=0;i<5;i++),theninPythonyouwritejustforiinrange(0,5).Asyoucansee,theforloopissimpler,moreexpressiveandlesserrorproneinPython.
ThebreakStatementThebreakstatementisusedtobreakoutofaloopstatementi.e.stoptheexecutionofaloopingstatement,eveniftheloopconditionhasnotbecomeFalseorthesequenceofitemshasnotbeencompletelyiteratedover.
Animportantnoteisthatifyoubreakoutofafororwhileloop,anycorrespondingloopelseblockisnotexecuted.
Example(saveasbreak.py):
Controlflow
54
whileTrue:
s=input('Entersomething:')
ifs=='quit':
break
print('Lengthofthestringis',len(s))
print('Done')
Output:
$pythonbreak.py
Entersomething:Programmingisfun
Lengthofthestringis18
Entersomething:Whentheworkisdone
Lengthofthestringis21
Entersomething:ifyouwannamakeyourworkalsofun:
Lengthofthestringis37
Entersomething:usePython!
Lengthofthestringis11
Entersomething:quit
Done
HowItWorks
Inthisprogram,werepeatedlytaketheuser'sinputandprintthelengthofeachinputeachtime.Weareprovidingaspecialconditiontostoptheprogrambycheckingiftheuserinputis'quit'.Westoptheprogrambybreakingoutoftheloopandreachtheendoftheprogram.
Thelengthoftheinputstringcanbefoundoutusingthebuilt-inlenfunction.
Rememberthatthebreakstatementcanbeusedwiththeforloopaswell.
Swaroop'sPoeticPython
TheinputIhaveusedhereisaminipoemIhavewritten:
Programmingisfun
Whentheworkisdone
ifyouwannamakeyourworkalsofun:
usePython!
ThecontinueStatementThecontinuestatementisusedtotellPythontoskiptherestofthestatementsinthecurrentloopblockandtocontinuetothenextiterationoftheloop.
Controlflow
55
Example(saveascontinue.py):
whileTrue:
s=input('Entersomething:')
ifs=='quit':
break
iflen(s)<3:
print('Toosmall')
continue
print('Inputisofsufficientlength')
#Dootherkindsofprocessinghere...
Output:
$pythoncontinue.py
Entersomething:a
Toosmall
Entersomething:12
Toosmall
Entersomething:abc
Inputisofsufficientlength
Entersomething:quit
HowItWorks
Inthisprogram,weacceptinputfromtheuser,butweprocesstheinputstringonlyifitisatleast3characterslong.So,weusethebuilt-inlenfunctiontogetthelengthandifthelengthislessthan3,weskiptherestofthestatementsintheblockbyusingthecontinuestatement.Otherwise,therestofthestatementsintheloopareexecuted,doinganykindofprocessingwewanttodohere.
Notethatthecontinuestatementworkswiththeforloopaswell.
SummaryWehaveseenhowtousethethreecontrolflowstatements-if,whileandforalongwiththeirassociatedbreakandcontinuestatements.ThesearesomeofthemostcommonlyusedpartsofPythonandhence,becomingcomfortablewiththemisessential.
Next,wewillseehowtocreateandusefunctions.
Controlflow
56
FunctionsFunctionsarereusablepiecesofprograms.Theyallowyoutogiveanametoablockofstatements,allowingyoutorunthatblockusingthespecifiednameanywhereinyourprogramandanynumberoftimes.Thisisknownascallingthefunction.Wehavealreadyusedmanybuilt-infunctionssuchaslenandrange.
Thefunctionconceptisprobablythemostimportantbuildingblockofanynon-trivialsoftware(inanyprogramminglanguage),sowewillexplorevariousaspectsoffunctionsinthischapter.
Functionsaredefinedusingthedefkeyword.Afterthiskeywordcomesanidentifiernameforthefunction,followedbyapairofparentheseswhichmayenclosesomenamesofvariables,andbythefinalcolonthatendstheline.Nextfollowstheblockofstatementsthatarepartofthisfunction.Anexamplewillshowthatthisisactuallyverysimple:
Example(saveasfunction1.py):
defsay_hello():
#blockbelongingtothefunction
print('helloworld')
#Endoffunction
say_hello()#callthefunction
say_hello()#callthefunctionagain
Output:
$pythonfunction1.py
helloworld
helloworld
HowItWorks
Wedefineafunctioncalledsay_hellousingthesyntaxasexplainedabove.Thisfunctiontakesnoparametersandhencetherearenovariablesdeclaredintheparentheses.Parameterstofunctionsarejustinputtothefunctionsothatwecanpassindifferentvaluestoitandgetbackcorrespondingresults.
Noticethatwecancallthesamefunctiontwicewhichmeanswedonothavetowritethesamecodeagain.
Functions
57
FunctionParametersAfunctioncantakeparameters,whicharevaluesyousupplytothefunctionsothatthefunctioncandosomethingutilisingthosevalues.Theseparametersarejustlikevariablesexceptthatthevaluesofthesevariablesaredefinedwhenwecallthefunctionandarealreadyassignedvalueswhenthefunctionruns.
Parametersarespecifiedwithinthepairofparenthesesinthefunctiondefinition,separatedbycommas.Whenwecallthefunction,wesupplythevaluesinthesameway.Notetheterminologyused-thenamesgiveninthefunctiondefinitionarecalledparameterswhereasthevaluesyousupplyinthefunctioncallarecalledarguments.
Example(saveasfunction_param.py):
defprint_max(a,b):
ifa>b:
print(a,'ismaximum')
elifa==b:
print(a,'isequalto',b)
else:
print(b,'ismaximum')
#directlypassliteralvalues
print_max(3,4)
x=5
y=7
#passvariablesasarguments
print_max(x,y)
Output:
$pythonfunction_param.py
4ismaximum
7ismaximum
HowItWorks
Here,wedefineafunctioncalledprint_maxthatusestwoparameterscalledaandb.Wefindoutthegreaternumberusingasimpleif..elsestatementandthenprintthebiggernumber.
Thefirsttimewecallthefunctionprint_max,wedirectlysupplythenumbersasarguments.Inthesecondcase,wecallthefunctionwithvariablesasarguments.print_max(x,y)causesthevalueofargumentxtobeassignedtoparameteraandthevalueof
Functions
58
argumentytobeassignedtoparameterb.Theprint_maxfunctionworksthesamewayinbothcases.
LocalVariablesWhenyoudeclarevariablesinsideafunctiondefinition,theyarenotrelatedinanywaytoothervariableswiththesamenamesusedoutsidethefunction-i.e.variablenamesarelocaltothefunction.Thisiscalledthescopeofthevariable.Allvariableshavethescopeoftheblocktheyaredeclaredinstartingfromthepointofdefinitionofthename.
Example(saveasfunction_local.py):
x=50
deffunc(x):
print('xis',x)
x=2
print('Changedlocalxto',x)
func(x)
print('xisstill',x)
Output:
$pythonfunction_local.py
xis50
Changedlocalxto2
xisstill50
HowItWorks
Thefirsttimethatweprintthevalueofthenamexwiththefirstlineinthefunction'sbody,Pythonusesthevalueoftheparameterdeclaredinthemainblock,abovethefunctiondefinition.
Next,weassignthevalue2tox.Thenamexislocaltoourfunction.So,whenwechangethevalueofxinthefunction,thexdefinedinthemainblockremainsunaffected.
Withthelastprintstatement,wedisplaythevalueofxasdefinedinthemainblock,therebyconfirmingthatitisactuallyunaffectedbythelocalassignmentwithinthepreviouslycalledfunction.
Functions
59
TheglobalstatementIfyouwanttoassignavaluetoanamedefinedatthetopleveloftheprogram(i.e.notinsideanykindofscopesuchasfunctionsorclasses),thenyouhavetotellPythonthatthenameisnotlocal,butitisglobal.Wedothisusingtheglobalstatement.Itisimpossibletoassignavaluetoavariabledefinedoutsideafunctionwithouttheglobalstatement.
Youcanusethevaluesofsuchvariablesdefinedoutsidethefunction(assumingthereisnovariablewiththesamenamewithinthefunction).However,thisisnotencouragedandshouldbeavoidedsinceitbecomesuncleartothereaderoftheprogramastowherethatvariable'sdefinitionis.Usingtheglobalstatementmakesitamplyclearthatthevariableisdefinedinanoutermostblock.
Example(saveasfunction_global.py):
x=50
deffunc():
globalx
print('xis',x)
x=2
print('Changedglobalxto',x)
func()
print('Valueofxis',x)
Output:
$pythonfunction_global.py
xis50
Changedglobalxto2
Valueofxis2
HowItWorks
Theglobalstatementisusedtodeclarethatxisaglobalvariable-hence,whenweassignavaluetoxinsidethefunction,thatchangeisreflectedwhenweusethevalueofxinthemainblock.
Youcanspecifymorethanoneglobalvariableusingthesameglobalstatemente.g.globalx,y,z.
Functions
60
DefaultArgumentValuesForsomefunctions,youmaywanttomakesomeparametersoptionalandusedefaultvaluesincasetheuserdoesnotwanttoprovidevaluesforthem.Thisisdonewiththehelpofdefaultargumentvalues.Youcanspecifydefaultargumentvaluesforparametersbyappendingtotheparameternameinthefunctiondefinitiontheassignmentoperator(=)followedbythedefaultvalue.
Notethatthedefaultargumentvalueshouldbeaconstant.Moreprecisely,thedefaultargumentvalueshouldbeimmutable-thisisexplainedindetailinlaterchapters.Fornow,justrememberthis.
Example(saveasfunction_default.py):
defsay(message,times=1):
print(message*times)
say('Hello')
say('World',5)
Output:
$pythonfunction_default.py
Hello
WorldWorldWorldWorldWorld
HowItWorks
Thefunctionnamedsayisusedtoprintastringasmanytimesasspecified.Ifwedon'tsupplyavalue,thenbydefault,thestringisprintedjustonce.Weachievethisbyspecifyingadefaultargumentvalueof1totheparametertimes.
Inthefirstusageofsay,wesupplyonlythestringanditprintsthestringonce.Inthesecondusageofsay,wesupplyboththestringandanargument5statingthatwewanttosaythestringmessage5times.
CAUTION
Onlythoseparameterswhichareattheendoftheparameterlistcanbegivendefaultargumentvaluesi.e.youcannothaveaparameterwithadefaultargumentvalueprecedingaparameterwithoutadefaultargumentvalueinthefunction'sparameterlist.
Thisisbecausethevaluesareassignedtotheparametersbyposition.Forexample,deffunc(a,b=5)isvalid,butdeffunc(a=5,b)isnotvalid.
Functions
61
KeywordArgumentsIfyouhavesomefunctionswithmanyparametersandyouwanttospecifyonlysomeofthem,thenyoucangivevaluesforsuchparametersbynamingthem-thisiscalledkeywordarguments-weusethename(keyword)insteadoftheposition(whichwehavebeenusingallalong)tospecifytheargumentstothefunction.
Therearetwoadvantages-one,usingthefunctioniseasiersincewedonotneedtoworryabouttheorderofthearguments.Two,wecangivevaluestoonlythoseparameterstowhichwewantto,providedthattheotherparametershavedefaultargumentvalues.
Example(saveasfunction_keyword.py):
deffunc(a,b=5,c=10):
print('ais',a,'andbis',b,'andcis',c)
func(3,7)
func(25,c=24)
func(c=50,a=100)
Output:
$pythonfunction_keyword.py
ais3andbis7andcis10
ais25andbis5andcis24
ais100andbis5andcis50
HowItWorks
Thefunctionnamedfunchasoneparameterwithoutadefaultargumentvalue,followedbytwoparameterswithdefaultargumentvalues.
Inthefirstusage,func(3,7),theparameteragetsthevalue3,theparameterbgetsthevalue7andcgetsthedefaultvalueof10.
Inthesecondusagefunc(25,c=24),thevariableagetsthevalueof25duetothepositionoftheargument.Then,theparametercgetsthevalueof24duetonamingi.e.keywordarguments.Thevariablebgetsthedefaultvalueof5.
Inthethirdusagefunc(c=50,a=100),weusekeywordargumentsforallspecifiedvalues.Noticethatwearespecifyingthevalueforparametercbeforethatforaeventhoughaisdefinedbeforecinthefunctiondefinition.
VarArgsparameters
Functions
62
Sometimesyoumightwanttodefineafunctionthatcantakeanynumberofparameters,i.e.variablenumberofarguments,thiscanbeachievedbyusingthestars(saveasfunction_varargs.py):
deftotal(a=5,*numbers,**phonebook):
print('a',a)
#iteratethroughalltheitemsintuple
forsingle_iteminnumbers:
print('single_item',single_item)
#iteratethroughalltheitemsindictionary
forfirst_part,second_partinphonebook.items():
print(first_part,second_part)
print(total(10,1,2,3,Jack=1123,John=2231,Inge=1560))
Output:
$pythonfunction_varargs.py
a10
single_item1
single_item2
single_item3
Inge1560
John2231
Jack1123
None
HowItWorks
Whenwedeclareastarredparametersuchas*param,thenallthepositionalargumentsfromthatpointtilltheendarecollectedasatuplecalled'param'.
Similarly,whenwedeclareadouble-starredparametersuchas**param,thenallthekeywordargumentsfromthatpointtilltheendarecollectedasadictionarycalled'param'.
Wewillexploretuplesanddictionariesinalaterchapter.
ThereturnstatementThereturnstatementisusedtoreturnfromafunctioni.e.breakoutofthefunction.Wecanoptionallyreturnavaluefromthefunctionaswell.
Example(saveasfunction_return.py):
Functions
63
defmaximum(x,y):
ifx>y:
returnx
elifx==y:
return'Thenumbersareequal'
else:
returny
print(maximum(2,3))
Output:
$pythonfunction_return.py
3
HowItWorks
Themaximumfunctionreturnsthemaximumoftheparameters,inthiscasethenumberssuppliedtothefunction.Itusesasimpleif..elsestatementtofindthegreatervalueandthenreturnsthatvalue.
NotethatareturnstatementwithoutavalueisequivalenttoreturnNone.NoneisaspecialtypeinPythonthatrepresentsnothingness.Forexample,itisusedtoindicatethatavariablehasnovalueifithasavalueofNone.
EveryfunctionimplicitlycontainsareturnNonestatementattheendunlessyouhavewrittenyourownreturnstatement.Youcanseethisbyrunningprint(some_function())wherethefunctionsome_functiondoesnotusethereturnstatementsuchas:
defsome_function():
pass
ThepassstatementisusedinPythontoindicateanemptyblockofstatements.
TIP:Thereisabuilt-infunctioncalledmaxthatalreadyimplementsthe'findmaximum'functionality,sousethisbuilt-infunctionwheneverpossible.
DocStringsPythonhasaniftyfeaturecalleddocumentationstrings,usuallyreferredtobyitsshorternamedocstrings.DocStringsareanimportanttoolthatyoushouldmakeuseofsinceithelpstodocumenttheprogrambetterandmakesiteasiertounderstand.Amazingly,wecanevengetthedocstringbackfrom,sayafunction,whentheprogramisactuallyrunning!
Functions
64
Example(saveasfunction_docstring.py):
defprint_max(x,y):
'''Printsthemaximumoftwonumbers.
Thetwovaluesmustbeintegers.'''
#converttointegers,ifpossible
x=int(x)
y=int(y)
ifx>y:
print(x,'ismaximum')
else:
print(y,'ismaximum')
print_max(3,5)
print(print_max.__doc__)
Output:
$pythonfunction_docstring.py
5ismaximum
Printsthemaximumoftwonumbers.
Thetwovaluesmustbeintegers.
HowItWorks
Astringonthefirstlogicallineofafunctionisthedocstringforthatfunction.NotethatDocStringsalsoapplytomodulesandclasseswhichwewilllearnaboutintherespectivechapters.
Theconventionfollowedforadocstringisamulti-linestringwherethefirstlinestartswithacapitalletterandendswithadot.Thenthesecondlineisblankfollowedbyanydetailedexplanationstartingfromthethirdline.Youarestronglyadvisedtofollowthisconventionforallyourdocstringsforallyournon-trivialfunctions.
Wecanaccessthedocstringoftheprint_maxfunctionusingthe__doc__(noticethedoubleunderscores)attribute(namebelongingto)ofthefunction.JustrememberthatPythontreatseverythingasanobjectandthisincludesfunctions.We'lllearnmoreaboutobjectsinthechapteronclasses.
Ifyouhaveusedhelp()inPython,thenyouhavealreadyseentheusageofdocstrings!Whatitdoesisjustfetchthe__doc__attributeofthatfunctionanddisplaysitinaneatmannerforyou.Youcantryitoutonthefunctionabove-justincludehelp(print_max)inyourprogram.Remembertopresstheqkeytoexithelp.
Functions
65
Automatedtoolscanretrievethedocumentationfromyourprograminthismanner.Therefore,Istronglyrecommendthatyouusedocstringsforanynon-trivialfunctionthatyouwrite.ThepydoccommandthatcomeswithyourPythondistributionworkssimilarlytohelp()usingdocstrings.
SummaryWehaveseensomanyaspectsoffunctionsbutnotethatwestillhaven'tcoveredallaspectsofthem.However,wehavealreadycoveredmostofwhatyou'lluseregardingPythonfunctionsonaneverydaybasis.
Next,wewillseehowtouseaswellascreatePythonmodules.
Functions
66
ModulesYouhaveseenhowyoucanreusecodeinyourprogrambydefiningfunctionsonce.Whatifyouwantedtoreuseanumberoffunctionsinotherprogramsthatyouwrite?Asyoumighthaveguessed,theanswerismodules.
Therearevariousmethodsofwritingmodules,butthesimplestwayistocreateafilewitha.pyextensionthatcontainsfunctionsandvariables.
AnothermethodistowritethemodulesinthenativelanguageinwhichthePythoninterpreteritselfwaswritten.Forexample,youcanwritemodulesintheCprogramminglanguageandwhencompiled,theycanbeusedfromyourPythoncodewhenusingthestandardPythoninterpreter.
Amodulecanbeimportedbyanotherprogramtomakeuseofitsfunctionality.ThisishowwecanusethePythonstandardlibraryaswell.First,wewillseehowtousethestandardlibrarymodules.
Example(saveasmodule_using_sys.py):
importsys
print('Thecommandlineargumentsare:')
foriinsys.argv:
print(i)
print('\n\nThePYTHONPATHis',sys.path,'\n')
Output:
$pythonmodule_using_sys.pywearearguments
Thecommandlineargumentsare:
module_using_sys.py
we
are
arguments
ThePYTHONPATHis['/tmp/py',
#manyentrieshere,notshownhere
'/Library/Python/2.7/site-packages',
'/usr/local/lib/python2.7/site-packages']
HowItWorks
Modules
67
First,weimportthesysmoduleusingtheimportstatement.Basically,thistranslatestoustellingPythonthatwewanttousethismodule.ThesysmodulecontainsfunctionalityrelatedtothePythoninterpreteranditsenvironmenti.e.thesystem.
WhenPythonexecutestheimportsysstatement,itlooksforthesysmodule.Inthiscase,itisoneofthebuilt-inmodules,andhencePythonknowswheretofindit.
Ifitwasnotacompiledmodulei.e.amodulewritteninPython,thenthePythoninterpreterwillsearchforitinthedirectorieslistedinitssys.pathvariable.Ifthemoduleisfound,thenthestatementsinthebodyofthatmodulearerunandthemoduleismadeavailableforyoutouse.Notethattheinitializationisdoneonlythefirsttimethatweimportamodule.
Theargvvariableinthesysmoduleisaccessedusingthedottednotationi.e.sys.argv.Itclearlyindicatesthatthisnameispartofthesysmodule.Anotheradvantageofthisapproachisthatthenamedoesnotclashwithanyargvvariableusedinyourprogram.
Thesys.argvvariableisalistofstrings(listsareexplainedindetailinalaterchapter.Specifically,thesys.argvcontainsthelistofcommandlineargumentsi.e.theargumentspassedtoyourprogramusingthecommandline.
IfyouareusinganIDEtowriteandruntheseprograms,lookforawaytospecifycommandlineargumentstotheprograminthemenus.
Here,whenweexecutepythonmodule_using_sys.pywearearguments,werunthemodulemodule_using_sys.pywiththepythoncommandandtheotherthingsthatfollowareargumentspassedtotheprogram.Pythonstoresthecommandlineargumentsinthesys.argvvariableforustouse.
Remember,thenameofthescriptrunningisalwaysthefirstelementinthesys.argvlist.So,inthiscasewewillhave'module_using_sys.py'assys.argv[0],'we'assys.argv[1],'are'assys.argv[2]and'arguments'assys.argv[3].NoticethatPythonstartscountingfrom0andnot1.
Thesys.pathcontainsthelistofdirectorynameswheremodulesareimportedfrom.Observethatthefirststringinsys.pathisempty-thisemptystringindicatesthatthecurrentdirectoryisalsopartofthesys.pathwhichissameasthePYTHONPATHenvironmentvariable.Thismeansthatyoucandirectlyimportmoduleslocatedinthecurrentdirectory.Otherwise,youwillhavetoplaceyourmoduleinoneofthedirectorieslistedinsys.path.
Notethatthecurrentdirectoryisthedirectoryfromwhichtheprogramislaunched.Runimportos;print(os.getcwd())tofindoutthecurrentdirectoryofyourprogram.
Byte-compiled.pycfiles
Modules
68
Importingamoduleisarelativelycostlyaffair,soPythondoessometrickstomakeitfaster.Onewayistocreatebyte-compiledfileswiththeextension.pycwhichisanintermediateformthatPythontransformstheprograminto(remembertheintroductionsectiononhowPythonworks?).This.pycfileisusefulwhenyouimportthemodulethenexttimefromadifferentprogram-itwillbemuchfastersinceaportionoftheprocessingrequiredinimportingamoduleisalreadydone.Also,thesebyte-compiledfilesareplatform-independent.
NOTE:These.pycfilesareusuallycreatedinthesamedirectoryasthecorresponding.pyfiles.IfPythondoesnothavepermissiontowritetofilesinthatdirectory,thenthe.pycfileswillnotbecreated.
Thefrom..importstatementIfyouwanttodirectlyimporttheargvvariableintoyourprogram(toavoidtypingthesys.everytimeforit),thenyoucanusethefromsysimportargvstatement.
WARNING:Ingeneral,avoidusingthefrom..importstatement,usetheimportstatementinstead.Thisisbecauseyourprogramwillavoidnameclashesandwillbemorereadable.
Example:
frommathimportsqrt
print("Squarerootof16is",sqrt(16))
Amodule's__name__Everymodulehasanameandstatementsinamodulecanfindoutthenameoftheirmodule.Thisishandyfortheparticularpurposeoffiguringoutwhetherthemoduleisbeingrunstandaloneorbeingimported.Asmentionedpreviously,whenamoduleisimportedforthefirsttime,thecodeitcontainsgetsexecuted.Wecanusethistomakethemodulebehaveindifferentwaysdependingonwhetheritisbeingusedbyitselforbeingimportedfromanothermodule.Thiscanbeachievedusingthe__name__attributeofthemodule.
Example(saveasmodule_using_name.py):
if__name__=='__main__':
print('Thisprogramisbeingrunbyitself')
else:
print('Iambeingimportedfromanothermodule')
Modules
69
Output:
$pythonmodule_using_name.py
Thisprogramisbeingrunbyitself
$python
>>>importmodule_using_name
Iambeingimportedfromanothermodule
>>>
HowItWorks
EveryPythonmodulehasits__name__defined.Ifthisis'__main__',thatimpliesthatthemoduleisbeingrunstandalonebytheuserandwecantakeappropriateactions.
MakingYourOwnModulesCreatingyourownmodulesiseasy,you'vebeendoingitallalong!ThisisbecauseeveryPythonprogramisalsoamodule.Youjusthavetomakesureithasa.pyextension.Thefollowingexampleshouldmakeitclear.
Example(saveasmymodule.py):
defsay_hi():
print('Hi,thisismymodulespeaking.')
__version__='0.1'
Theabovewasasamplemodule.Asyoucansee,thereisnothingparticularlyspecialaboutitcomparedtoourusualPythonprogram.WewillnextseehowtousethismoduleinourotherPythonprograms.
Rememberthatthemoduleshouldbeplacedeitherinthesamedirectoryastheprogramfromwhichweimportit,orinoneofthedirectorieslistedinsys.path.
Anothermodule(saveasmymodule_demo.py):
importmymodule
mymodule.say_hi()
print('Version',mymodule.__version__)
Output:
Modules
70
$pythonmymodule_demo.py
Hi,thisismymodulespeaking.
Version0.1
HowItWorks
Noticethatweusethesamedottednotationtoaccessmembersofthemodule.Pythonmakesgoodreuseofthesamenotationtogivethedistinctive'Pythonic'feeltoitsothatwedon'thavetokeeplearningnewwaystodothings.
Hereisaversionutilisingthefrom..importsyntax(saveasmymodule_demo2.py):
frommymoduleimportsay_hi,__version__
say_hi()
print('Version',__version__)
Theoutputofmymodule_demo2.pyissameastheoutputofmymodule_demo.py.
Noticethatiftherewasalreadya__version__namedeclaredinthemodulethatimportsmymodule,therewouldbeaclash.Thisisalsolikelybecauseitiscommonpracticeforeachmoduletodeclareit'sversionnumberusingthisname.Hence,itisalwaysrecommendedtoprefertheimportstatementeventhoughitmightmakeyourprogramalittlelonger.
Youcouldalsouse:
frommymoduleimport*
Thiswillimportallpublicnamessuchassay_hibutwouldnotimport__version__becauseitstartswithdoubleunderscores.
WARNING:Rememberthatyoushouldavoidusingimport-star,i.e.frommymoduleimport*.
ZenofPython
OneofPython'sguidingprinciplesisthat"ExplicitisbetterthanImplicit".RunimportthisinPythontolearnmore.
ThedirfunctionBuilt-indir()functionreturnslistofnamesdefinedbyanobject.Iftheobjectisamodule,thislistincludesfunctions,classesandvariables,definedinsidethatmodule.
Modules
71
Thisfunctioncanacceptarguments.Iftheargumentisthenameofthemodule,functionreturnslistofnamesfromthatspecifiedmodule.Ifthereisnoargument,functionreturnslistofnamesfromthecurrentmodule.
Example:
$python
>>>importsys
#getnamesofattributesinsysmodule
>>>dir(sys)
['__displayhook__','__doc__',
'argv','builtin_module_names',
'version','version_info']
#onlyfewentriesshownhere
#getnamesofattributesforcurrentmodule
>>>dir()
['__builtins__','__doc__',
'__name__','__package__']
#createanewvariable'a'
>>>a=5
>>>dir()
['__builtins__','__doc__','__name__','__package__','a']
#delete/removeaname
>>>dela
>>>dir()
['__builtins__','__doc__','__name__','__package__']
HowItWorks
First,weseetheusageofdirontheimportedsysmodule.Wecanseethehugelistofattributesthatitcontains.
Next,weusethedirfunctionwithoutpassingparameterstoit.Bydefault,itreturnsthelistofattributesforthecurrentmodule.Noticethatthelistofimportedmodulesisalsopartofthislist.
Inordertoobservethedirinaction,wedefineanewvariableaandassignitavalueandthencheckdirandweobservethatthereisanadditionalvalueinthelistofthesamename.Weremovethevariable/attributeofthecurrentmoduleusingthedelstatementandthechangeisreflectedagainintheoutputofthedirfunction.
Modules
72
Anoteondel-thisstatementisusedtodeleteavariable/nameandafterthestatementhasrun,inthiscasedela,youcannolongeraccessthevariablea-itisasifitneverexistedbeforeatall.
Notethatthedir()functionworksonanyobject.Forexample,rundir(str)fortheattributesofthestr(string)class.
Thereisalsoavars()functionwhichcanpotentiallygiveyoutheattributesandtheirvalues,butitwillnotworkforallcases.
PackagesBynow,youmusthavestartedobservingthehierarchyoforganizingyourprograms.Variablesusuallygoinsidefunctions.Functionsandglobalvariablesusuallygoinsidemodules.Whatifyouwantedtoorganizemodules?That'swherepackagescomeintothepicture.
Packagesarejustfoldersofmoduleswithaspecial__init__.pyfilethatindicatestoPythonthatthisfolderisspecialbecauseitcontainsPythonmodules.
Let'ssayyouwanttocreateapackagecalled'world'withsubpackages'asia','africa',etc.andthesesubpackagesinturncontainmoduleslike'india','madagascar',etc.
Thisishowyouwouldstructurethefolders:
-<somefolderpresentinthesys.path>/
-world/
-__init__.py
-asia/
-__init__.py
-india/
-__init__.py
-foo.py
-africa/
-__init__.py
-madagascar/
-__init__.py
-bar.py
Packagesarejustaconveniencetohierarchicallyorganizemodules.Youwillseemanyinstancesofthisinthestandardlibrary.
Summary
Modules
73
Justlikefunctionsarereusablepartsofprograms,modulesarereusableprograms.Packagesareanotherhierarchytoorganizemodules.ThestandardlibrarythatcomeswithPythonisanexampleofsuchasetofpackagesandmodules.
Wehaveseenhowtousethesemodulesandcreateourownmodules.
Next,wewilllearnaboutsomeinterestingconceptscalleddatastructures.
Modules
74
DataStructuresDatastructuresarebasicallyjustthat-theyarestructureswhichcanholdsomedatatogether.Inotherwords,theyareusedtostoreacollectionofrelateddata.
Therearefourbuilt-indatastructuresinPython-list,tuple,dictionaryandset.Wewillseehowtouseeachofthemandhowtheymakelifeeasierforus.
ListAlistisadatastructurethatholdsanorderedcollectionofitemsi.e.youcanstoreasequenceofitemsinalist.Thisiseasytoimagineifyoucanthinkofashoppinglistwhereyouhavealistofitemstobuy,exceptthatyouprobablyhaveeachitemonaseparatelineinyourshoppinglistwhereasinPythonyouputcommasinbetweenthem.
ThelistofitemsshouldbeenclosedinsquarebracketssothatPythonunderstandsthatyouarespecifyingalist.Onceyouhavecreatedalist,youcanadd,removeorsearchforitemsinthelist.Sincewecanaddandremoveitems,wesaythatalistisamutabledatatypei.e.thistypecanbealtered.
QuickIntroductionToObjectsAndClassesAlthoughI'vebeengenerallydelayingthediscussionofobjectsandclassestillnow,alittleexplanationisneededrightnowsothatyoucanunderstandlistsbetter.Wewillexplorethistopicindetailinalaterchapter.
Alistisanexampleofusageofobjectsandclasses.Whenweuseavariableiandassignavaluetoit,sayinteger5toit,youcanthinkofitascreatinganobject(i.e.instance)iofclass(i.e.type)int.Infact,youcanreadhelp(int)tounderstandthisbetter.
Aclasscanalsohavemethodsi.e.functionsdefinedforusewithrespecttothatclassonly.Youcanusethesepiecesoffunctionalityonlywhenyouhaveanobjectofthatclass.Forexample,Pythonprovidesanappendmethodforthelistclasswhichallowsyoutoaddanitemtotheendofthelist.Forexample,mylist.append('anitem')willaddthatstringtothelistmylist.Notetheuseofdottednotationforaccessingmethodsoftheobjects.
Aclasscanalsohavefieldswhicharenothingbutvariablesdefinedforusewithrespecttothatclassonly.Youcanusethesevariables/namesonlywhenyouhaveanobjectofthatclass.Fieldsarealsoaccessedbythedottednotation,forexample,mylist.field.
DataStructures
75
Example(saveasds_using_list.py):
#Thisismyshoppinglist
shoplist=['apple','mango','carrot','banana']
print('Ihave',len(shoplist),'itemstopurchase.')
print('Theseitemsare:',end='')
foriteminshoplist:
print(item,end='')
print('\nIalsohavetobuyrice.')
shoplist.append('rice')
print('Myshoppinglistisnow',shoplist)
print('Iwillsortmylistnow')
shoplist.sort()
print('Sortedshoppinglistis',shoplist)
print('ThefirstitemIwillbuyis',shoplist[0])
olditem=shoplist[0]
delshoplist[0]
print('Iboughtthe',olditem)
print('Myshoppinglistisnow',shoplist)
Output:
$pythonds_using_list.py
Ihave4itemstopurchase.
Theseitemsare:applemangocarrotbanana
Ialsohavetobuyrice.
Myshoppinglistisnow['apple','mango','carrot','banana','rice']
Iwillsortmylistnow
Sortedshoppinglistis['apple','banana','carrot','mango','rice']
ThefirstitemIwillbuyisapple
Iboughttheapple
Myshoppinglistisnow['banana','carrot','mango','rice']
HowItWorks
Thevariableshoplistisashoppinglistforsomeonewhoisgoingtothemarket.Inshoplist,weonlystorestringsofthenamesoftheitemstobuybutyoucanaddanykindofobjecttoalistincludingnumbersandevenotherlists.
Wehavealsousedthefor..inlooptoiteratethroughtheitemsofthelist.Bynow,youmusthaverealisedthatalistisalsoasequence.Thespecialityofsequenceswillbediscussedinalatersection.
DataStructures
76
Noticetheuseoftheendparameterinthecalltoprintfunctiontoindicatethatwewanttoendtheoutputwithaspaceinsteadoftheusuallinebreak.
Next,weaddanitemtothelistusingtheappendmethodofthelistobject,asalreadydiscussedbefore.Then,wecheckthattheitemhasbeenindeedaddedtothelistbyprintingthecontentsofthelistbysimplypassingthelisttotheprintfunctionwhichprintsitneatly.
Then,wesortthelistbyusingthesortmethodofthelist.Itisimportanttounderstandthatthismethodaffectsthelistitselfanddoesnotreturnamodifiedlist-thisisdifferentfromthewaystringswork.Thisiswhatwemeanbysayingthatlistsaremutableandthatstringsareimmutable.
Next,whenwefinishbuyinganiteminthemarket,wewanttoremoveitfromthelist.Weachievethisbyusingthedelstatement.Here,wementionwhichitemofthelistwewanttoremoveandthedelstatementremovesitfromthelistforus.Wespecifythatwewanttoremovethefirstitemfromthelistandhenceweusedelshoplist[0](rememberthatPythonstartscountingfrom0).
Ifyouwanttoknowallthemethodsdefinedbythelistobject,seehelp(list)fordetails.
TupleTuplesareusedtoholdtogethermultipleobjects.Thinkofthemassimilartolists,butwithouttheextensivefunctionalitythatthelistclassgivesyou.Onemajorfeatureoftuplesisthattheyareimmutablelikestringsi.e.youcannotmodifytuples.
Tuplesaredefinedbyspecifyingitemsseparatedbycommaswithinanoptionalpairofparentheses.
Tuplesareusuallyusedincaseswhereastatementorauser-definedfunctioncansafelyassumethatthecollectionofvaluesi.e.thetupleofvaluesusedwillnotchange.
Example(saveasds_using_tuple.py):
DataStructures
77
#Iwouldrecommendalwaysusingparentheses
#toindicatestartandendoftuple
#eventhoughparenthesesareoptional.
#Explicitisbetterthanimplicit.
zoo=('python','elephant','penguin')
print('Numberofanimalsinthezoois',len(zoo))
new_zoo='monkey','camel',zoo
print('Numberofcagesinthenewzoois',len(new_zoo))
print('Allanimalsinnewzooare',new_zoo)
print('Animalsbroughtfromoldzooare',new_zoo[2])
print('Lastanimalbroughtfromoldzoois',new_zoo[2][2])
print('Numberofanimalsinthenewzoois',
len(new_zoo)-1+len(new_zoo[2]))
Output:
$pythonds_using_tuple.py
Numberofanimalsinthezoois3
Numberofcagesinthenewzoois3
Allanimalsinnewzooare('monkey','camel',('python','elephant','penguin'))
Animalsbroughtfromoldzooare('python','elephant','penguin')
Lastanimalbroughtfromoldzooispenguin
Numberofanimalsinthenewzoois5
HowItWorks
Thevariablezooreferstoatupleofitems.Weseethatthelenfunctioncanbeusedtogetthelengthofthetuple.Thisalsoindicatesthatatupleisasequenceaswell.
Wearenowshiftingtheseanimalstoanewzoosincetheoldzooisbeingclosed.Therefore,thenew_zootuplecontainssomeanimalswhicharealreadytherealongwiththeanimalsbroughtoverfromtheoldzoo.Backtoreality,notethatatuplewithinatupledoesnotloseitsidentity.
Wecanaccesstheitemsinthetuplebyspecifyingtheitem'spositionwithinapairofsquarebracketsjustlikewedidforlists.Thisiscalledtheindexingoperator.Weaccessthethirditeminnew_zoobyspecifyingnew_zoo[2]andweaccessthethirditemwithinthethirditeminthenew_zootuplebyspecifyingnew_zoo[2][2].Thisisprettysimpleonceyou'veunderstoodtheidiom.
DataStructures
78
Tuplewith0or1items
Anemptytupleisconstructedbyanemptypairofparenthesessuchasmyempty=().However,atuplewithasingleitemisnotsosimple.Youhavetospecifyitusingacommafollowingthefirst(andonly)itemsothatPythoncandifferentiatebetweenatupleandapairofparenthesessurroundingtheobjectinanexpressioni.e.youhavetospecifysingleton=(2,)ifyoumeanyouwantatuplecontainingtheitem2.
NoteforPerlprogrammers
Alistwithinalistdoesnotloseitsidentityi.e.listsarenotflattenedasinPerl.Thesameappliestoatuplewithinatuple,oratuplewithinalist,oralistwithinatuple,etc.AsfarasPythonisconcerned,theyarejustobjectsstoredusinganotherobject,that'sall.
DictionaryAdictionaryislikeanaddress-bookwhereyoucanfindtheaddressorcontactdetailsofapersonbyknowingonlyhis/hernamei.e.weassociatekeys(name)withvalues(details).Notethatthekeymustbeuniquejustlikeyoucannotfindoutthecorrectinformationifyouhavetwopersonswiththeexactsamename.
Notethatyoucanuseonlyimmutableobjects(likestrings)forthekeysofadictionarybutyoucanuseeitherimmutableormutableobjectsforthevaluesofthedictionary.Thisbasicallytranslatestosaythatyoushoulduseonlysimpleobjectsforkeys.
Pairsofkeysandvaluesarespecifiedinadictionarybyusingthenotationd={key1:value1,key2:value2}.Noticethatthekey-valuepairsareseparatedbyacolonandthepairsareseparatedthemselvesbycommasandallthisisenclosedinapairofcurlybraces.
Rememberthatkey-valuepairsinadictionaryarenotorderedinanymanner.Ifyouwantaparticularorder,thenyouwillhavetosortthemyourselfbeforeusingit.
Thedictionariesthatyouwillbeusingareinstances/objectsofthedictclass.
Example(saveasds_using_dict.py):
DataStructures
79
#'ab'isshortfor'a'ddress'b'ook
ab={
'Swaroop':'[email protected]',
'Larry':'[email protected]',
'Matsumoto':'[email protected]',
'Spammer':'[email protected]'
}
print("Swaroop'saddressis",ab['Swaroop'])
#Deletingakey-valuepair
delab['Spammer']
print('\nThereare{}contactsintheaddress-book\n'.format(len(ab)))
forname,addressinab.items():
print('Contact{}at{}'.format(name,address))
#Addingakey-valuepair
ab['Guido']='[email protected]'
if'Guido'inab:
print("\nGuido'saddressis",ab['Guido'])
Output:
$pythonds_using_dict.py
Swaroop'[email protected]
Thereare3contactsintheaddress-book
Guido'[email protected]
HowItWorks
Wecreatethedictionaryabusingthenotationalreadydiscussed.Wethenaccesskey-valuepairsbyspecifyingthekeyusingtheindexingoperatorasdiscussedinthecontextoflistsandtuples.Observethesimplesyntax.
Wecandeletekey-valuepairsusingouroldfriend-thedelstatement.Wesimplyspecifythedictionaryandtheindexingoperatorforthekeytoberemovedandpassittothedelstatement.Thereisnoneedtoknowthevaluecorrespondingtothekeyforthisoperation.
DataStructures
80
Next,weaccesseachkey-valuepairofthedictionaryusingtheitemsmethodofthedictionarywhichreturnsalistoftupleswhereeachtuplecontainsapairofitems-thekeyfollowedbythevalue.Weretrievethispairandassignittothevariablesnameandaddresscorrespondinglyforeachpairusingthefor..inloopandthenprintthesevaluesinthefor-block.
Wecanaddnewkey-valuepairsbysimplyusingtheindexingoperatortoaccessakeyandassignthatvalue,aswehavedoneforGuidointheabovecase.
Wecancheckifakey-valuepairexistsusingtheinoperator.
Forthelistofmethodsofthedictclass,seehelp(dict).
KeywordArgumentsandDictionaries
Ifyouhaveusedkeywordargumentsinyourfunctions,youhavealreadyuseddictionaries!Justthinkaboutit-thekey-valuepairisspecifiedbyyouintheparameterlistofthefunctiondefinitionandwhenyouaccessvariableswithinyourfunction,itisjustakeyaccessofadictionary(whichiscalledthesymboltableincompilerdesignterminology).
SequenceLists,tuplesandstringsareexamplesofsequences,butwhataresequencesandwhatissospecialaboutthem?
Themajorfeaturesaremembershiptests,(i.e.theinandnotinexpressions)andindexingoperations,whichallowustofetchaparticulariteminthesequencedirectly.
Thethreetypesofsequencesmentionedabove-lists,tuplesandstrings,alsohaveaslicingoperationwhichallowsustoretrieveasliceofthesequencei.e.apartofthesequence.
Example(saveasds_seq.py):
DataStructures
81
shoplist=['apple','mango','carrot','banana']
name='swaroop'
#Indexingor'Subscription'operation#
print('Item0is',shoplist[0])
print('Item1is',shoplist[1])
print('Item2is',shoplist[2])
print('Item3is',shoplist[3])
print('Item-1is',shoplist[-1])
print('Item-2is',shoplist[-2])
print('Character0is',name[0])
#Slicingonalist#
print('Item1to3is',shoplist[1:3])
print('Item2toendis',shoplist[2:])
print('Item1to-1is',shoplist[1:-1])
print('Itemstarttoendis',shoplist[:])
#Slicingonastring#
print('characters1to3is',name[1:3])
print('characters2toendis',name[2:])
print('characters1to-1is',name[1:-1])
print('charactersstarttoendis',name[:])
Output:
$pythonds_seq.py
Item0isapple
Item1ismango
Item2iscarrot
Item3isbanana
Item-1isbanana
Item-2iscarrot
Character0iss
Item1to3is['mango','carrot']
Item2toendis['carrot','banana']
Item1to-1is['mango','carrot']
Itemstarttoendis['apple','mango','carrot','banana']
characters1to3iswa
characters2toendisaroop
characters1to-1iswaroo
charactersstarttoendisswaroop
HowItWorks
First,weseehowtouseindexestogetindividualitemsofasequence.Thisisalsoreferredtoasthesubscriptionoperation.Wheneveryouspecifyanumbertoasequencewithinsquarebracketsasshownabove,Pythonwillfetchyoutheitemcorrespondingtothat
DataStructures
82
positioninthesequence.RememberthatPythonstartscountingnumbersfrom0.Hence,shoplist[0]fetchesthefirstitemandshoplist[3]fetchesthefourthitemintheshoplistsequence.
Theindexcanalsobeanegativenumber,inwhichcase,thepositioniscalculatedfromtheendofthesequence.Therefore,shoplist[-1]referstothelastiteminthesequenceandshoplist[-2]fetchesthesecondlastiteminthesequence.
Theslicingoperationisusedbyspecifyingthenameofthesequencefollowedbyanoptionalpairofnumbersseparatedbyacolonwithinsquarebrackets.Notethatthisisverysimilartotheindexingoperationyouhavebeenusingtillnow.Rememberthenumbersareoptionalbutthecolonisn't.
Thefirstnumber(beforethecolon)intheslicingoperationreferstothepositionfromwheretheslicestartsandthesecondnumber(afterthecolon)indicateswheretheslicewillstopat.Ifthefirstnumberisnotspecified,Pythonwillstartatthebeginningofthesequence.Ifthesecondnumberisleftout,Pythonwillstopattheendofthesequence.Notethattheslicereturnedstartsatthestartpositionandwillendjustbeforetheendpositioni.e.thestartpositionisincludedbuttheendpositionisexcludedfromthesequenceslice.
Thus,shoplist[1:3]returnsasliceofthesequencestartingatposition1,includesposition2butstopsatposition3andthereforeasliceoftwoitemsisreturned.Similarly,shoplist[:]returnsacopyofthewholesequence.
Youcanalsodoslicingwithnegativepositions.Negativenumbersareusedforpositionsfromtheendofthesequence.Forexample,shoplist[:-1]willreturnasliceofthesequencewhichexcludesthelastitemofthesequencebutcontainseverythingelse.
Youcanalsoprovideathirdargumentfortheslice,whichisthestepfortheslicing(bydefault,thestepsizeis1):
>>>shoplist=['apple','mango','carrot','banana']
>>>shoplist[::1]
['apple','mango','carrot','banana']
>>>shoplist[::2]
['apple','carrot']
>>>shoplist[::3]
['apple','banana']
>>>shoplist[::-1]
['banana','carrot','mango','apple']
Noticethatwhenthestepis2,wegettheitemswithposition0,2,...Whenthestepsizeis3,wegettheitemswithposition0,3,etc.
DataStructures
83
TryvariouscombinationsofsuchslicespecificationsusingthePythoninterpreterinteractivelyi.e.thepromptsothatyoucanseetheresultsimmediately.Thegreatthingaboutsequencesisthatyoucanaccesstuples,listsandstringsallinthesameway!
SetSetsareunorderedcollectionsofsimpleobjects.Theseareusedwhentheexistenceofanobjectinacollectionismoreimportantthantheorderorhowmanytimesitoccurs.
Usingsets,youcantestformembership,whetheritisasubsetofanotherset,findtheintersectionbetweentwosets,andsoon.
>>>bri=set(['brazil','russia','india'])
>>>'india'inbri
True
>>>'usa'inbri
False
>>>bric=bri.copy()
>>>bric.add('china')
>>>bric.issuperset(bri)
True
>>>bri.remove('russia')
>>>bri&bric#ORbri.intersection(bric)
{'brazil','india'}
HowItWorks
Theexampleisprettymuchself-explanatorybecauseitinvolvesbasicsettheorymathematicstaughtinschool.
ReferencesWhenyoucreateanobjectandassignittoavariable,thevariableonlyreferstotheobjectanddoesnotrepresenttheobjectitself!Thatis,thevariablenamepointstothatpartofyourcomputer'smemorywheretheobjectisstored.Thisiscalledbindingthenametotheobject.
Generally,youdon'tneedtobeworriedaboutthis,butthereisasubtleeffectduetoreferenceswhichyouneedtobeawareof:
Example(saveasds_reference.py):
DataStructures
84
print('SimpleAssignment')
shoplist=['apple','mango','carrot','banana']
#mylistisjustanothernamepointingtothesameobject!
mylist=shoplist
#Ipurchasedthefirstitem,soIremoveitfromthelist
delshoplist[0]
print('shoplistis',shoplist)
print('mylistis',mylist)
#Noticethatbothshoplistandmylistbothprint
#thesamelistwithoutthe'apple'confirmingthat
#theypointtothesameobject
print('Copybymakingafullslice')
#Makeacopybydoingafullslice
mylist=shoplist[:]
#Removefirstitem
delmylist[0]
print('shoplistis',shoplist)
print('mylistis',mylist)
#Noticethatnowthetwolistsaredifferent
Output:
$pythonds_reference.py
SimpleAssignment
shoplistis['mango','carrot','banana']
mylistis['mango','carrot','banana']
Copybymakingafullslice
shoplistis['mango','carrot','banana']
mylistis['carrot','banana']
HowItWorks
Mostoftheexplanationisavailableinthecomments.
Rememberthatifyouwanttomakeacopyofalistorsuchkindsofsequencesorcomplexobjects(notsimpleobjectssuchasintegers),thenyouhavetousetheslicingoperationtomakeacopy.Ifyoujustassignthevariablenametoanothername,bothofthemwill''refer''tothesameobjectandthiscouldbetroubleifyouarenotcareful.
NoteforPerlprogrammers
Rememberthatanassignmentstatementforlistsdoesnotcreateacopy.Youhavetouseslicingoperationtomakeacopyofthesequence.
DataStructures
85
MoreAboutStringsWehavealreadydiscussedstringsindetailearlier.Whatmorecantherebetoknow?Well,didyouknowthatstringsarealsoobjectsandhavemethodswhichdoeverythingfromcheckingpartofastringtostrippingspaces!
Thestringsthatyouuseinprogramareallobjectsoftheclassstr.Someusefulmethodsofthisclassaredemonstratedinthenextexample.Foracompletelistofsuchmethods,seehelp(str).
Example(saveasds_str_methods.py):
#Thisisastringobject
name='Swaroop'
ifname.startswith('Swa'):
print('Yes,thestringstartswith"Swa"')
if'a'inname:
print('Yes,itcontainsthestring"a"')
ifname.find('war')!=-1:
print('Yes,itcontainsthestring"war"')
delimiter='_*_'
mylist=['Brazil','Russia','India','China']
print(delimiter.join(mylist))
Output:
$pythonds_str_methods.py
Yes,thestringstartswith"Swa"
Yes,itcontainsthestring"a"
Yes,itcontainsthestring"war"
Brazil_*_Russia_*_India_*_China
HowItWorks
Here,weseealotofthestringmethodsinaction.Thestartswithmethodisusedtofindoutwhetherthestringstartswiththegivenstring.Theinoperatorisusedtocheckifagivenstringisapartofthestring.
Thefindmethodisusedtolocatethepositionofthegivensubstringwithinthestring;findreturns-1ifitisunsuccessfulinfindingthesubstring.Thestrclassalsohasaneatmethodtojointheitemsofasequencewiththestringactingasadelimiterbetweeneachitemofthesequenceandreturnsabiggerstringgeneratedfromthis.
DataStructures
86
SummaryWehaveexploredthevariousbuilt-indatastructuresofPythonindetail.Thesedatastructureswillbeessentialforwritingprogramsofreasonablesize.
NowthatwehavealotofthebasicsofPythoninplace,wewillnextseehowtodesignandwriteareal-worldPythonprogram.
DataStructures
87
ProblemSolvingWehaveexploredvariouspartsofthePythonlanguageandnowwewilltakealookathowallthesepartsfittogether,bydesigningandwritingaprogramwhichdoessomethinguseful.TheideaistolearnhowtowriteaPythonscriptonyourown.
TheProblemTheproblemwewanttosolveis:
Iwantaprogramwhichcreatesabackupofallmyimportantfiles.
Although,thisisasimpleproblem,thereisnotenoughinformationforustogetstartedwiththesolution.Alittlemoreanalysisisrequired.Forexample,howdowespecifywhichfilesaretobebackedup?Howaretheystored?Wherearetheystored?
Afteranalyzingtheproblemproperly,wedesignourprogram.Wemakealistofthingsabouthowourprogramshouldwork.Inthiscase,IhavecreatedthefollowinglistonhowIwantittowork.Ifyoudothedesign,youmaynotcomeupwiththesamekindofanalysissinceeverypersonhastheirownwayofdoingthings,sothatisperfectlyokay.
Thefilesanddirectoriestobebackeduparespecifiedinalist.Thebackupmustbestoredinamainbackupdirectory.Thefilesarebackedupintoazipfile.Thenameoftheziparchiveisthecurrentdateandtime.WeusethestandardzipcommandavailablebydefaultinanystandardGNU/LinuxorUnixdistribution.Notethatyoucanuseanyarchivingcommandyouwantaslongasithasacommandlineinterface.
ForWindowsusers
WindowsuserscaninstallthezipcommandfromtheGnuWin32projectpageandaddC:\ProgramFiles\GnuWin32\bintoyoursystemPATHenvironmentvariable,similartowhatwedidforrecognizingthepythoncommanditself.
TheSolutionAsthedesignofourprogramisnowreasonablystable,wecanwritethecodewhichisanimplementationofoursolution.
ProblemSolving
88
Saveasbackup_ver1.py:
importos
importtime
#1.Thefilesanddirectoriestobebackedupare
#specifiedinalist.
#ExampleonWindows:
#source=['"C:\\MyDocuments"','C:\\Code']
#ExampleonMacOSXandLinux:
source=['/Users/swa/notes']
#Noticewehadtousedoublequotesinsidethestring
#fornameswithspacesinit.
#2.Thebackupmustbestoredina
#mainbackupdirectory
#ExampleonWindows:
#target_dir='E:\\Backup'
#ExampleonMacOSXandLinux:
target_dir='/Users/swa/backup'
#Remembertochangethistowhichfolderyouwillbeusing
#3.Thefilesarebackedupintoazipfile.
#4.Thenameoftheziparchiveisthecurrentdateandtime
target=target_dir+os.sep+\
time.strftime('%Y%m%d%H%M%S')+'.zip'
#Createtargetdirectoryifitisnotpresent
ifnotos.path.exists(target_dir):
os.mkdir(target_dir)#makedirectory
#5.Weusethezipcommandtoputthefilesinaziparchive
zip_command='zip-r{0}{1}'.format(target,
''.join(source))
#Runthebackup
print('Zipcommandis:')
print(zip_command)
print('Running:')
ifos.system(zip_command)==0:
print('Successfulbackupto',target)
else:
print('BackupFAILED')
Output:
ProblemSolving
89
$pythonbackup_ver1.py
Zipcommandis:
zip-r/Users/swa/backup/20140328084844.zip/Users/swa/notes
Running:
adding:Users/swa/notes/(stored0%)
adding:Users/swa/notes/blah1.txt(stored0%)
adding:Users/swa/notes/blah2.txt(stored0%)
adding:Users/swa/notes/blah3.txt(stored0%)
Successfulbackupto/Users/swa/backup/20140328084844.zip
Now,weareinthetestingphasewherewetestthatourprogramworksproperly.Ifitdoesn'tbehaveasexpected,thenwehavetodebugourprogrami.e.removethebugs(errors)fromtheprogram.
Iftheaboveprogramdoesnotworkforyou,copythelineprintedaftertheZipcommandislineintheoutput,pasteitintheshell(onGNU/LinuxandMacOSX)/cmd(onWindows),seewhattheerrorisandtrytofixit.Alsocheckthezipcommandmanualonwhatcouldbewrong.Ifthiscommandsucceeds,thentheproblemmightbeinthePythonprogramitself,socheckifitexactlymatchestheprogramwrittenabove.
HowItWorks
Youwillnoticehowwehaveconvertedourdesignintocodeinastep-by-stepmanner.
Wemakeuseoftheosandtimemodulesbyfirstimportingthem.Then,wespecifythefilesanddirectoriestobebackedupinthesourcelist.Thetargetdirectoryiswherewestoreallthebackupfilesandthisisspecifiedinthetarget_dirvariable.Thenameoftheziparchivethatwearegoingtocreateisthecurrentdateandtimewhichwegenerateusingthetime.strftime()function.Itwillalsohavethe.zipextensionandwillbestoredinthetarget_dirdirectory.
Noticetheuseoftheos.sepvariable-thisgivesthedirectoryseparatoraccordingtoyouroperatingsystemi.e.itwillbe'/'inGNU/LinuxandUnix,itwillbe'\\'inWindowsand':'inMacOS.Usingos.sepinsteadofthesecharactersdirectlywillmakeourprogramportableandworkacrossallofthesesystems.
Thetime.strftime()functiontakesaspecificationsuchastheonewehaveusedintheaboveprogram.The%Yspecificationwillbereplacedbytheyearwiththecentury.The%mspecificationwillbereplacedbythemonthasadecimalnumberbetween01and12andsoon.ThecompletelistofsuchspecificationscanbefoundinthePythonReferenceManual.
Wecreatethenameofthetargetzipfileusingtheadditionoperatorwhichconcatenatesthestringsi.e.itjoinsthetwostringstogetherandreturnsanewone.Then,wecreateastringzip_commandwhichcontainsthecommandthatwearegoingtoexecute.Youcancheckif
ProblemSolving
90
thiscommandworksbyrunningitintheshell(GNU/LinuxterminalorDOSprompt).
Thezipcommandthatweareusinghassomeoptionsandparameterspassed.The-roptionspecifiesthatthezipcommandshouldworkrecursivelyfordirectoriesi.e.itshouldincludeallthesubdirectoriesandfiles.Thetwooptionsarecombinedandspecifiedinashortcutas-qr.Theoptionsarefollowedbythenameoftheziparchivetocreatefollowedbythelistoffilesanddirectoriestobackup.Weconvertthesourcelistintoastringusingthejoinmethodofstringswhichwehavealreadyseenhowtouse.
Then,wefinallyrunthecommandusingtheos.systemfunctionwhichrunsthecommandasifitwasrunfromthesystemi.e.intheshell-itreturns0ifthecommandwassuccessfully,elseitreturnsanerrornumber.
Dependingontheoutcomeofthecommand,weprinttheappropriatemessagethatthebackuphasfailedorsucceeded.
That'sit,wehavecreatedascripttotakeabackupofourimportantfiles!
NotetoWindowsUsers
Insteadofdoublebackslashescapesequences,youcanalsouserawstrings.Forexample,use'C:\\Documents'orr'C:\Documents'.However,donotuse'C:\Documents'sinceyouendupusinganunknownescapesequence\D.
Nowthatwehaveaworkingbackupscript,wecanuseitwheneverwewanttotakeabackupofthefiles.Thisiscalledtheoperationphaseorthedeploymentphaseofthesoftware.
Theaboveprogramworksproperly,but(usually)firstprogramsdonotworkexactlyasyouexpect.Forexample,theremightbeproblemsifyouhavenotdesignedtheprogramproperlyorifyouhavemadeamistakewhentypingthecode,etc.Appropriately,youwillhavetogobacktothedesignphaseoryouwillhavetodebugyourprogram.
SecondVersionThefirstversionofourscriptworks.However,wecanmakesomerefinementstoitsothatitcanworkbetteronadailybasis.Thisiscalledthemaintenancephaseofthesoftware.
OneoftherefinementsIfeltwasusefulisabetterfile-namingmechanism-usingthetimeasthenameofthefilewithinadirectorywiththecurrentdateasadirectorywithinthemainbackupdirectory.Thefirstadvantageisthatyourbackupsarestoredinahierarchicalmannerandthereforeitismucheasiertomanage.Thesecondadvantageisthatthe
ProblemSolving
91
filenamesaremuchshorter.Thethirdadvantageisthatseparatedirectorieswillhelpyoucheckifyouhavemadeabackupforeachdaysincethedirectorywouldbecreatedonlyifyouhavemadeabackupforthatday.
Saveasbackup_ver2.py:
ProblemSolving
92
importos
importtime
#1.Thefilesanddirectoriestobebackedupare
#specifiedinalist.
#ExampleonWindows:
#source=['"C:\\MyDocuments"','C:\\Code']
#ExampleonMacOSXandLinux:
source=['/Users/swa/notes']
#Noticewehadtousedoublequotesinsidethestring
#fornameswithspacesinit.
#2.Thebackupmustbestoredina
#mainbackupdirectory
#ExampleonWindows:
#target_dir='E:\\Backup'
#ExampleonMacOSXandLinux:
target_dir='/Users/swa/backup'
#Remembertochangethistowhichfolderyouwillbeusing
#Createtargetdirectoryifitisnotpresent
ifnotos.path.exists(target_dir):
os.mkdir(target_dir)#makedirectory
#3.Thefilesarebackedupintoazipfile.
#4.Thecurrentdayisthenameofthesubdirectory
#inthemaindirectory.
today=target_dir+os.sep+time.strftime('%Y%m%d')
#Thecurrenttimeisthenameoftheziparchive.
now=time.strftime('%H%M%S')
#Thenameofthezipfile
target=today+os.sep+now+'.zip'
#Createthesubdirectoryifitisn'talreadythere
ifnotos.path.exists(today):
os.mkdir(today)
print('Successfullycreateddirectory',today)
#5.Weusethezipcommandtoputthefilesinaziparchive
zip_command='zip-r{0}{1}'.format(target,
''.join(source))
#Runthebackup
print('Zipcommandis:')
print(zip_command)
print('Running:')
ifos.system(zip_command)==0:
print('Successfulbackupto',target)
else:
print('BackupFAILED')
ProblemSolving
93
Output:
$pythonbackup_ver2.py
Successfullycreateddirectory/Users/swa/backup/20140329
Zipcommandis:
zip-r/Users/swa/backup/20140329/073201.zip/Users/swa/notes
Running:
adding:Users/swa/notes/(stored0%)
adding:Users/swa/notes/blah1.txt(stored0%)
adding:Users/swa/notes/blah2.txt(stored0%)
adding:Users/swa/notes/blah3.txt(stored0%)
Successfulbackupto/Users/swa/backup/20140329/073201.zip
HowItWorks
Mostoftheprogramremainsthesame.Thechangesarethatwecheckifthereisadirectorywiththecurrentdayasitsnameinsidethemainbackupdirectoryusingtheos.path.existsfunction.Ifitdoesn'texist,wecreateitusingtheos.mkdirfunction.
ThirdVersionThesecondversionworksfinewhenIdomanybackups,butwhentherearelotsofbackups,Iamfindingithardtodifferentiatewhatthebackupswerefor!Forexample,Imighthavemadesomemajorchangestoaprogramorpresentation,thenIwanttoassociatewhatthosechangesarewiththenameoftheziparchive.Thiscanbeeasilyachievedbyattachingauser-suppliedcommenttothenameoftheziparchive.
WARNING:Thefollowingprogramdoesnotwork,sodonotbealarmed,pleasefollowalongbecausethere'salessoninhere.
Saveasbackup_ver3.py:
importos
importtime
#1.Thefilesanddirectoriestobebackedupare
#specifiedinalist.
#ExampleonWindows:
#source=['"C:\\MyDocuments"','C:\\Code']
#ExampleonMacOSXandLinux:
source=['/Users/swa/notes']
#Noticewehadtousedoublequotesinsidethestring
#fornameswithspacesinit.
#2.Thebackupmustbestoredina
#mainbackupdirectory
ProblemSolving
94
#ExampleonWindows:
#target_dir='E:\\Backup'
#ExampleonMacOSXandLinux:
target_dir='/Users/swa/backup'
#Remembertochangethistowhichfolderyouwillbeusing
#Createtargetdirectoryifitisnotpresent
ifnotos.path.exists(target_dir):
os.mkdir(target_dir)#makedirectory
#3.Thefilesarebackedupintoazipfile.
#4.Thecurrentdayisthenameofthesubdirectory
#inthemaindirectory.
today=target_dir+os.sep+time.strftime('%Y%m%d')
#Thecurrenttimeisthenameoftheziparchive.
now=time.strftime('%H%M%S')
#Takeacommentfromtheuserto
#createthenameofthezipfile
comment=input('Enteracomment-->')
#Checkifacommentwasentered
iflen(comment)==0:
target=today+os.sep+now+'.zip'
else:
target=today+os.sep+now+'_'+
comment.replace('','_')+'.zip'
#Createthesubdirectoryifitisn'talreadythere
ifnotos.path.exists(today):
os.mkdir(today)
print('Successfullycreateddirectory',today)
#5.Weusethezipcommandtoputthefilesinaziparchive
zip_command="zip-r{0}{1}".format(target,
''.join(source))
#Runthebackup
print('Zipcommandis:')
print(zip_command)
print('Running:')
ifos.system(zip_command)==0:
print('Successfulbackupto',target)
else:
print('BackupFAILED')
Output:
ProblemSolving
95
$pythonbackup_ver3.py
File"backup_ver3.py",line39
target=today+os.sep+now+'_'+
^
SyntaxError:invalidsyntax
HowThis(doesnot)Work
Thisprogramdoesnotwork!PythonsaysthereisasyntaxerrorwhichmeansthatthescriptdoesnotsatisfythestructurethatPythonexpectstosee.WhenweobservetheerrorgivenbyPython,italsotellsustheplacewhereitdetectedtheerroraswell.Sowestartdebuggingourprogramfromthatline.
Oncarefulobservation,weseethatthesinglelogicallinehasbeensplitintotwophysicallinesbutwehavenotspecifiedthatthesetwophysicallinesbelongtogether.Basically,Pythonhasfoundtheadditionoperator(+)withoutanyoperandinthatlogicallineandhenceitdoesn'tknowhowtocontinue.Rememberthatwecanspecifythatthelogicallinecontinuesinthenextphysicallinebytheuseofabackslashattheendofthephysicalline.So,wemakethiscorrectiontoourprogram.Thiscorrectionoftheprogramwhenwefinderrorsiscalledbugfixing.
FourthVersionSaveasbackup_ver4.py:
importos
importtime
#1.Thefilesanddirectoriestobebackedupare
#specifiedinalist.
#ExampleonWindows:
#source=['"C:\\MyDocuments"','C:\\Code']
#ExampleonMacOSXandLinux:
source=['/Users/swa/notes']
#Noticewehadtousedoublequotesinsidethestring
#fornameswithspacesinit.
#2.Thebackupmustbestoredina
#mainbackupdirectory
#ExampleonWindows:
#target_dir='E:\\Backup'
#ExampleonMacOSXandLinux:
target_dir='/Users/swa/backup'
#Remembertochangethistowhichfolderyouwillbeusing
#Createtargetdirectoryifitisnotpresent
ProblemSolving
96
ifnotos.path.exists(target_dir):
os.mkdir(target_dir)#makedirectory
#3.Thefilesarebackedupintoazipfile.
#4.Thecurrentdayisthenameofthesubdirectory
#inthemaindirectory.
today=target_dir+os.sep+time.strftime('%Y%m%d')
#Thecurrenttimeisthenameoftheziparchive.
now=time.strftime('%H%M%S')
#Takeacommentfromtheuserto
#createthenameofthezipfile
comment=input('Enteracomment-->')
#Checkifacommentwasentered
iflen(comment)==0:
target=today+os.sep+now+'.zip'
else:
target=today+os.sep+now+'_'+\
comment.replace('','_')+'.zip'
#Createthesubdirectoryifitisn'talreadythere
ifnotos.path.exists(today):
os.mkdir(today)
print('Successfullycreateddirectory',today)
#5.Weusethezipcommandtoputthefilesinaziparchive
zip_command='zip-r{0}{1}'.format(target,
''.join(source))
#Runthebackup
print('Zipcommandis:')
print(zip_command)
print('Running:')
ifos.system(zip_command)==0:
print('Successfulbackupto',target)
else:
print('BackupFAILED')
Output:
$pythonbackup_ver4.py
Enteracomment-->addednewexamples
Zipcommandis:
zip-r/Users/swa/backup/20140329/074122_added_new_examples.zip/Users/swa/notes
Running:
adding:Users/swa/notes/(stored0%)
adding:Users/swa/notes/blah1.txt(stored0%)
adding:Users/swa/notes/blah2.txt(stored0%)
adding:Users/swa/notes/blah3.txt(stored0%)
Successfulbackupto/Users/swa/backup/20140329/074122_added_new_examples.zip
ProblemSolving
97
HowItWorks
Thisprogramnowworks!Letusgothroughtheactualenhancementsthatwehadmadeinversion3.Wetakeintheuser'scommentsusingtheinputfunctionandthencheckiftheuseractuallyenteredsomethingbyfindingoutthelengthoftheinputusingthelenfunction.Iftheuserhasjustpressedenterwithoutenteringanything(maybeitwasjustaroutinebackupornospecialchangesweremade),thenweproceedaswehavedonebefore.
However,ifacommentwassupplied,thenthisisattachedtothenameoftheziparchivejustbeforethe.zipextension.Noticethatwearereplacingspacesinthecommentwithunderscores-thisisbecausemanagingfilenameswithoutspacesismucheasier.
MoreRefinementsThefourthversionisasatisfactorilyworkingscriptformostusers,butthereisalwaysroomforimprovement.Forexample,youcanincludeaverbositylevelfortheprogramwhereyoucanspecifya-voptiontomakeyourprogrambecomemoretalkativeora-qtomakeitquiet.
Anotherpossibleenhancementwouldbetoallowextrafilesanddirectoriestobepassedtothescriptatthecommandline.Wecangetthesenamesfromthesys.argvlistandwecanaddthemtooursourcelistusingtheextendmethodprovidedbythelistclass.
Themostimportantrefinementwouldbetonotusetheos.systemwayofcreatingarchivesandinsteadusingthezipfileortarfilebuilt-inmodulestocreatethesearchives.Theyarepartofthestandardlibraryandavailablealreadyforyoutousewithoutexternaldependenciesonthezipprogramtobeavailableonyourcomputer.
However,Ihavebeenusingtheos.systemwayofcreatingabackupintheaboveexamplespurelyforpedagogicalpurposes,sothattheexampleissimpleenoughtobeunderstoodbyeverybodybutrealenoughtobeuseful.
Canyoutrywritingthefifthversionthatusesthezipfilemoduleinsteadoftheos.systemcall?
TheSoftwareDevelopmentProcessWehavenowgonethroughthevariousphasesintheprocessofwritingasoftware.Thesephasescanbesummarisedasfollows:
1. What(Analysis)
ProblemSolving
98
2. How(Design)3. DoIt(Implementation)4. Test(TestingandDebugging)5. Use(OperationorDeployment)6. Maintain(Refinement)
Arecommendedwayofwritingprogramsistheprocedurewehavefollowedincreatingthebackupscript:Dotheanalysisanddesign.Startimplementingwithasimpleversion.Testanddebugit.Useittoensurethatitworksasexpected.Now,addanyfeaturesthatyouwantandcontinuetorepeattheDoIt-Test-Usecycleasmanytimesasrequired.
Remember:
Softwareisgrown,notbuilt.--BilldehÓra
SummaryWehaveseenhowtocreateourownPythonprograms/scriptsandthevariousstagesinvolvedinwritingsuchprograms.YoumayfinditusefultocreateyourownprogramjustlikewedidinthischaptersothatyoubecomecomfortablewithPythonaswellasproblem-solving.
Next,wewilldiscussobject-orientedprogramming.
ProblemSolving
99
ObjectOrientedProgrammingInalltheprogramswewrotetillnow,wehavedesignedourprogramaroundfunctionsi.e.blocksofstatementswhichmanipulatedata.Thisiscalledtheprocedure-orientedwayofprogramming.Thereisanotherwayoforganizingyourprogramwhichistocombinedataandfunctionalityandwrapitinsidesomethingcalledanobject.Thisiscalledtheobjectorientedprogrammingparadigm.Mostofthetimeyoucanuseproceduralprogramming,butwhenwritinglargeprogramsorhaveaproblemthatisbettersuitedtothismethod,youcanuseobjectorientedprogrammingtechniques.
Classesandobjectsarethetwomainaspectsofobjectorientedprogramming.Aclasscreatesanewtypewhereobjectsareinstancesoftheclass.Ananalogyisthatyoucanhavevariablesoftypeintwhichtranslatestosayingthatvariablesthatstoreintegersarevariableswhichareinstances(objects)oftheintclass.
NoteforStaticLanguageProgrammers
Notethatevenintegersaretreatedasobjects(oftheintclass).ThisisunlikeC++andJava(beforeversion1.5)whereintegersareprimitivenativetypes.
Seehelp(int)formoredetailsontheclass.
C#andJava1.5programmerswillfindthissimilartotheboxingandunboxingconcept.
Objectscanstoredatausingordinaryvariablesthatbelongtotheobject.Variablesthatbelongtoanobjectorclassarereferredtoasfields.Objectscanalsohavefunctionalitybyusingfunctionsthatbelongtoaclass.Suchfunctionsarecalledmethodsoftheclass.Thisterminologyisimportantbecauseithelpsustodifferentiatebetweenfunctionsandvariableswhichareindependentandthosewhichbelongtoaclassorobject.Collectively,thefieldsandmethodscanbereferredtoastheattributesofthatclass.
Fieldsareoftwotypes-theycanbelongtoeachinstance/objectoftheclassortheycanbelongtotheclassitself.Theyarecalledinstancevariablesandclassvariablesrespectively.
Aclassiscreatedusingtheclasskeyword.Thefieldsandmethodsoftheclassarelistedinanindentedblock.
Theself
ObjectOrientedProgramming
100
Classmethodshaveonlyonespecificdifferencefromordinaryfunctions-theymusthaveanextrafirstnamethathastobeaddedtothebeginningoftheparameterlist,butyoudonotgiveavalueforthisparameterwhenyoucallthemethod,Pythonwillprovideit.Thisparticularvariablereferstotheobjectitself,andbyconvention,itisgiventhenameself.
Although,youcangiveanynameforthisparameter,itisstronglyrecommendedthatyouusethenameself-anyothernameisdefinitelyfrownedupon.Therearemanyadvantagestousingastandardname-anyreaderofyourprogramwillimmediatelyrecognizeitandevenspecializedIDEs(IntegratedDevelopmentEnvironments)canhelpyouifyouuseself.
NoteforC++/Java/C#Programmers
TheselfinPythonisequivalenttothethispointerinC++andthethisreferenceinJavaandC#.
YoumustbewonderinghowPythongivesthevalueforselfandwhyyoudon'tneedtogiveavalueforit.Anexamplewillmakethisclear.SayyouhaveaclasscalledMyClassandaninstanceofthisclasscalledmyobject.Whenyoucallamethodofthisobjectasmyobject.method(arg1,arg2),thisisautomaticallyconvertedbyPythonintoMyClass.method(myobject,arg1,arg2)-thisisallthespecialselfisabout.
Thisalsomeansthatifyouhaveamethodwhichtakesnoarguments,thenyoustillhavetohaveoneargument-theself.
ClassesThesimplestclasspossibleisshowninthefollowingexample(saveasoop_simplestclass.py).
classPerson:
pass#Anemptyblock
p=Person()
print(p)
Output:
$pythonoop_simplestclass.py
<__main__.Personinstanceat0x10171f518>
HowItWorks
ObjectOrientedProgramming
101
Wecreateanewclassusingtheclassstatementandthenameoftheclass.Thisisfollowedbyanindentedblockofstatementswhichformthebodyoftheclass.Inthiscase,wehaveanemptyblockwhichisindicatedusingthepassstatement.
Next,wecreateanobject/instanceofthisclassusingthenameoftheclassfollowedbyapairofparentheses.(Wewilllearnmoreaboutinstantiationinthenextsection).Forourverification,weconfirmthetypeofthevariablebysimplyprintingit.IttellsusthatwehaveaninstanceofthePersonclassinthe__main__module.
Noticethattheaddressofthecomputermemorywhereyourobjectisstoredisalsoprinted.TheaddresswillhaveadifferentvalueonyourcomputersincePythoncanstoretheobjectwhereveritfindsspace.
MethodsWehavealreadydiscussedthatclasses/objectscanhavemethodsjustlikefunctionsexceptthatwehaveanextraselfvariable.Wewillnowseeanexample(saveasoop_method.py).
classPerson:
defsay_hi(self):
print('Hello,howareyou?')
p=Person()
p.say_hi()
#Theprevious2linescanalsobewrittenas
#Person().say_hi()
Output:
$pythonoop_method.py
Hello,howareyou?
HowItWorks
Hereweseetheselfinaction.Noticethatthesay_himethodtakesnoparametersbutstillhastheselfinthefunctiondefinition.
The__init__methodTherearemanymethodnameswhichhavespecialsignificanceinPythonclasses.Wewillseethesignificanceofthe__init__methodnow.
ObjectOrientedProgramming
102
The__init__methodisrunassoonasanobjectofaclassisinstantiated.Themethodisusefultodoanyinitializationyouwanttodowithyourobject.Noticethedoubleunderscoresbothatthebeginningandattheendofthename.
Example(saveasoop_init.py):
classPerson:
def__init__(self,name):
self.name=name
defsay_hi(self):
print('Hello,mynameis',self.name)
p=Person('Swaroop')
p.say_hi()
#Theprevious2linescanalsobewrittenas
#Person('Swaroop').say_hi()
Output:
$pythonoop_init.py
Hello,mynameisSwaroop
HowItWorks
Here,wedefinethe__init__methodastakingaparametername(alongwiththeusualself).Here,wejustcreateanewfieldalsocalledname.Noticethesearetwodifferentvariableseventhoughtheyarebothcalled'name'.Thereisnoproblembecausethedottednotationself.namemeansthatthereissomethingcalled"name"thatispartoftheobjectcalled"self"andtheothernameisalocalvariable.Sinceweexplicitlyindicatewhichnamewearereferringto,thereisnoconfusion.
Whencreatingnewinstancep,oftheclassPerson,wedosobyusingtheclassname,followedbytheargumentsintheparentheses:p=Person('Swaroop').
Wedonotexplicitlycallthe__init__method.Thisisthespecialsignificanceofthismethod.
Now,weareabletousetheself.namefieldinourmethodswhichisdemonstratedinthesay_himethod.
ClassAndObjectVariables
ObjectOrientedProgramming
103
Wehavealreadydiscussedthefunctionalitypartofclassesandobjects(i.e.methods),nowletuslearnaboutthedatapart.Thedatapart,i.e.fields,arenothingbutordinaryvariablesthatareboundtothenamespacesoftheclassesandobjects.Thismeansthatthesenamesarevalidwithinthecontextoftheseclassesandobjectsonly.That'swhytheyarecallednamespaces.
Therearetwotypesoffields-classvariablesandobjectvariableswhichareclassifieddependingonwhethertheclassortheobjectownsthevariablesrespectively.
Classvariablesareshared-theycanbeaccessedbyallinstancesofthatclass.Thereisonlyonecopyoftheclassvariableandwhenanyoneobjectmakesachangetoaclassvariable,thatchangewillbeseenbyalltheotherinstances.
Objectvariablesareownedbyeachindividualobject/instanceoftheclass.Inthiscase,eachobjecthasitsowncopyofthefieldi.e.theyarenotsharedandarenotrelatedinanywaytothefieldbythesamenameinadifferentinstance.Anexamplewillmakethiseasytounderstand(saveasoop_objvar.py):
classRobot:
"""Representsarobot,withaname."""
#Aclassvariable,countingthenumberofrobots
population=0
def__init__(self,name):
"""Initializesthedata."""
self.name=name
print("(Initializing{})".format(self.name))
#Whenthispersoniscreated,therobot
#addstothepopulation
Robot.population+=1
defdie(self):
"""Iamdying."""
print("{}isbeingdestroyed!".format(self.name))
Robot.population-=1
ifRobot.population==0:
print("{}wasthelastone.".format(self.name))
else:
print("Therearestill{:d}robotsworking.".format(
Robot.population))
defsay_hi(self):
"""Greetingbytherobot.
Yeah,theycandothat."""
ObjectOrientedProgramming
104
print("Greetings,mymasterscallme{}.".format(self.name))
@classmethod
defhow_many(cls):
"""Printsthecurrentpopulation."""
print("Wehave{:d}robots.".format(cls.population))
droid1=Robot("R2-D2")
droid1.say_hi()
Robot.how_many()
droid2=Robot("C-3PO")
droid2.say_hi()
Robot.how_many()
print("\nRobotscandosomeworkhere.\n")
print("Robotshavefinishedtheirwork.Solet'sdestroythem.")
droid1.die()
droid2.die()
Robot.how_many()
Output:
$pythonoop_objvar.py
(InitializingR2-D2)
Greetings,mymasterscallmeR2-D2.
Wehave1robots.
(InitializingC-3PO)
Greetings,mymasterscallmeC-3PO.
Wehave2robots.
Robotscandosomeworkhere.
Robotshavefinishedtheirwork.Solet'sdestroythem.
R2-D2isbeingdestroyed!
Therearestill1robotsworking.
C-3POisbeingdestroyed!
C-3POwasthelastone.
Wehave0robots.
HowItWorks
Thisisalongexamplebuthelpsdemonstratethenatureofclassandobjectvariables.Here,populationbelongstotheRobotclassandhenceisaclassvariable.Thenamevariablebelongstotheobject(itisassignedusingself)andhenceisanobjectvariable.
ObjectOrientedProgramming
105
Thus,werefertothepopulationclassvariableasRobot.populationandnotasself.population.Werefertotheobjectvariablenameusingself.namenotationinthemethodsofthatobject.Rememberthissimpledifferencebetweenclassandobjectvariables.Alsonotethatanobjectvariablewiththesamenameasaclassvariablewillhidetheclassvariable!
InsteadofRobot.population,wecouldhavealsousedself.__class__.populationbecauseeveryobjectreferstoitsclassviatheself.__class__attribute.
Thehow_manyisactuallyamethodthatbelongstotheclassandnottotheobject.Thismeanswecandefineitaseitheraclassmethodorastaticmethoddependingonwhetherweneedtoknowwhichclasswearepartof.Sincewerefertoaclassvariable,let'suseclassmethod.
Wehavemarkedthehow_manymethodasaclassmethodusingadecorator.
Decoratorscanbeimaginedtobeashortcuttocallingawrapperfunction,soapplyingthe@classmethoddecoratorissameascalling:
how_many=classmethod(how_many)
Observethatthe__init__methodisusedtoinitializetheRobotinstancewithaname.Inthismethod,weincreasethepopulationcountby1sincewehaveonemorerobotbeingadded.Alsoobservethatthevaluesofself.nameisspecifictoeachobjectwhichindicatesthenatureofobjectvariables.
Remember,thatyoumustrefertothevariablesandmethodsofthesameobjectusingtheselfonly.Thisiscalledanattributereference.
Inthisprogram,wealsoseetheuseofdocstringsforclassesaswellasmethods.WecanaccesstheclassdocstringatruntimeusingRobot.__doc__andthemethoddocstringasRobot.say_hi.__doc__
Inthediemethod,wesimplydecreasetheRobot.populationcountby1.
Allclassmembersarepublic.Oneexception:Ifyouusedatamemberswithnamesusingthedoubleunderscoreprefixsuchas__privatevar,Pythonusesname-manglingtoeffectivelymakeitaprivatevariable.
Thus,theconventionfollowedisthatanyvariablethatistobeusedonlywithintheclassorobjectshouldbeginwithanunderscoreandallothernamesarepublicandcanbeusedbyotherclasses/objects.RememberthatthisisonlyaconventionandisnotenforcedbyPython(exceptforthedoubleunderscoreprefix).
ObjectOrientedProgramming
106
NoteforC++/Java/C#Programmers
Allclassmembers(includingthedatamembers)arepublicandallthemethodsarevirtualinPython.
InheritanceOneofthemajorbenefitsofobjectorientedprogrammingisreuseofcodeandoneofthewaysthisisachievedisthroughtheinheritancemechanism.Inheritancecanbebestimaginedasimplementingatypeandsubtyperelationshipbetweenclasses.
Supposeyouwanttowriteaprogramwhichhastokeeptrackoftheteachersandstudentsinacollege.Theyhavesomecommoncharacteristicssuchasname,ageandaddress.Theyalsohavespecificcharacteristicssuchassalary,coursesandleavesforteachersand,marksandfeesforstudents.
Youcancreatetwoindependentclassesforeachtypeandprocessthembutaddinganewcommoncharacteristicwouldmeanaddingtobothoftheseindependentclasses.Thisquicklybecomesunwieldy.
AbetterwaywouldbetocreateacommonclasscalledSchoolMemberandthenhavetheteacherandstudentclassesinheritfromthisclassi.e.theywillbecomesub-typesofthistype(class)andthenwecanaddspecificcharacteristicstothesesub-types.
Therearemanyadvantagestothisapproach.Ifweadd/changeanyfunctionalityinSchoolMember,thisisautomaticallyreflectedinthesubtypesaswell.Forexample,youcanaddanewIDcardfieldforbothteachersandstudentsbysimplyaddingittotheSchoolMemberclass.However,changesinthesubtypesdonotaffectothersubtypes.AnotheradvantageisthatifyoucanrefertoateacherorstudentobjectasaSchoolMemberobjectwhichcouldbeusefulinsomesituationssuchascountingofthenumberofschoolmembers.Thisiscalledpolymorphismwhereasub-typecanbesubstitutedinanysituationwhereaparenttypeisexpectedi.e.theobjectcanbetreatedasaninstanceoftheparentclass.
Alsoobservethatwereusethecodeoftheparentclassandwedonotneedtorepeatitinthedifferentclassesaswewouldhavehadtoincasewehadusedindependentclasses.
TheSchoolMemberclassinthissituationisknownasthebaseclassorthesuperclass.TheTeacherandStudentclassesarecalledthederivedclassesorsubclasses.
Wewillnowseethisexampleasaprogram(saveasoop_subclass.py):
ObjectOrientedProgramming
107
classSchoolMember:
'''Representsanyschoolmember.'''
def__init__(self,name,age):
self.name=name
self.age=age
print('(InitializedSchoolMember:{})'.format(self.name))
deftell(self):
'''Tellmydetails.'''
print('Name:"{}"Age:"{}"'.format(self.name,self.age),end="")
classTeacher(SchoolMember):
'''Representsateacher.'''
def__init__(self,name,age,salary):
SchoolMember.__init__(self,name,age)
self.salary=salary
print('(InitializedTeacher:{})'.format(self.name))
deftell(self):
SchoolMember.tell(self)
print('Salary:"{:d}"'.format(self.salary))
classStudent(SchoolMember):
'''Representsastudent.'''
def__init__(self,name,age,marks):
SchoolMember.__init__(self,name,age)
self.marks=marks
print('(InitializedStudent:{})'.format(self.name))
deftell(self):
SchoolMember.tell(self)
print('Marks:"{:d}"'.format(self.marks))
t=Teacher('Mrs.Shrividya',40,30000)
s=Student('Swaroop',25,75)
#printsablankline
print()
members=[t,s]
formemberinmembers:
#WorksforbothTeachersandStudents
member.tell()
Output:
ObjectOrientedProgramming
108
$pythonoop_subclass.py
(InitializedSchoolMember:Mrs.Shrividya)
(InitializedTeacher:Mrs.Shrividya)
(InitializedSchoolMember:Swaroop)
(InitializedStudent:Swaroop)
Name:"Mrs.Shrividya"Age:"40"Salary:"30000"
Name:"Swaroop"Age:"25"Marks:"75"
HowItWorks
Touseinheritance,wespecifythebaseclassnamesinatuplefollowingtheclassnameintheclassdefinition.Next,weobservethatthe__init__methodofthebaseclassisexplicitlycalledusingtheselfvariablesothatwecaninitializethebaseclasspartoftheobject.Thisisveryimportanttoremember-Sincewearedefininga__init__methodinTeacherandStudentsubclasses,PythondoesnotautomaticallycalltheconstructorofthebaseclassSchoolMember,youhavetoexplicitlycallityourself.
Incontrast,ifwehavenotdefinedan__init__methodinasubclass,Pythonwillcalltheconstructorofthebaseclassautomatically.
Wealsoobservethatwecancallmethodsofthebaseclassbyprefixingtheclassnametothemethodcallandthenpassintheselfvariablealongwithanyarguments.
NoticethatwecantreatinstancesofTeacherorStudentasjustinstancesoftheSchoolMemberwhenweusethetellmethodoftheSchoolMemberclass.
Also,observethatthetellmethodofthesubtypeiscalledandnotthetellmethodoftheSchoolMemberclass.OnewaytounderstandthisisthatPythonalwaysstartslookingformethodsintheactualtype,whichinthiscaseitdoes.Ifitcouldnotfindthemethod,itstartslookingatthemethodsbelongingtoitsbaseclassesonebyoneintheordertheyarespecifiedinthetupleintheclassdefinition.
Anoteonterminology-ifmorethanoneclassislistedintheinheritancetuple,thenitiscalledmultipleinheritance.
Theendparameterisusedintheprintfunctioninthesuperclass'stell()methodtoprintalineandallowthenextprinttocontinueonthesameline.Thisisatricktomakeprintnotprinta\n(newline)symbolattheendoftheprinting.
Summary
ObjectOrientedProgramming
109
Wehavenowexploredthevariousaspectsofclassesandobjectsaswellasthevariousterminologiesassociatedwithit.Wehavealsoseenthebenefitsandpitfallsofobject-orientedprogramming.Pythonishighlyobject-orientedandunderstandingtheseconceptscarefullywillhelpyoualotinthelongrun.
Next,wewilllearnhowtodealwithinput/outputandhowtoaccessfilesinPython.
ObjectOrientedProgramming
110
InputandOutputTherewillbesituationswhereyourprogramhastointeractwiththeuser.Forexample,youwouldwanttotakeinputfromtheuserandthenprintsomeresultsback.Wecanachievethisusingtheinput()functionandprintfunctionrespectively.
Foroutput,wecanalsousethevariousmethodsofthestr(string)class.Forexample,youcanusetherjustmethodtogetastringwhichisrightjustifiedtoaspecifiedwidth.Seehelp(str)formoredetails.
Anothercommontypeofinput/outputisdealingwithfiles.Theabilitytocreate,readandwritefilesisessentialtomanyprogramsandwewillexplorethisaspectinthischapter.
InputfromuserSavethisprogramasio_input.py:
defreverse(text):
returntext[::-1]
defis_palindrome(text):
returntext==reverse(text)
something=input("Entertext:")
ifis_palindrome(something):
print("Yes,itisapalindrome")
else:
print("No,itisnotapalindrome")
Output:
InputandOutput
111
$python3io_input.py
Entertext:sir
No,itisnotapalindrome
$python3io_input.py
Entertext:madam
Yes,itisapalindrome
$python3io_input.py
Entertext:racecar
Yes,itisapalindrome
HowItWorks
Weusetheslicingfeaturetoreversethetext.We'vealreadyseenhowwecanmakeslicesfromsequencesusingtheseq[a:b]codestartingfrompositionatopositionb.Wecanalsoprovideathirdargumentthatdeterminesthestepbywhichtheslicingisdone.Thedefaultstepis1becauseofwhichitreturnsacontinuouspartofthetext.Givinganegativestep,i.e.,-1willreturnthetextinreverse.
Theinput()functiontakesastringasargumentanddisplaysittotheuser.Thenitwaitsfortheusertotypesomethingandpressthereturnkey.Oncetheuserhasenteredandpressedthereturnkey,theinput()functionwillthenreturnthattexttheuserhasentered.
Wetakethattextandreverseit.Iftheoriginaltextandreversedtextareequal,thenthetextisapalindrome.
Homeworkexercise
Checkingwhetheratextisapalindromeshouldalsoignorepunctuation,spacesandcase.Forexample,"Risetovote,sir."isalsoapalindromebutourcurrentprogramdoesn'tsayitis.Canyouimprovetheaboveprogramtorecognizethispalindrome?
Ifyouneedahint,theideaisthat...
FilesYoucanopenandusefilesforreadingorwritingbycreatinganobjectofthefileclassandusingitsread,readlineorwritemethodsappropriatelytoreadfromorwritetothefile.Theabilitytoreadorwritetothefiledependsonthemodeyouhavespecifiedforthefileopening.Thenfinally,whenyouarefinishedwiththefile,youcalltheclosemethodtotellPythonthatwearedoneusingthefile.
Example(saveasio_using_file.py):
1
InputandOutput
112
poem='''\
Programmingisfun
Whentheworkisdone
ifyouwannamakeyourworkalsofun:
usePython!
'''
#Openfor'w'riting
f=open('poem.txt','w')
#Writetexttofile
f.write(poem)
#Closethefile
f.close()
#Ifnomodeisspecified,
#'r'eadmodeisassumedbydefault
f=open('poem.txt')
whileTrue:
line=f.readline()
#ZerolengthindicatesEOF
iflen(line)==0:
break
#The`line`alreadyhasanewline
#attheendofeachline
#sinceitisreadingfromafile.
print(line,end='')
#closethefile
f.close()
Output:
$python3io_using_file.py
Programmingisfun
Whentheworkisdone
ifyouwannamakeyourworkalsofun:
usePython!
HowItWorks
First,openafilebyusingthebuilt-inopenfunctionandspecifyingthenameofthefileandthemodeinwhichwewanttoopenthefile.Themodecanbeareadmode('r'),writemode('w')orappendmode('a').Wecanalsospecifywhetherwearereading,writing,orappendingintextmode('t')orbinarymode('b').Thereareactuallymanymoremodesavailableandhelp(open)willgiveyoumoredetailsaboutthem.Bydefault,open()considersthefiletobea't'extfileandopensitin'r'eadmode.
Inourexample,wefirstopenthefileinwritetextmodeandusethewritemethodofthefileobjecttowritetothefileandthenwefinallyclosethefile.
InputandOutput
113
Next,weopenthesamefileagainforreading.Wedon'tneedtospecifyamodebecause'readtextfile'isthedefaultmode.Wereadineachlineofthefileusingthereadlinemethodinaloop.Thismethodreturnsacompletelineincludingthenewlinecharacterattheendoftheline.Whenanemptystringisreturned,itmeansthatwehavereachedtheendofthefileandwe'break'outoftheloop.
Intheend,wefinallyclosethefile.
Now,checkthecontentsofthepoem.txtfiletoconfirmthattheprogramhasindeedwrittentoandreadfromthatfile.
PicklePythonprovidesastandardmodulecalledpickleusingwhichyoucanstoreanyplainPythonobjectinafileandthengetitbacklater.Thisiscalledstoringtheobjectpersistently.
Example(saveasio_pickle.py):
importpickle
#Thenameofthefilewherewewillstoretheobject
shoplistfile='shoplist.data'
#Thelistofthingstobuy
shoplist=['apple','mango','carrot']
#Writetothefile
f=open(shoplistfile,'wb')
#Dumptheobjecttoafile
pickle.dump(shoplist,f)
f.close()
#Destroytheshoplistvariable
delshoplist
#Readbackfromthestorage
f=open(shoplistfile,'rb')
#Loadtheobjectfromthefile
storedlist=pickle.load(f)
print(storedlist)
Output:
$pythonio_pickle.py
['apple','mango','carrot']
HowItWorks
InputandOutput
114
Tostoreanobjectinafile,wehavetofirstopenthefileinwritebinarymodeandthencallthedumpfunctionofthepicklemodule.Thisprocessiscalledpickling.
Next,weretrievetheobjectusingtheloadfunctionofthepicklemodulewhichreturnstheobject.Thisprocessiscalledunpickling.
UnicodeSofar,whenwehavebeenwritingandusingstrings,orreadingandwritingtoafile,wehaveusedsimpleEnglishcharactersonly.
NOTE:IfyouareusingPython2,andwewanttobeabletoreadandwriteothernon-Englishlanguages,weneedtousetheunicodetype,anditallstartswiththecharacteru,e.g.u"helloworld"
>>>"helloworld"
'helloworld'
>>>type("helloworld")
<class'str'>
>>>u"helloworld"
'helloworld'
>>>type(u"helloworld")
<class'str'>
WhenwereadorwritetoafileorwhenwetalktoothercomputersontheInternet,weneedtoconvertourunicodestringsintoaformatthatcanbesentandreceived,andthatformatiscalled"UTF-8".Wecanreadandwriteinthatformat,usingasimplekeywordargumenttoourstandardopenfunction:
#encoding=utf-8
importio
f=io.open("abc.txt","wt",encoding="utf-8")
f.write(u"Imaginenon-Englishlanguagehere")
f.close()
text=io.open("abc.txt",encoding="utf-8").read()
print(text)
HowItWorks
Youcanignoretheimportstatementfornow,we'llexplorethatindetailinthemoduleschapter.
InputandOutput
115
WheneverwewriteaprogramthatusesUnicodeliteralslikewehaveusedabove,wehavetomakesurethatPythonitselfistoldthatourprogramusesUTF-8,andwehavetoput#encoding=utf-8commentatthetopofourprogram.
Weuseio.openandprovidethe"encoding"and"decoding"argumenttotellPythonthatweareusingunicode.
Youshouldlearnmoreaboutthistopicbyreading:
"TheAbsoluteMinimumEverySoftwareDeveloperAbsolutely,PositivelyMustKnowAboutUnicodeandCharacterSets"PythonUnicodeHowtoPragmaticUnicodetalkbyNatBatchelder
SummaryWehavediscussedvarioustypesofinput/output,aboutfilehandling,aboutthepicklemoduleandaboutUnicode.
Next,wewillexploretheconceptofexceptions.
.Useatuple(youcanfindalistofallpunctuationmarkshere)toholdalltheforbiddencharacters,thenusethemembershiptesttodeterminewhetheracharactershouldberemovedornot,i.e.forbidden=(!,?,.,...).↩
1
InputandOutput
116
ExceptionsExceptionsoccurwhenexceptionalsituationsoccurinyourprogram.Forexample,whatifyouaregoingtoreadafileandthefiledoesnotexist?Orwhatifyouaccidentallydeleteditwhentheprogramwasrunning?Suchsituationsarehandledusingexceptions.
Similarly,whatifyourprogramhadsomeinvalidstatements?ThisishandledbyPythonwhichraisesitshandsandtellsyouthereisanerror.
ErrorsConsiderasimpleprintfunctioncall.WhatifwemisspeltprintasPrint?Notethecapitalization.Inthiscase,Pythonraisesasyntaxerror.
>>>Print("HelloWorld")
Traceback(mostrecentcalllast):
File"<stdin>",line1,in<module>
NameError:name'Print'isnotdefined
>>>print("HelloWorld")
HelloWorld
ObservethataNameErrorisraisedandalsothelocationwheretheerrorwasdetectedisprinted.Thisiswhatanerrorhandlerforthiserrordoes.
ExceptionsWewilltrytoreadinputfromtheuser.Press[ctrl-d],(or[ctrl-z]ifyouareusingWindows),andseewhathappens.
>>>s=input('Entersomething-->')
Entersomething-->Traceback(mostrecentcalllast):
File"<stdin>",line1,in<module>
EOFError
PythonraisesanerrorcalledEOFErrorwhichbasicallymeansitfoundanendoffilesymbol(whichisrepresentedbyctrl-d)whenitdidnotexpecttoseeit.
HandlingExceptions
Exceptions
117
Wecanhandleexceptionsusingthetry..exceptstatement.Webasicallyputourusualstatementswithinthetry-blockandputallourerrorhandlersintheexcept-block.
Example(saveasexceptions_handle.py):
try:
text=input('Entersomething-->')
exceptEOFError:
print('WhydidyoudoanEOFonme?')
exceptKeyboardInterrupt:
print('Youcancelledtheoperation.')
else:
print('Youentered{}'.format(text))
Output:
#Pressctrl+d
$pythonexceptions_handle.py
Entersomething-->WhydidyoudoanEOFonme?
#Pressctrl+c
$pythonexceptions_handle.py
Entersomething-->^CYoucancelledtheoperation.
$pythonexceptions_handle.py
Entersomething-->Noexceptions
YouenteredNoexceptions
HowItWorks
Weputallthestatementsthatmightraiseexceptions/errorsinsidethetryblockandthenputhandlersfortheappropriateerrors/exceptionsintheexceptclause/block.Theexceptclausecanhandleasinglespecifiederrororexception,oraparenthesizedlistoferrors/exceptions.Ifnonamesoferrorsorexceptionsaresupplied,itwillhandleallerrorsandexceptions.
Notethattherehastobeatleastoneexceptclauseassociatedwitheverytryclause.Otherwise,what'sthepointofhavingatryblock?
Ifanyerrororexceptionisnothandled,thenthedefaultPythonhandleriscalledwhichjuststopstheexecutionoftheprogramandprintsanerrormessage.Wehavealreadyseenthisinactionabove.
Youcanalsohaveanelseclauseassociatedwithatry..exceptblock.Theelseclauseisexecutedifnoexceptionoccurs.
Exceptions
118
Inthenextexample,wewillalsoseehowtogettheexceptionobjectsothatwecanretrieveadditionalinformation.
RaisingExceptionsYoucanraiseexceptionsusingtheraisestatementbyprovidingthenameoftheerror/exceptionandtheexceptionobjectthatistobethrown.
TheerrororexceptionthatyoucanraiseshouldbeaclasswhichdirectlyorindirectlymustbeaderivedclassoftheExceptionclass.
Example(saveasexceptions_raise.py):
classShortInputException(Exception):
'''Auser-definedexceptionclass.'''
def__init__(self,length,atleast):
Exception.__init__(self)
self.length=length
self.atleast=atleast
try:
text=input('Entersomething-->')
iflen(text)<3:
raiseShortInputException(len(text),3)
#Otherworkcancontinueasusualhere
exceptEOFError:
print('WhydidyoudoanEOFonme?')
exceptShortInputExceptionasex:
print(('ShortInputException:Theinputwas'+
'{0}long,expectedatleast{1}')
.format(ex.length,ex.atleast))
else:
print('Noexceptionwasraised.')
Output:
$pythonexceptions_raise.py
Entersomething-->a
ShortInputException:Theinputwas1long,expectedatleast3
$pythonexceptions_raise.py
Entersomething-->abc
Noexceptionwasraised.
HowItWorks
Exceptions
119
Here,wearecreatingourownexceptiontype.ThisnewexceptiontypeiscalledShortInputException.Ithastwofields-lengthwhichisthelengthofthegiveninput,andatleastwhichistheminimumlengththattheprogramwasexpecting.
Intheexceptclause,wementiontheclassoferrorwhichwillbestoredasthevariablenametoholdthecorrespondingerror/exceptionobject.Thisisanalogoustoparametersandargumentsinafunctioncall.Withinthisparticularexceptclause,weusethelengthandatleastfieldsoftheexceptionobjecttoprintanappropriatemessagetotheuser.
Try...FinallySupposeyouarereadingafileinyourprogram.Howdoyouensurethatthefileobjectisclosedproperlywhetherornotanexceptionwasraised?Thiscanbedoneusingthefinallyblock.
Savethisprogramasexceptions_finally.py:
importsys
importtime
f=None
try:
f=open("poem.txt")
#Ourusualfile-readingidiom
whileTrue:
line=f.readline()
iflen(line)==0:
break
print(line,end='')
sys.stdout.flush()
print("Pressctrl+cnow")
#Tomakesureitrunsforawhile
time.sleep(2)
exceptIOError:
print("Couldnotfindfilepoem.txt")
exceptKeyboardInterrupt:
print("!!Youcancelledthereadingfromthefile.")
finally:
iff:
f.close()
print("(Cleaningup:Closedthefile)")
Output:
Exceptions
120
$pythonexceptions_finally.py
Programmingisfun
Pressctrl+cnow
^C!!Youcancelledthereadingfromthefile.
(Cleaningup:Closedthefile)
HowItWorks
Wedotheusualfile-readingstuff,butwehavearbitrarilyintroducedsleepingfor2secondsafterprintingeachlineusingthetime.sleepfunctionsothattheprogramrunsslowly(Pythonisveryfastbynature).Whentheprogramisstillrunning,pressctrl+ctointerrupt/canceltheprogram.
ObservethattheKeyboardInterruptexceptionisthrownandtheprogramquits.However,beforetheprogramexits,thefinallyclauseisexecutedandthefileobjectisalwaysclosed.
Notethatweusesys.stdout.flush()afterprintsothatitprintstothescreenimmediately.
ThewithstatementAcquiringaresourceinthetryblockandsubsequentlyreleasingtheresourceinthefinallyblockisacommonpattern.Hence,thereisalsoawithstatementthatenablesthistobedoneinacleanmanner:
Saveasexceptions_using_with.py:
withopen("poem.txt")asf:
forlineinf:
print(line,end='')
HowItWorks
Theoutputshouldbesameasthepreviousexample.Thedifferencehereisthatweareusingtheopenfunctionwiththewithstatement-weleavetheclosingofthefiletobedoneautomaticallybywithopen.
Whathappensbehindthescenesisthatthereisaprotocolusedbythewithstatement.Itfetchestheobjectreturnedbytheopenstatement,let'scallit"thefile"inthiscase.
Italwayscallsthethefile.__enter__functionbeforestartingtheblockofcodeunderitandalwayscallsthefile.__exit__afterfinishingtheblockofcode.
Exceptions
121
Sothecodethatwewouldhavewritteninafinallyblockshouldbetakencareofautomaticallybythe__exit__method.Thisiswhathelpsustoavoidhavingtouseexplicittry..finallystatementsrepeatedly.
Morediscussiononthistopicisbeyondscopeofthisbook,sopleasereferPEP343foracomprehensiveexplanation.
SummaryWehavediscussedtheusageofthetry..exceptandtry..finallystatements.Wehaveseenhowtocreateourownexceptiontypesandhowtoraiseexceptionsaswell.
Next,wewillexplorethePythonStandardLibrary.
Exceptions
122
StandardLibraryThePythonStandardLibrarycontainsahugenumberofusefulmodulesandispartofeverystandardPythoninstallation.ItisimportanttobecomefamiliarwiththePythonStandardLibrarysincemanyproblemscanbesolvedquicklyifyouarefamiliarwiththerangeofthingsthattheselibrariescando.
Wewillexploresomeofthecommonlyusedmodulesinthislibrary.YoucanfindcompletedetailsforallofthemodulesinthePythonStandardLibraryinthe'LibraryReference'sectionofthedocumentationthatcomeswithyourPythoninstallation.
Letusexploreafewusefulmodules.
CAUTION:Ifyoufindthetopicsinthischaptertooadvanced,youmayskipthischapter.However,IhighlyrecommendcomingbacktothischapterwhenyouaremorecomfortablewithprogrammingusingPython.
sysmoduleThesysmodulecontainssystem-specificfunctionality.Wehavealreadyseenthatthesys.argvlistcontainsthecommand-linearguments.
SupposewewanttochecktheversionofthePythonsoftwarebeingused,thesysmodulegivesusthatinformation.
>>>importsys
>>>sys.version_info
sys.version_info(major=3,minor=5,micro=1,releaselevel='final',serial=0)
>>>sys.version_info.major==3
True
HowItWorks
Thesysmodulehasaversion_infotuplethatgivesustheversioninformation.Thefirstentryisthemajorversion.Wecanpulloutthisinformationtouseit.
loggingmodule
StandardLibrary
123
Whatifyouwantedtohavesomedebuggingmessagesorimportantmessagestobestoredsomewheresothatyoucancheckwhetheryourprogramhasbeenrunningasyouwouldexpectit?Howdoyou"storesomewhere"thesemessages?Thiscanbeachievedusingtheloggingmodule.
Saveasstdlib_logging.py:
importos
importplatform
importlogging
ifplatform.platform().startswith('Windows'):
logging_file=os.path.join(os.getenv('HOMEDRIVE'),
os.getenv('HOMEPATH'),
'test.log')
else:
logging_file=os.path.join(os.getenv('HOME'),
'test.log')
print("Loggingto",logging_file)
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s:%(levelname)s:%(message)s',
filename=logging_file,
filemode='w',
)
logging.debug("Startoftheprogram")
logging.info("Doingsomething")
logging.warning("Dyingnow")
Output:
$pythonstdlib_logging.py
Loggingto/Users/swa/test.log
$cat/Users/swa/test.log
2014-03-2909:27:36,660:DEBUG:Startoftheprogram
2014-03-2909:27:36,660:INFO:Doingsomething
2014-03-2909:27:36,660:WARNING:Dyingnow
Ifyoudonothavethecatcommand,thenyoucanjustopenthetest.logfileinatexteditor.
HowItWorks
StandardLibrary
124
Weusethreemodulesfromthestandardlibrary-theosmoduleforinteractingwiththeoperatingsystem,theplatformmoduleforinformationabouttheplatformi.e.theoperatingsystemandtheloggingmoduletologinformation.
First,wecheckwhichoperatingsystemweareusingbycheckingthestringreturnedbyplatform.platform()(formoreinformation,seeimportplatform;help(platform)).IfitisWindows,wefigureoutthehomedrive,thehomefolderandthefilenamewherewewanttostoretheinformation.Puttingthesethreepartstogether,wegetthefulllocationofthefile.Forotherplatforms,weneedtoknowjustthehomefolderoftheuserandwegetthefulllocationofthefile.
Weusetheos.path.join()functiontoputthesethreepartsofthelocationtogether.Thereasontouseaspecialfunctionratherthanjustaddingthestringstogetherisbecausethisfunctionwillensurethefulllocationmatchestheformatexpectedbytheoperatingsystem.
Weconfiguretheloggingmoduletowriteallthemessagesinaparticularformattothefilewehavespecified.
Finally,wecanputmessagesthatareeithermeantfordebugging,information,warningorevencriticalmessages.Oncetheprogramhasrun,wecancheckthisfileandwewillknowwhathappenedintheprogram,eventhoughnoinformationwasdisplayedtotheuserrunningtheprogram.
ModuleoftheWeekSeriesThereismuchmoretobeexploredinthestandardlibrarysuchasdebugging,handlingcommandlineoptions,regularexpressionsandsoon.
ThebestwaytofurtherexplorethestandardlibraryistoreadDougHellmann'sexcellentPythonModuleoftheWeekseries(alsoavailableasabook)andreadingthePythondocumentation.
SummaryWehaveexploredsomeofthefunctionalityofmanymodulesinthePythonStandardLibrary.ItishighlyrecommendedtobrowsethroughthePythonStandardLibrarydocumentationtogetanideaofallthemodulesthatareavailable.
Next,wewillcovervariousaspectsofPythonthatwillmakeourtourofPythonmorecomplete.
StandardLibrary
125
StandardLibrary
126
MoreSofarwehavecoveredamajorityofthevariousaspectsofPythonthatyouwilluse.Inthischapter,wewillcoversomemoreaspectsthatwillmakeourknowledgeofPythonmorewell-rounded.
PassingtuplesaroundEverwishedyoucouldreturntwodifferentvaluesfromafunction?Youcan.Allyouhavetodoisuseatuple.
>>>defget_error_details():
...return(2,'details')
...
>>>errnum,errstr=get_error_details()
>>>errnum
2
>>>errstr
'details'
Noticethattheusageofa,b=<someexpression>interpretstheresultoftheexpressionasatuplewithtwovalues.
ThisalsomeansthefastestwaytoswaptwovariablesinPythonis:
>>>a=5;b=8
>>>a,b
(5,8)
>>>a,b=b,a
>>>a,b
(8,5)
SpecialMethodsTherearecertainmethodssuchasthe__init__and__del__methodswhichhavespecialsignificanceinclasses.
Specialmethodsareusedtomimiccertainbehaviorsofbuilt-intypes.Forexample,ifyouwanttousethex[key]indexingoperationforyourclass(justlikeyouuseitforlistsandtuples),thenallyouhavetodoisimplementthe__getitem__()methodandyourjobis
More
127
done.Ifyouthinkaboutit,thisiswhatPythondoesforthelistclassitself!
Someusefulspecialmethodsarelistedinthefollowingtable.Ifyouwanttoknowaboutallthespecialmethods,seethemanual.
__init__(self,...)
Thismethodiscalledjustbeforethenewlycreatedobjectisreturnedforusage.__del__(self)
Calledjustbeforetheobjectisdestroyed(whichhasunpredictabletiming,soavoidusingthis)
__str__(self)
Calledwhenweusetheprintfunctionorwhenstr()isused.__lt__(self,other)
Calledwhenthelessthanoperator(<)isused.Similarly,therearespecialmethodsforalltheoperators(+,>,etc.)
__getitem__(self,key)
Calledwhenx[key]indexingoperationisused.__len__(self)
Calledwhenthebuilt-inlen()functionisusedforthesequenceobject.
SingleStatementBlocksWehaveseenthateachblockofstatementsissetapartfromtherestbyitsownindentationlevel.Well,thereisonecaveat.Ifyourblockofstatementscontainsonlyonesinglestatement,thenyoucanspecifyitonthesamelineof,say,aconditionalstatementorloopingstatement.Thefollowingexampleshouldmakethisclear:
>>>flag=True
>>>ifflag:print('Yes')
...
Yes
Noticethatthesinglestatementisusedin-placeandnotasaseparateblock.Although,youcanusethisformakingyourprogramsmaller,Istronglyrecommendavoidingthisshort-cutmethod,exceptforerrorchecking,mainlybecauseitwillbemucheasiertoaddanextrastatementifyouareusingproperindentation.
More
128
LambdaFormsAlambdastatementisusedtocreatenewfunctionobjects.Essentially,thelambdatakesaparameterfollowedbyasingleexpression.Lambdabecomesthebodyofthefunction.Thevalueofthisexpressionisreturnedbythenewfunction.
Example(saveasmore_lambda.py):
points=[{'x':2,'y':3},
{'x':4,'y':1}]
points.sort(key=lambdai:i['y'])
print(points)
Output:
$pythonmore_lambda.py
[{'y':1,'x':4},{'y':3,'x':2}]
HowItWorks
Noticethatthesortmethodofalistcantakeakeyparameterwhichdetermineshowthelistissorted(usuallyweknowonlyaboutascendingordescendingorder).Inourcase,wewanttodoacustomsort,andforthatweneedtowriteafunction.Insteadofwritingaseparatedefblockforafunctionthatwillgetusedinonlythisoneplace,weusealambdaexpressiontocreateanewfunction.
ListComprehensionListcomprehensionsareusedtoderiveanewlistfromanexistinglist.Supposeyouhavealistofnumbersandyouwanttogetacorrespondinglistwithallthenumbersmultipliedby2onlywhenthenumberitselfisgreaterthan2.Listcomprehensionsareidealforsuchsituations.
Example(saveasmore_list_comprehension.py):
listone=[2,3,4]
listtwo=[2*iforiinlistoneifi>2]
print(listtwo)
Output:
More
129
$pythonmore_list_comprehension.py
[6,8]
HowItWorks
Here,wederiveanewlistbyspecifyingthemanipulationtobedone(2*i)whensomeconditionissatisfied(ifi>2).Notethattheoriginallistremainsunmodified.
Theadvantageofusinglistcomprehensionsisthatitreducestheamountofboilerplatecoderequiredwhenweuseloopstoprocesseachelementofalistandstoreitinanewlist.
ReceivingTuplesandDictionariesinFunctionsThereisaspecialwayofreceivingparameterstoafunctionasatupleoradictionaryusingthe*or**prefixrespectively.Thisisusefulwhentakingvariablenumberofargumentsinthefunction.
>>>defpowersum(power,*args):
...'''Returnthesumofeachargumentraisedtothespecifiedpower.'''
...total=0
...foriinargs:
...total+=pow(i,power)
...returntotal
...
>>>powersum(2,3,4)
25
>>>powersum(2,10)
100
Becausewehavea*prefixontheargsvariable,allextraargumentspassedtothefunctionarestoredinargsasatuple.Ifa**prefixhadbeenusedinstead,theextraparameterswouldbeconsideredtobekey/valuepairsofadictionary.
TheassertstatementTheassertstatementisusedtoassertthatsomethingistrue.Forexample,ifyouareverysurethatyouwillhaveatleastoneelementinalistyouareusingandwanttocheckthis,andraiseanerrorifitisnottrue,thenassertstatementisidealinthissituation.Whentheassertstatementfails,anAssertionErrorisraised.Thepop()methodremovesandreturnsthelastitemfromthelist.
More
130
>>>mylist=['item']
>>>assertlen(mylist)>=1
>>>mylist.pop()
'item'
>>>assertlen(mylist)>=1
Traceback(mostrecentcalllast):
File"<stdin>",line1,in<module>
AssertionError
Theassertstatementshouldbeusedjudiciously.Mostofthetime,itisbettertocatchexceptions,eitherhandletheproblemordisplayanerrormessagetotheuserandthenquit.
DecoratorsDecoratorsareashortcuttoapplyingwrapperfunctions.Thisishelpfulto"wrap"functionalitywiththesamecodeoverandoveragain.Forexample,IcreatedaretrydecoratorformyselfthatIcanjustapplytoanyfunctionandifanyexceptionisthrownduringarun,itisretriedagain,tillamaximumof5timesandwithadelaybetweeneachretry.Thisisespeciallyusefulforsituationswhereyouaretryingtomakeanetworkcalltoaremotecomputer:
More
131
fromtimeimportsleep
fromfunctoolsimportwraps
importlogging
logging.basicConfig()
log=logging.getLogger("retry")
defretry(f):
@wraps(f)
defwrapped_f(*args,**kwargs):
MAX_ATTEMPTS=5
forattemptinrange(1,MAX_ATTEMPTS+1):
try:
returnf(*args,**kwargs)
except:
log.exception("Attempt%s/%sfailed:%s",
attempt,
MAX_ATTEMPTS,
(args,kwargs))
sleep(10*attempt)
log.critical("All%sattemptsfailed:%s",
MAX_ATTEMPTS,
(args,kwargs))
returnwrapped_f
counter=0
@retry
defsave_to_database(arg):
print("Writetoadatabaseormakeanetworkcalloretc.")
print("Thiswillbeautomaticallyretriedifexceptionisthrown.")
globalcounter
counter+=1
#Thiswillthrowanexceptioninthefirstcall
#Andwillworkfineinthesecondcall(i.e.aretry)
ifcounter<2:
raiseValueError(arg)
if__name__=='__main__':
save_to_database("Somebadvalue")
Output:
More
132
$pythonmore_decorator.py
Writetoadatabaseormakeanetworkcalloretc.
Thiswillbeautomaticallyretriedifexceptionisthrown.
ERROR:retry:Attempt1/5failed:(('Somebadvalue',),{})
Traceback(mostrecentcalllast):
File"more_decorator.py",line14,inwrapped_f
returnf(*args,**kwargs)
File"more_decorator.py",line39,insave_to_database
raiseValueError(arg)
ValueError:Somebadvalue
Writetoadatabaseormakeanetworkcalloretc.
Thiswillbeautomaticallyretriedifexceptionisthrown.
HowItWorks
See:
http://www.ibm.com/developerworks/linux/library/l-cpdecor.htmlhttp://toumorokoshi.github.io/dry-principles-through-python-decorators.html
DifferencesbetweenPython2andPython3See:
"Six"libraryPortingtoPython3ReduxbyArminPython3experiencebyPyDannyOfficialDjangoGuidetoPortingtoPython3DiscussiononWhataretheadvantagestopython3.x?
SummaryWehavecoveredsomemorefeaturesofPythoninthischapterandyetwehaven'tcoveredallthefeaturesofPython.However,atthisstage,wehavecoveredmostofwhatyouareevergoingtouseinpractice.Thisissufficientforyoutogetstartedwithwhateverprogramsyouaregoingtocreate.
Next,wewilldiscusshowtoexplorePythonfurther.
More
133
WhatNextIfyouhavereadthisbookthoroughlytillnowandpracticedwritingalotofprograms,thenyoumusthavebecomecomfortableandfamiliarwithPython.YouhaveprobablycreatedsomePythonprogramstotryoutstuffandtoexerciseyourPythonskillsaswell.Ifyouhavenotdoneitalready,youshould.Thequestionnowis'WhatNext?'.
Iwouldsuggestthatyoutacklethisproblem:
Createyourowncommand-lineaddress-bookprogramusingwhichyoucanbrowse,add,modify,deleteorsearchforyourcontactssuchasfriends,familyandcolleaguesandtheirinformationsuchasemailaddressand/orphonenumber.Detailsmustbestoredforlaterretrieval.
Thisisfairlyeasyifyouthinkaboutitintermsofallthevariousstuffthatwehavecomeacrosstillnow.Ifyoustillwantdirectionsonhowtoproceed,thenhere'sahint .
Onceyouareabletodothis,youcanclaimtobeaPythonprogrammer.Now,immediatelysendmeanemailthankingmeforthisgreatbook;-).Thisstepisoptionalbutrecommended.Also,pleaseconsiderbuyingaprintedcopytosupportthecontinueddevelopmentofthisbook.
Ifyoufoundthatprogrameasy,here'sanotherone:
Implementthereplacecommand.Thiscommandwillreplaceonestringwithanotherinthelistoffilesprovided.
Thereplacecommandcanbeassimpleorassophisticatedasyouwish,fromsimplestringsubstitutiontolookingforpatterns(regularexpressions).
NextProjectsIfyoufoundaboveprogramseasytocreate,thenlookatthiscomprehensivelistofprojectsandtrywritingyourownprograms:https://github.com/thekarangoel/Projects#numbers(thesamelistisalsoatMartyr2'sMegaProjectList).
Alsosee:
ExercisesforProgrammers:57ChallengestoDevelopYourCodingSkillsIntermediatePythonProjects.
1
WhatNext
134
ExampleCodeThebestwaytolearnaprogramminglanguageistowritealotofcodeandreadalotofcode:
PythonCookbookisanextremelyvaluablecollectionofrecipesortipsonhowtosolvecertainkindsofproblemsusingPython.Thisisamust-readforeveryPythonuser.PythonModuleoftheWeekisanotherexcellentmust-readguidetotheStandardLibrary.
AdviceTheHitchhiker'sGuidetoPython!TheElementsofPythonStylePythonBigPicture"WritingIdiomaticPython"ebook(paid)
VideosFullStackWebDevelopmentwithFlaskPyVideo
QuestionsandAnswersOfficialPythonDosandDon'tsOfficialPythonFAQNorvig'slistofInfrequentlyAskedQuestionsPythonInterviewQ&AStackOverflowquestionstaggedwithpython
TutorialsHiddenfeaturesofPythonWhat'stheonecodesnippet/pythontrick/etcdidyouwishyouknewwhenyoulearnedpython?Awaretek'scomprehensivelistofPythontutorials
WhatNext
135
DiscussionIfyouarestuckwithaPythonproblem,anddon'tknowwhomtoask,thenthepython-tutorlististhebestplacetoaskyourquestion.
Makesureyoudoyourhomeworkbytryingtosolvingtheproblemyourselffirstandasksmartquestions.
NewsIfyouwanttolearnwhatisthelatestintheworldofPython,thenfollowtheOfficialPythonPlanet.
InstallinglibrariesThereareahugenumberofopensourcelibrariesatthePythonPackageIndexwhichyoucanuseinyourownprograms.
Toinstallandusetheselibraries,youcanusepip.
CreatingaWebsiteLearnFlasktocreateyourownwebsite.Someresourcestogetstarted:
FlaskOfficialQuickstartTheFlaskMega-TutorialExampleFlaskProjects
GraphicalSoftwareSupposeyouwanttocreateyourowngraphicalprogramsusingPython.ThiscanbedoneusingaGUI(GraphicalUserInterface)librarywiththeirPythonbindings.BindingsarewhatallowyoutowriteprogramsinPythonandusethelibrarieswhicharethemselveswritteninCorC++orotherlanguages.
TherearelotsofchoicesforGUIusingPython:
Kivy
http://kivy.org
WhatNext
136
PyGTK
ThisisthePythonbindingfortheGTK+toolkitwhichisthefoundationuponwhichGNOMEisbuilt.GTK+hasmanyquirksinusagebutonceyoubecomecomfortable,youcancreateGUIappsfast.TheGladegraphicalinterfacedesignerisindispensable.Thedocumentationisyettoimprove.GTK+workswellonGNU/LinuxbutitsporttoWindowsisincomplete.YoucancreatebothfreeaswellasproprietarysoftwareusingGTK+.Togetstarted,readthePyGTKtutorial.
PyQt
ThisisthePythonbindingfortheQttoolkitwhichisthefoundationuponwhichtheKDEisbuilt.QtisextremelyeasytouseandverypowerfulespeciallyduetotheQtDesignerandtheamazingQtdocumentation.PyQtisfreeifyouwanttocreateopensource(GPL'ed)softwareandyouneedtobuyitifyouwanttocreateproprietaryclosedsourcesoftware.StartingwithQt4.5youcanuseittocreatenon-GPLsoftwareaswell.Togetstarted,readaboutPySide.
wxPython
ThisisthePythonbindingsforthewxWidgetstoolkit.wxPythonhasalearningcurveassociatedwithit.However,itisveryportableandrunsonGNU/Linux,Windows,Macandevenembeddedplatforms.TherearemanyIDEsavailableforwxPythonwhichincludeGUIdesignersaswellsuchasSPE(Stani'sPythonEditor)andthewxGladeGUIbuilder.YoucancreatefreeaswellasproprietarysoftwareusingwxPython.Togetstarted,readthewxPythontutorial.
SummaryofGUITools
Formorechoices,seetheGuiProgrammingwikipageattheofficialpythonwebsite.
Unfortunately,thereisnoonestandardGUItoolforPython.Isuggestthatyouchooseoneoftheabovetoolsdependingonyoursituation.ThefirstfactoriswhetheryouarewillingtopaytouseanyoftheGUItools.ThesecondfactoriswhetheryouwanttheprogramtorunonlyonWindowsoronMacandGNU/Linuxorallofthem.Thethirdfactor,ifGNU/Linuxisachosenplatform,iswhetheryouareaKDEorGNOMEuseronGNU/Linux.
Foramoredetailedandcomprehensiveanalysis,seePage26ofthe'ThePythonPapers,Volume3,Issue1'(PDF).
VariousImplementationsThereareusuallytwopartsaprogramminglanguage-thelanguageandthesoftware.Alanguageishowyouwritesomething.Thesoftwareiswhatactuallyrunsourprograms.
WhatNext
137
WehavebeenusingtheCPythonsoftwaretorunourprograms.ItisreferredtoasCPythonbecauseitiswrittenintheClanguageandistheClassicalPythoninterpreter.
TherearealsoothersoftwarethatcanrunyourPythonprograms:
Jython
APythonimplementationthatrunsontheJavaplatform.ThismeansyoucanuseJavalibrariesandclassesfromwithinPythonlanguageandvice-versa.
IronPython
APythonimplementationthatrunsonthe.NETplatform.Thismeansyoucanuse.NETlibrariesandclassesfromwithinPythonlanguageandvice-versa.
PyPy
APythonimplementationwritteninPython!Thisisaresearchprojecttomakeitfastandeasytoimprovetheinterpretersincetheinterpreteritselfiswritteninadynamiclanguage(asopposedtostaticlanguagessuchasC,JavaorC#intheabovethreeimplementations)
TherearealsootherssuchasCLPython-aPythonimplementationwritteninCommonLispandBrythonwhichisanimplementationontopofaJavaScriptinterpreterwhichcouldmeanthatyoucanusePython(insteadofJavaScript)towriteyourweb-browser("Ajax")programs.
Eachoftheseimplementationshavetheirspecializedareaswheretheyareuseful.
FunctionalProgramming(foradvancedreaders)Whenyoustartwritinglargerprograms,youshoulddefinitelylearnmoreaboutafunctionalapproachtoprogrammingasopposedtotheclass-basedapproachtoprogrammingthatwelearnedintheobject-orientedprogrammingchapter:
FunctionalProgrammingHowtobyA.M.KuchlingFunctionalprogrammingchapterin'DiveIntoPython'bookFunctionalProgrammingwithPythonpresentationFuncylibraryPyToolzlibrary
Summary
WhatNext
138
Wehavenowcometotheendofthisbookbut,astheysay,thisisthethebeginningoftheend!.YouarenowanavidPythonuserandyouarenodoubtreadytosolvemanyproblemsusingPython.Youcanstartautomatingyourcomputertodoallkindsofpreviouslyunimaginablethingsorwriteyourowngamesandmuchmuchmore.So,getstarted!
.Createaclasstorepresenttheperson'sinformation.Useadictionarytostorepersonobjectswiththeirnameasthekey.Usethepicklemoduletostoretheobjectspersistentlyonyourharddisk.Usethedictionarybuilt-inmethodstoadd,deleteandmodifythepersons.↩
1
WhatNext
139
Appendix:FLOSSNOTE:Pleasenotethatthissectionwaswrittenin2003,sosomeofthiswillsoundquainttoyou:-)
"Free/LibreandOpenSourceSoftware",inshort,FLOSSisbasedontheconceptofacommunity,whichitselfisbasedontheconceptofsharing,andparticularlythesharingofknowledge.FLOSSarefreeforusage,modificationandredistribution.
Ifyouhavealreadyreadthisbook,thenyouarealreadyfamiliarwithFLOSSsinceyouhavebeenusingPythonallalongandPythonisanopensourcesoftware!
HerearesomeexamplesofFLOSStogiveanideaofthekindofthingsthatcommunitysharingandbuildingcancreate:
Linux:ThisisaFLOSSOSkernelusedintheGNU/Linuxoperatingsystem.Linux,thekernel,wasstartedbyLinusTorvaldsasastudent.AndroidisbasedonLinux.AnywebsiteyouusethesedayswillmostlyberunningonLinux.
Ubuntu:Thisisacommunity-drivendistribution,sponsoredbyCanonicalanditisthemostpopularGNU/Linuxdistributiontoday.ItallowsyoutoinstallaplethoraofFLOSSavailableandallthisinaneasy-to-useandeasy-to-installmanner.Bestofall,youcanjustrebootyourcomputerandrunGNU/LinuxofftheCD!ThisallowsyoutocompletelytryoutthenewOSbeforeinstallingitonyourcomputer.However,Ubuntuisnotentirelyfreesoftware;itcontainsproprietarydrivers,firmware,andapplications.
LibreOffice:Thisisanexcellentcommunity-drivenanddevelopedofficesuitewithawriter,presentation,spreadsheetanddrawingcomponentsamongotherthings.ItcanevenopenandeditMSWordandMSPowerPointfileswithease.Itrunsonalmostallplatformsandisentirelyfree,libreandopensourcesoftware.
MozillaFirefox:Thisisthebestwebbrowser.Itisblazinglyfastandhasgainedcriticalacclaimforitssensibleandimpressivefeatures.Theextensionsconceptallowsanykindofpluginstobeused.
Mono:ThisisanopensourceimplementationoftheMicrosoft.NETplatform.Itallows.NETapplicationstobecreatedandrunonGNU/Linux,Windows,FreeBSD,MacOSandmanyotherplatformsaswell.
Apachewebserver:Thisisthepopularopensourcewebserver.Infact,itisthemostpopularwebserverontheplanet!Itrunsnearlymorethanhalfofthewebsitesoutthere.Yes,that'sright-Apachehandlesmorewebsitesthanallthecompetition(including
Appendix:FLOSS
140
MicrosoftIIS)combined.
VLCPlayer:ThisisavideoplayerthatcanplayanythingfromDivXtoMP3toOggtoVCDsandDVDsto...whosaysopensourceain'tfun?;-)
Thislistisjustintendedtogiveyouabriefidea-therearemanymoreexcellentFLOSSoutthere,suchasthePerllanguage,PHPlanguage,Drupalcontentmanagementsystemforwebsites,PostgreSQLdatabaseserver,TORCSracinggame,KDevelopIDE,Xine-themovieplayer,VIMeditor,Quanta+editor,Bansheeaudioplayer,GIMPimageeditingprogram,...Thislistcouldgoonforever.
TogetthelatestbuzzintheFLOSSworld,checkoutthefollowingwebsites:
OMG!Ubuntu!WebUpd8DistroWatchPlanetDebian
VisitthefollowingwebsitesformoreinformationonFLOSS:
GitHubExploreCodeTriageSourceForgeFreshMeat
So,goaheadandexplorethevast,freeandopenworldofFLOSS!
Appendix:FLOSS
141
Appendix:ColophonAlmostallofthesoftwarethatIhaveusedinthecreationofthisbookareFLOSS.
BirthoftheBookInthefirstdraftofthisbook,IhadusedRedHat9.0Linuxasthefoundationofmysetupandinthesixthdraft,IusedFedoraCore3Linuxasthebasisofmysetup.
Initially,IwasusingKWordtowritethebook(asexplainedinthehistorylesson).
TeenageYearsLater,IswitchedtoDocBookXMLusingKatebutIfoundittootedious.So,IswitchedtoOpenOfficewhichwasjustexcellentwiththelevelofcontrolitprovidedforformattingaswellasthePDFgeneration,butitproducedverysloppyHTMLfromthedocument.
Finally,IdiscoveredXEmacsandIrewrotethebookfromscratchinDocBookXML(again)afterIdecidedthatthisformatwasthelongtermsolution.
Inthesixthdraft,IdecidedtouseQuanta+todoalltheediting.ThestandardXSLstylesheetsthatcamewithFedoraCore3Linuxwerebeingused.However,IhadwrittenaCSSdocumenttogivecolorandstyletotheHTMLpages.Ihadalsowrittenacrudelexicalanalyzer,inPythonofcourse,whichautomaticallyprovidessyntaxhighlightingtoalltheprogramlistings.
Fortheseventhdraft,IwasusingMediaWikiasthebasisofmysetup.Iusedtoediteverythingonlineandthereaderscandirectlyread/edit/discusswithinthewikiwebsite,butIendedupspendingmoretimefightingspamthanwriting.
Fortheeightdraft,IusedVim,Pandoc,andMacOSX.
Fortheninthdraft,IswitchedtoAsciiDocformatandusedEmacs24.3,tomorrowtheme,FiraMonofontandadoc-modetowrite.
Now
Appendix:About
142
2016:IgottiredofseveralminorrenderingissuesinAsciiDoctor,likethe++inC/C++woulddisappearanditwashardtokeeptrackofescapingsuchminorthings.Plus,IhadbecomereluctanttoeditthetextbecauseofthecomplexAsciidocformat.
Forthetenthdraft,IswitchedtowritinginMarkdown+GitBookformat,usingtheSpacemacseditor.
AbouttheAuthorSeehttp://www.swaroopch.com/about/
Appendix:About
143
Appendix:HistoryLessonIfirststartedwithPythonwhenIneededtowriteaninstallerforsoftwareIhadwrittencalled'Diamond'sothatIcouldmaketheinstallationeasy.IhadtochoosebetweenPythonandPerlbindingsfortheQtlibrary.IdidsomeresearchonthewebandIcameacrossanarticlebyEricS.Raymond,afamousandrespectedhacker,wherehetalkedabouthowPythonhadbecomehisfavoriteprogramminglanguage.IalsofoundoutthatthePyQtbindingsweremorematurecomparedtoPerl-Qt.So,IdecidedthatPythonwasthelanguageforme.
Then,IstartedsearchingforagoodbookonPython.Icouldn'tfindany!IdidfindsomeO'Reillybooksbuttheywereeithertooexpensiveorweremorelikeareferencemanualthanaguide.So,IsettledforthedocumentationthatcamewithPython.However,itwastoobriefandsmall.ItdidgiveagoodideaaboutPythonbutwasnotcomplete.ImanagedwithitsinceIhadpreviousprogrammingexperience,butitwasunsuitablefornewbies.
AboutsixmonthsaftermyfirstbrushwithPython,Iinstalledthe(then)latestRedHat9.0LinuxandIwasplayingaroundwithKWord.IgotexcitedaboutitandsuddenlygottheideaofwritingsomestuffonPython.Istartedwritingafewpagesbutitquicklybecame30pageslong.Then,Ibecameseriousaboutmakingitmoreusefulinabookform.Afteralotofrewrites,ithasreachedastagewhereithasbecomeausefulguidetolearningthePythonlanguage.Iconsiderthisbooktobemycontributionandtributetotheopensourcecommunity.
ThisbookstartedoutasmypersonalnotesonPythonandIstillconsideritinthesameway,althoughI'vetakenalotofefforttomakeitmorepalatabletoothers:)
Inthetruespiritofopensource,Ihavereceivedlotsofconstructivesuggestions,criticismsandfeedbackfromenthusiasticreaderswhichhashelpedmeimprovethisbookalot.
StatusOfTheBookThebookneedsthehelpofitsreaderssuchasyourselvestopointoutanypartsofthebookwhicharenotgood,notcomprehensibleoraresimplywrong.Pleasewritetothemainauthorortherespectivetranslatorswithyourcommentsandsuggestions.
Appendix:RevisionHistory4.0
Appendix:RevisionHistory
144
19Jan2016SwitchedbacktoPython3SwitchedbacktoMarkdown,usingGitBookandSpacemacs
3.0
31Mar2014RewrittenforPython2usingAsciiDocandadoc-mode.
2.1
03Aug2013RewrittenusingMarkdownandJasonBlevins'MarkdownMode
2.0
20Oct2012RewritteninPandocformat,thankstomywifewhodidmostoftheconversionfromtheMediawikiformatSimplifyingtext,removingnon-essentialsectionssuchasnonlocalandmetaclasses
1.90
04Sep2008andstillinprogressRevivalafteragapof3.5years!RewritingforPython3.0Rewriteusinghttp://www.mediawiki.org[MediaWiki](again)
1.20
13Jan2005CompleterewriteusingQuanta+onFedoraCore3withlotofcorrectionsandupdates.Manynewexamples.RewrotemyDocBooksetupfromscratch.
1.15
28Mar2004Minorrevisions
1.12
16Mar2004Additionsandcorrections
1.10
09Mar2004Moretypocorrections,thankstomanyenthusiasticandhelpfulreaders.
1.00
08Mar2004
Appendix:RevisionHistory
145
Aftertremendousfeedbackandsuggestionsfromreaders,Ihavemadesignificantrevisionstothecontentalongwithtypocorrections.
0.99
22Feb2004Addedanewchapteronmodules.Addeddetailsaboutvariablenumberofargumentsinfunctions.
0.98
16Feb2004WroteaPythonscriptandCSSstylesheettoimproveXHTMLoutput,includingacrude-yet-functionallexicalanalyzerforautomaticVIM-likesyntaxhighlightingoftheprogramlistings.
0.97
13Feb2004Anothercompletelyrewrittendraft,inDocBookXML(again).Bookhasimprovedalot-itismorecoherentandreadable.
0.93
25Jan2004AddedIDLEtalkandmoreWindows-specificstuff
0.92
05Jan2004Changestofewexamples.
0.91
30Dec2003Correctedtypos.Improvisedmanytopics.
0.90
18Dec2003Added2morechapters.OpenOfficeformatwithrevisions.
0.60
21Nov2003Fullyrewrittenandexpanded.
0.20
20Nov2003Correctedsometyposanderrors.
0.15
20Nov2003
Appendix:RevisionHistory
146
ConvertedtoDocBookXMLwithXEmacs.0.10
14Nov2003InitialdraftusingKWord.
Appendix:RevisionHistory
147
TranslationsTherearemanytranslationsofthebookavailableindifferenthumanlanguages,thankstomanytirelessvolunteers!
Ifyouwanttohelpwiththesetranslations,pleaseseethelistofvolunteersandlanguagesbelowanddecideifyouwanttostartanewtranslationorhelpinexistingtranslationprojects.
Ifyouplantostartanewtranslation,pleasereadtheTranslationhow-to.
ArabicBelowisthelinkfortheArabicversion.ThankstoAshrafAliKhalaffortranslatingthebook,youcanreadthewholebookonlineathttp://www.khaledhosny.org/byte-of-python/index.htmloryoucandownloaditfromsourceforge.netformoreinfoseehttp://itwadi.com/byteofpython_arabi.
AzerbaijaniJahangirShabiyev([email protected])hasvolunteeredtotranslatethebooktoAzerbaijani.Thetranslationisinprogressathttps://www.gitbook.com/book/jahangir-sh/piton-sancmasi
BrazilianPortugueseTherearetwotranslationsinvariouslevelsofcompletionandaccessibility.Theoldertranslationisnowmissing/lost,andnewertranslationisincomplete.
SamuelDiasNeto([email protected])madethefirstBrazilianPortuguesetranslation(oldertranslation)ofthisbookwhenPythonwasin2.3.5version.Thisisnolongerpubliclyaccessible.
RodrigoAmaral([email protected])hasvolunteeredtotranslatethebooktoBrazilianPortuguese,(newertranslation)whichstillremainstobecompleted.
Catalan
Appendix:Translations
148
MoisesGomez([email protected])hasvolunteeredtotranslatethebooktoCatalan.Thetranslationisinprogress.
MoisèsGómez-Iamadeveloperandalsoateacherofprogramming(normallyforpeoplewithoutanypreviousexperience).
SometimeagoIneededtolearnhowtoprograminPython,andSwaroop'sworkwasreallyhelpful.Clear,concise,andcompleteenough.JustwhatIneeded.
Afterthisexperience,Ithoughtsomeotherpeopleinmycountrycouldtakebenefitfromittoo.ButEnglishlanguagecanbeabarrier.
So,whynottrytotranslateit?AndIdidforapreviousversionofBoP.
Imycountrytherearetwoofficiallanguages.IselectedtheCatalanlanguageassumingthatotherswilltranslateittothemorewidespreadSpanish.
ChineseThefollowingURLsareunavailablenow.
Translationsareavailableathttp://woodpecker.org.cn/abyteofpython_cn/chinese/andhttp://zhgdg.gitcafe.com/static/doc/byte_of_python.html.
JuanShen([email protected])hasvolunteeredtotranslatethebooktoChinese.
IamapostgraduateatWirelessTelecommunicationGraduateSchool,BeijingUniversityofTechnology,ChinaPR.Mycurrentresearchinterestisonthesynchronization,channelestimationandmulti-userdetectionofmulticarrierCDMAsystem.Pythonismymajorprogramminglanguagefordailysimulationandresearchjob,withthehelpofPythonNumeric,actually.IlearnedPythonjusthalfayearbefore,butasyoucansee,it'sreallyeasy-understanding,easy-to-useandproductive.JustaswhatisensuredinSwaroop'sbook,'It'smyfavoriteprogramminglanguagenow'.
'AByteofPython'ismytutorialtolearnPython.It'sclearandeffectivetoleadyouintoaworldofPythonintheshortesttime.It'snottoolong,butefficientlycoversalmostallimportantthingsinPython.Ithink'AByteofPython'shouldbestronglyrecommendablefornewbiesastheirfirstPythontutorial.JustdedicatemytranslationtothepotentialmillionsofPythonusersinChina.
ChineseTraditionalFredLin([email protected])hasvolunteeredtotranslatethebooktoChineseTraditional.
Appendix:Translations
149
Itisavailableathttp://code.google.com/p/zhpy/wiki/ByteOfZhpy.
Anexcitingfeatureofthistranslationisthatitalsocontainstheexecutablechinesepythonsourcessidebysidewiththeoriginalpythonsources.
FredLin-I'mworkingasanetworkfirmwareengineeratDeltaNetwork,andI'malsoacontributorofTurboGearswebframework.
Asapythonevangelist(:-p),Ineedsomematerialtopromotepythonlanguage.Ifound'AByteofPython'hitthesweetpointforbothnewbiesandexperiencedprogrammers.'AByteofPython'elaboratesthepythonessentialswithaffordablesize.
Thetranslationareoriginallybasedonsimplifiedchineseversion,andsoonalotofrewriteweremadetofitthecurrentwikiversionandthequalityofreading.
Therecentchinesetraditionalversionalsofeaturedwithexecutablechinesepythonsources,whichareachievedbymynew'zhpy'(pythoninchinese)project(launchfromAug07).
zhpy(pronounce(Z.H.?,orzippy)buildalayeruponpythontotranslateorinteractwithpythoninchinese(TraditionalorSimplified).Thisprojectismainlyaimedforeducation.
FrenchGregory([email protected])hasvolunteeredtotranslatethebooktoFrench.
GérardLabadie([email protected])hascompletedtotranslatethebooktoFrench.
GermanLutzHorn([email protected]),BerndHengelein([email protected])andChristophZwerschke([email protected])havevolunteeredtotranslatethebooktoGerman.
Theirtranslationislocatedathttp://ftp.jaist.ac.jp/pub//sourceforge/a/ab/abop-german.berlios/
LutzHornsays:
Appendix:Translations
150
I'm32yearsoldandhaveadegreeofMathematicsfromUniversityofHeidelberg,Germany.CurrentlyI'mworkingasasoftwareengineeronapubliclyfundedprojecttobuildawebportalforallthingsrelatedtocomputerscienceinGermany.ThemainlanguageIuseasaprofessionalisJava,butItrytodoasmuchaspossiblewithPythonbehindthescenes.EspeciallytextanalysisandconversionisveryeasywithPython.I'mnotveryfamiliarwithGUItoolkits,sincemostofmyprogrammingisaboutwebapplications,wheretheuserinterfaceisbuildusingJavaframeworkslikeStruts.CurrentlyItrytomakemoreuseofthefunctionalprogrammingfeaturesofPythonandofgenerators.AftertakingashortlookintoRuby,Iwasveryimpressedwiththeuseofblocksinthislanguage.GenerallyIlikethedynamicnatureoflanguageslikePythonandRubysinceitallowsmetodothingsnotpossibleinmorestaticlanguageslikeJava.I'vesearchedforsomekindofintroductiontoprogramming,suitabletoteachacompletenon-programmer.I'vefoundthebook'HowtoThinkLikeaComputerScientist:LearningwithPython',and'DiveintoPython'.Thefirstisgoodforbeginnersbuttolongtotranslate.Thesecondisnotsuitableforbeginners.Ithink'AByteofPython'fallsnicelybetweenthese,sinceitisnottoolong,writtentothepoint,andatthesametimeverboseenoughtoteachanewbie.Besidesthis,IlikethesimpleDocBookstructure,whichmakestranslatingthetextagenerationtheoutputinvariousformatsacharm.
BerndHengeleinsays:
Lutzandmearegoingtodothegermantranslationtogether.Wejuststartedwiththeintroandprefacebutwewillkeepyouinformedabouttheprogresswemake.Ok,nowsomepersonalthingsaboutme.Iam34yearsoldandplayingwithcomputerssincethe1980's,whenthe"CommodoreC64"ruledthenurseries.AfterstudyingcomputerscienceIstartedworkingasasoftwareengineer.CurrentlyIamworkinginthefieldofmedicalimagingforamajorgermancompany.AlthoughC++isthemainlanguageI(haveto)useformydailywork,Iamconstantlylookingfornewthingstolearn.LastyearIfellinlovewithPython,whichisawonderfullanguage,bothforitspossibilitiesanditsbeauty.Ireadsomewhereinthenetaboutaguywhosaidthathelikespython,becausethecodelookssobeautiful.Inmyopinionhe'sabsolutlyright.AtthetimeIdecidedtolearnpython,Inoticedthatthereisverylittlegooddocumentationingermanavailable.WhenIcameacrossyourbookthespontaneousideaofagermantranslationcrossedmymind.Luckily,Lutzhadthesameideaandwecannowdividethework.Iamlookingforwardtoagoodcooperation!
Greek
Appendix:Translations
151
TheGreekUbuntuCommunitytranslatedthebookinGreek,foruseinouron-lineasynchronousPythonlessonsthattakeplaceinourforums.Contact@savvasradevicformoreinformation.
IndonesianDaniel([email protected])istranslatingthebooktoIndonesianathttp://python.or.id/moin.cgi/ByteofPython.
WisnuPriyambodo([email protected])alsohasvolunteeredtotranslatethebooktoIndonesian.
Also,BagusAjiSantoso([email protected])hasvolunteered.
Italian(first)EnricoMorelli([email protected])andMassimoLucci([email protected])havevolunteeredtotranslatethebooktoItalian.
TheItaliantranslationispresentathttp://www.gentoo.it/Programmazione/byteofpython.
MassimoLucciandEnricoMorelli-weareworkingattheUniversityofFlorence(Italy)-ChemistryDepartment.I(Massimo)asserviceengineerandsystemadministratorforNuclearMagneticResonanceSpectrometers;EnricoasserviceengineerandsystemadministratorforourCEDandparallel/clusteredsystems.Weareprogrammingonpythonsinceaboutsevenyears,wehadexperienceworkingwithLinuxplatformssincetenyears.InItalyweareresponsibleandadministratorforwww.gentoo.itwebsiteforGentoo/Linuxdistrubutionandwww.nmr.it(nowunderconstruction)forNuclearMagneticResonanceapplicationsandCongressOrganizationandManagements.That'sall!WeareimpressedbythesmartlanguageusedonyourBookandwethinkthisisessentialforapproachingthePythontonewusers(wearethinkingabouthundredofstudentsandresearcherworkingonourlabs).
Italian(second)AnItaliantranslationhasbeencreatedbyCalvinaBice&colleaguesathttp://besthcgdropswebsite.com/translate/a-byte-of-python/.
Japanese
Appendix:Translations
152
ShunroDozono([email protected])istranslatingthebooktoJapanese.
KoreanJeongbinPark([email protected])hastranslatedthebooktoKorean-https://github.com/pjb7687/byte_of_python
IamJeongbinPark,currentlyworkingasaBiophysics&BioinformaticsresearcherinKorea.
Ayearago,Iwaslookingforagoodtutorial/guideforPythontointroduceittomycolleagues,becauseusingPythoninsuchresearchfieldsisbecominginevitableduetotheuserbaseisgrowingmoreandmore.
ButatthattimeonlyfewPythonbooksareavailableinKorean,soIdecidedtotranslateyourebookbecauseitlookslikeoneofthebestguidesthatIhaveeverread!
Currently,thebookisalmostcompletelytranslatedinKorean,exceptsomeofthetextinintroductionchapterandtheappendixes.
Thankyouagainforwritingsuchagoodguide!
MongolianAriunsanaaTunjin([email protected])hasvolunteeredtotranslatethebooktoMongolian.
UpdateonNov22,2009:Ariunsanaaisonthevergeofcompletingthetranslation.
Norwegian(bokmål)EirikVågeskarisahighschoolstudentatSandvikavideregåendeskoleinNorway,abloggerandcurrentlytranslatingthebooktoNorwegian(bokmål).
Appendix:Translations
153
EirikVågeskar:Ihavealwayswantedtoprogram,butbecauseIspeakasmalllanguage,thelearningprocesswasmuchharder.MosttutorialsandbooksarewritteninverytechnicalEnglish,somosthighschoolgraduateswillnotevenhavethevocabularytounderstandwhatthetutorialisabout.WhenIdiscoveredthisbook,allmyproblemsweresolved."AByteofPython"usedsimplenon-technicallanguagetoexplainaprogramminglanguagethatisjustassimple,andthesetwothingsmakelearningPythonfun.Afterreadinghalfofthebook,Idecidedthatthebookwasworthtranslating.Ihopethetranslationwillhelppeoplewhohavefoundthemselfinthesamesituationasme(especiallyyoungpeople),andmaybehelpspreadinterestforthelanguageamongpeoplewithlesstechnicalknowledge.
PolishDominikKozaczko([email protected])hasvolunteeredtotranslatethebooktoPolish.Translationisinprogressandit'smainpageisavailablehere:UkąśPythona.
Update:ThetranslationiscompleteandreadyasofOct2,2009.ThankstoDominik,histwostudentsandtheirfriendfortheirtimeandeffort!
DominikKozaczko-I'maComputerScienceandInformationTechnologyteacher.
PortugueseFidelViegas([email protected])hasvolunteeredtotranslatethebooktoPortuguese.
RomanianPaul-SebastianManole([email protected])hasvolunteeredtotranslatethisbooktoRomanian.
Paul-SebastianManole-I'masecondyearComputerSciencestudentatSpiruHaretUniversity,hereinRomania.I'mmoreofaself-taughtprogrammeranddecidedtolearnanewlanguage,Python.Thewebtoldmetherewasnobetterwaytodosobutread''AByteofPython''.That'showpopularthisbookis(congratulationstotheauthorforwritingsuchaneasytoreadbook).IstartedlikingPythonsoIdecidedtohelptranslatethelatestversionofSwaroop'sbookinRomanian.AlthoughIcouldbetheonewiththefirstinitiative,I'mjustonevolunteersoifyoucanhelp,pleasejoinme.
Russian
Appendix:Translations
154
VladimirSmolyar([email protected])hascompletedaRussiantranslationathttp://wombat.org.ua/AByteOfPython/.
UkranianAverkievAndrey([email protected])hasvolunteeredtotranslatethebooktoRussian,andperhapsUkranian(timepermitting).
Serbian"BugSpice"([email protected])hascompletedaSerbiantranslation:
Thisdownloadlinkisnolongeraccessible.
Moredetailsathttp://forum.ubuntu-rs.org/Thread-zagrljaj-pitona.
SlovakAlbertioWard([email protected])hastranslatedthebooktoSlovakathttp://www.fatcow.com/edu/python-swaroopch-sl/:
Weareanon-profitorganizationcalled"Translationforeducation".Werepresentagroupofpeople,mainlystudentsandprofessors,oftheSlavonicUniversity.Herearestudentsfromdifferentdepartments:linguistics,chemistry,biology,etc.WetrytofindinterestingpublicationsontheInternetthatcanberelevantforusandouruniversitycolleagues.Sometimeswefindarticlesbyourselves;othertimesourprofessorshelpuschoosethematerialfortranslation.Afterobtainingpermissionfromauthorswetranslatearticlesandposttheminourblogwhichisavailableandaccessibletoourcolleaguesandfriends.Thesetranslatedpublicationsoftenhelpstudentsintheirdailystudyroutine.
SpanishAlfonsodelaGuardaReyes([email protected]),GustavoEcheverria([email protected]),DavidCrespoArroyo([email protected])andCristianBermudezSerna([email protected])havevolunteeredtotranslatethebooktoSpanish.
GustavoEcheverriasays:
Appendix:Translations
155
IworkasasoftwareengineerinArgentina.IusemostlyC#and.NettechnologiesatworkbutstrictlyPythonorRubyinmypersonalprojects.IknewPythonmanyyearsagoandIgotstuckinmediately.NotsolongafterknowingPythonIdiscoveredthisbookandithelpedmetolearnthelanguage.ThenIvolunteeredtotranslatethebooktoSpanish.Now,afterreceivingsomerequests,I'vebeguntotranslate"AByteofPython"withthehelpofMaximilianoSoler.
CristianBermudezSernasays:
IamstudentofTelecommunicationsengineeringattheUniversityofAntioquia(Colombia).Monthsago,istartedtolearnPythonandfoundthiswonderfulbook,soivolunteeredtogettheSpanishtranslation.
SwedishMikaelJacobsson([email protected])hasvolunteeredtotranslatethebooktoSwedish.
TurkishTürkerSEZER([email protected])andBugraCakir([email protected])havevolunteeredtotranslatethebooktoTurkish."WhereisTurkishversion?Bitsedeokusak."
Appendix:Translations
156
TranslationHow-to1. Thefullsourceofthebookisavailablefromhttps://github.com/swaroopch/byte-of-
python.2. Pleaseforktherepository.3. Then,fetchtherepositorytoyourcomputer.YouneedtoknowhowtouseGittodothat.4. ReadtheGitBookdocumentation,esp.theMarkdownsection.5. Starteditingthe.mdfilestotranslatetoyourlocallanguage.6. SignuponGitBook.com,createabookandyoucanseeabeautifullyrenderedwebsite,
withlinkstodownloadPDF,EPUB,etc.
Appendix:TranslationHow-to
157
FeedbackThebookneedsthehelpofitsreaderssuchasyourselvestopointoutanypartsofthebookwhicharenotgood,notcomprehensibleoraresimplywrong.Pleasewritetothemainauthorortherespectivetranslatorswithyourcommentsandsuggestions.
Feedback
158