{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Introducción a Python para ciencias e ingenierías (notebook 1)\n", "\n", "Docente: Ing. Martín Gaitán \n", "\n", "\n", "**Links útiles**\n", "\n", "Descarga de la suite \"Anaconda\" (Python 3.6)\n", "\n", "### http://continuum.io/downloads \n", "\n", "Repositorio de \"notebooks\" (material de clase)\n", "\n", "### http://bit.ly/cursopy\n", "\n", "Python \"temporal\" online: \n", "\n", "### http://try.jupyter.org\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ¡Empecemos! \n", "\n", "Python es un lenguaje de programación:\n", "\n", "* Interpretado e Interactivo\n", "* Fácil de aprender, programar y **leer** (menos *bugs*)\n", "* De *muy alto nivel*\n", "* Multiparadigma\n", "* Orientado a objetos\n", "* Libre y con licencia permisiva\n", "* Eficiente\n", "* Versátil y potente! \n", "* Con gran documentación\n", "* Y una gran comunidad de usuarios" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Instalación\n", "\n", "* En Windows o mac: recomendación [Anaconda](http://continuum.io/downloads). **Instalá la versión basada en Python 3** que corresponda a tu Sistema Operativo\n", "\n", "* En linux directamente podes instalar todo lo necesario desde tus repositorios. Por ejemplo en Ubuntu: \n", "\n", "```\n", "sudo apt-get install ipython3-notebook python3-matplotlib python3-numpy python3-scipy`\n", "\n", "```\n", "\n", "### ¿Cómo se usa Python?\n", "\n", "#### Consolas interactivas\n", "\n", "Hay muchas maneras de usar el lenguaje Python. Dijimos que es un lenguaje **interpretado** e **interactivo**. Si ejecutamos la consola (En windows `cmd.exe`) y luego `python`, se abrirá la consola interactiva\n", "\n", "![](files/img/console.png)\n", "\n", "En la consola interactiva podemos escribir sentencias o pequeños bloques de código que son ejecutados inmediatamente. Pero *la consola interactiva* estándar es **limitada**. Mucho mejor es usar **IPython**. \n", "\n", "![](files/img/ipython.png)\n", "\n", "La consola IPython supera a la estándar en muchos sentidos. Podemos autocompletar (``), ver ayuda rápida de cualquier objeto (`?`) y muchas cosas más. \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Ipython Notebook (Jupyter)\n", "\n", "Y otra forma muy útil es usar los *Notebooks*. Jupyter es un entorno web para computación interactiva. \n", "\n", "\n", "
Si bien nació como parte del proyecto IPython, el mismo entorno visual se puede conectar a *\"kernels\"* de distintos lenguajes. Se puede usar Jupyter con Python, Julia, R, Octave y decenas de lenguajes más.
\n", "\n", "\n", "\n", "Podemos crear y editar \"celdas\" de código Python que podés editar y volver a ejecutar, podés intercalar celdas de texto, fórmulas matemáticas, y hacer que gráficos se muestren inscrutados en la misma pantalla. Estos archivos se guardan con extensión *.ipynb*, que pueden exportarse a diversos formatos estátucos como html o como código python puro. (.py)\n", "\n", "Los notebooks son muy útiles para la **\"programación exploratoria\"**, muy frecuente en ciencia e ingeniería\n", "\n", "Todo el material de estos cursos estarán en formato notebook.\n", "\n", "Para ejecutar IPython Notebook, desde la consola tipear:\n", "\n", "```\n", "jupyter notebook\n", "```\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Programas \n", "\n", "También podemos usar Python para hacer programas o scripts. \n", "Esto es, escribir nuestro código en un archivo con extensión `.py` y ejecutarlo con el intérprete de python. \n", "Por ejemplo, el archivo hello.py (al que se le llama módulo) tiene este contenido:\n", "\n", "```python\n", " print(\"¡Hola curso!\")\n", "```\n", "\n", "Si ejecutamos python scripts/hello.py se ejecutará en el interprete Python y obtendremos el resultado" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hola curso\n" ] } ], "source": [ "print('Hola curso')" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "¡Hola curso!\r\n" ] } ], "source": [ "!python3 scripts/hello.py" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
IPython agrega muchas funcionalidades complementarias que no son parte del lenguaje Python. Por ejemplo el signo `!` que precede la línea anterior indica que se ejecutará un programa/comando del sistema en vez de código python
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "### ¿Qué editor usar?\n", "\n", "Python no exige un editor específico y hay muchos modos y maneras de programar. \n", "\n", "Un buen editor orientado a Python científico es **Spyder**, que es un entorno integrado (editor + ayuda + consola interactiva)\n", "\n", "![](files/img/spyder.png)\n", "\n", "También el entorno Jupyter trae un editor sencillo\n", "\n", "![](files/img/editor.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### ¿Python 2 o Python 3? \n", "\n", "Hay dos versiones **actuales** de Python. La rama 2.7 (actualmente la version 2.7.9) y la rama 3 (actualmente 3.6.1). Todas las bibliotecas científicas de Python funcionan con ambas versiones. Pero Python 3 es aún más simple en muchos sentidos y es el que permanecerá a futuro!\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "# ¡Queremos programar!\n", "\n", "\n", "### En el principio: Números\n", "\n", "Python es un lenguaje de muy alto nivel y por lo tanto trae muchos *tipos* de datos incluidos. \n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-9.6" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1 + 1.4 - 12" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ejecuten su consola y ¡a practicar!" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "25279070162814602892416332909167230989159750079826794382624239047131088637588624086108407495497996962875" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "29348575847598437598437598347598435**3" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "5 % 3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Los tipos numéricos básicos son *int* (enteros sin limite), *float* (reales, ) y *complex* (complejos)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(6.4+24j)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(3.2 + 12j) * 2" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "0.1 + 0.3" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "3 // 2" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "3 % 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Las operaciones aritméticas básicas son:\n", "\n", "* adición: `+`\n", "* sustracción: `-`\n", "* multiplicación: `*`\n", "* división: `/`\n", "* módulo (resto de división): `%` \n", "* potencia: `**`\n", "* división entera: `//`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Las operaciones se pueden agrupar con paréntesis y tienen precedencia estándar " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x = 1.32\n", "resultado = ((21.2 + 4.5)**0.2 / x) + 1j\n", "print(resultado)\n", "resultado + 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Outs vs prints\n", "\n", "* La función `print` *imprime* (muestra) el resultado por salida estándar (pantalla) pero **no devuelve un valor** (estrictamente devuelve `None`). Quiere decir que el valor mostrado no queda disponible para seguir computando.\n", "* Si la última sentencia de una celda tiene un resultado distinto a `None`, se guarda y se muestra en `Out[x]`\n", "* Los últimas ejecuciones se guardan en variables automáticas `_`, `__` (última y anteúltima) o en general `_x` o `Out[x]`" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "int(1.4)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "1 + 2J" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "Out[6] # que es Out (sin corchetes)? Pronto lo veremos" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Más funciones matemáticas\n", "\n", "Hay muchas más *funciones* matemáticas y algunas constantes extras definidas en el *módulo* `math`" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import math # se importa el modulo para poder usar sus funciones" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-2.4492935982947064e-16" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "math.sin(2*math.pi)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "6" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# round es una función built-in\n", "round(5.6)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3.1416" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "round(math.pi, 4)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "6" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "math.ceil(5.4)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "math.trunc(5.8)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "28462596809170545189064132121198688901480514017027992307941799942744113400037644437729907867577847758158840621423175288300423399401535187390524211613827161748198241998275924182892597878981242531205946599625986706560161572036032397926328736717055741975962099479720346153698119897092611277500484198845410475544642442136573303076703628825803548967461117097369578603670191071512730587281041158640561281165385325968425825995584688146430425589836649317059251717204276597407446133400054194052462303436869154059404066227828248371512038322178644627183822923899638992827221879702459387693803094627332292570555459690027875282242544348021127559019169425429028916907219097083690539873747452483372899521802363282741217040268086769210451555840567172555372015852132829034279989818449313610640381489304499621599999359670892980190336998484404665419236258424947163178961192041233108268651071354516845540936033009607210346944377982349430780626069422302681885227592057029230843126188497606560742586279448827155956831533440534425446648416894580425709461673613187605234982286326452921529423479870603344290737158688499178932580691483168854251956006172372636323974420786924642956012306288720122652952964091508301336630982733806353972901506581822574295475894399765113865541208125788683704239208764484761569001264889271590706306409661628038784044485191643790807186112370622133415415065991843875961023926713276546986163657706626438638029848051952769536195259240930908614471907390768585755934786981720734372093104825475628567777694081564074962275254993384112809289637516990219870492405617531786346939798024619737079041868329931016554150742308393176878366923694849025999607729684293977427536263119825416681531891763234839190821000147178932184227805135181734921901146246875769835373441456013122615221391178759688367364087207937002992038279198038702372078039140312368997608152840306051116709484722224870389199993442071395836983063962232079115624044250808919914319837120445598344047556759489212101498152454543594285414390843564419984224855478532163624030098442855331829253154206551237079705816393460296247697010388742206441536626733715428700789122749340684336442889847100840641600093623935261248037975293343928764398316390312776450722479267851700826669598389526150759007349215197592659192708873202594066382118801988854748266048342256457705743973122259700671936061763513579529821794290797705327283267501488024443528681645026165662837546519006171873442260438919298506071515390031106684727360135816706437861756757439184376479658136100599638689552334648781746143243573224864326798481981458432703035895508420534788493364582482592033288089025782388233265770205248970937047210214248413342465268206806732314214483854074182139621846870108359582946965235632764870475718351616879235068366271743711915723361143070121120767608697851559721846485985918643641716850899625516820910793570231118518174775010804622585521314764897490660752877082897667514951009682329689732000622392888056658036140311285465929084078033974900664953205873164948093883816198658850827382468034897864757116679890423568018303504133875731972630897909435710687797301633918087868474943633533893373586906405848417828065196275826434429258058422212947649402948622670761832988229004072390403733168207417413251656688443079339447019208905620788387585342512820957359307018197708340163817638278562539516825426644614941044711579533262372815468794080423718587423026200264221822694188626212107297776657401018376182280136857586442185863011539843712299107010094061929413223202773193959467006713695377097897778118288242442920864816134179562017471831609687661043140497958198236445807368209404022211181530051433387076607063149616107771117448059552764348333385744040212757031851527298377435921878558552795591028664457917362007221858143309977294778923720717942857756271300923982397921957581197264742642878266682353915687857271620146192244266266708400765665625807109474398740110772811669918806268726626565583345665007890309050656074633078027158530817691223772813510584527326591626219647620571434880215630815259005343721141000303039242866457207328473481712034168186328968865048287367933398443971236735084527340196309427697652684170174990756947982757825835229994315633322107439131550124459005324702680312912392297979030417587823398622373535054642646913502503951009239286585108682088070662734733200354995720397086488066040929854607006339409885836349865466136727880748764700702458790118046518296111277090609016152022111461543158317669957060974618085359390400067892878548827850938637353703904049412684618991272871562655001270833039950257879931705431882752659225814948950746639976007316927310831735883056612614782997663188070063044632429112260691931278881566221591523270457695867512821990938942686601963904489718918597472925310322480210543841044325828472830584297804162405108110326914001900568784396341502696521048920272140232160234898588827371428695339681755106287470907473718188014223487248498558198439094651708364368994306189650243288353279667190184527620551085707626204244509623323204744707831190434499351442625501701771017379551124746159471731862701565571266295855125077711738338208419705893367323724453280456537178514960308802580284067847809414641838659226652806867978843250660537943046250287105104929347267471267499892634627358167146935060495110340755404658170393481046758485625967767959768299409334026387269378365320912287718077451152622642548771835461108886360843272806227776643097283879056728618036048633464893371439415250259459652501520959536157977135595794965729775650902694428088479761276664847003619648906043761934694270444070215317943583831051404915462608728486678750541674146731648999356381312866931427616863537305634586626957894568275065810235950814888778955073939365341937365700848318504475682215444067599203138077073539978036339267334549549296668759922530893898086430606532961793164029612492673080638031873912596151131890359351266480818568366770286537742390746582390910955517179770580797789289752490230737801753142680363914244720257728891784950078117889336629750436804214668197824272980697579391742229456683185815676816288797870624531246651727622758295493421483658868919299587402095696000243560305289829866386892076992834030549710266514322306125231915131843876903823706205399206933943716880466429711476743564486375026847698148853105354063328845062012173302630676481322931561043551941761050712449024873277273112091945865137493190965162497691657553812198566432207978666300398938660238607357858114394715872800893374165033792965832618436073133327526023605115524227228447251463863269369763762510196714380125691227784428426999440829152215904694437282498658085205186576292992775508833128672638418713277780874446643875352644733562441139447628780974650683952982108174967958836452273344694873793471790710064978236466016680572034297929207446822322848665839522211446859572858403863377278030227591530497865873919513650246274195899088374387331594287372029770620207120213038572175933211162413330422773742416353553587977065309647685886077301432778290328894795818404378858567772932094476778669357537460048142376741194182671636870481056911156215614357516290527351224350080604653668917458196549482608612260750293062761478813268955280736149022525819682815051033318132129659664958159030421238775645990973296728066683849166257949747922905361845563741034791430771561168650484292490281102992529678735298767829269040788778480262479222750735948405817439086251877946890045942060168605142772244486272469911146200149880662723538837809380628544384763053235070132028029488392008132135446450056134987017834271106158177289819290656498688081045562233703067254251277277330283498433595772575956224703707793387146593033088629699440318332665797514676502717346298883777397848218700718026741265997158728035440478432478674907127921672898523588486943546692255101337606377915164597254257116968477339951158998349081888281263984400505546210066988792614558214565319696909827253934515760408613476258778165867294410775358824162315779082538054746933540582469717674324523451498483027170396543887737637358191736582454273347490424262946011299881916563713847111849156915054768140411749801454265712394204425441028075806001388198650613759288539038922644322947990286482840099598675963580999112695367601527173086852756572147583507122298296529564917835071750835741362282545055620270969417476799259229774888627411314587676147531456895328093117052696486410187407673296986649236437382565475022816471926815559883196629848307776666840622314315884384910519058281816740764463033300119710293036455866594651869074475250837841987622990415911793682799760654186088721626654886492344391030923256910633775969739051781122764668486791736049404393703339351900609387268397299246478483727274770977466693599784857120156789000241947269220974984127323147401549980920381459821416481176357147801554231599667838534854486406936410556913531335231184053581348940938191821898694825383960989942822027599339635206217705343572073396250574216769465101608495601439303244304271576099527308684609204422226103154229984444802110098161333824827375218998738205315164927134498105950159974800571591912202154487748750103473246190633941303030892399411985006225902184164409988173214324422108554248620896250260604398180189026317781146617454999771440665232863846363847001655618153861098188111181734191305505024860345856755585637511729774299329074944236579668332700918367338977347901759248885660379952771540569083017311723894140326159612292912225191095948743805673381278538616491842786938417556898047100859868372033615175158097022566275200160956192229925401759878522038545913771783976389811198485803291048751666921195104514896677761598249468727420663437593207852618922687285527671324883267794152912839165407968344190239094803676688707838011367042753971396201424784935196735301444404037823526674437556740883025225745273806209980451233188102729012042997989005423126217968135237758041162511459175993279134176507292826762236897291960528289675223521425234217247841869317397460411877634604625637135309801590617736758715336803958559054827361876112151384673432884325090045645358186681905108731791346215730339540580987172013844377099279532797675531099381365840403556795731894141976511436325526270639743146526348120032720096755667701926242585057770617893798231096986788448546659527327061670308918277206432551919393673591346037757083193180845929565158875244597601729455720505595085929175506510115665075521635142318153548176884196032085050871496270494017684183980582594038182593986461260275954247433376226256287153916069025098985070798660621732200163593938611475394561406635675718526617031471453516753007499213865207768523824884600623735896608054951652406480547295869918694358811197833680141488078321213457152360124065922208508912956907835370576734671667863780908811283450395784812212101117250718383359083886187574661201317298217131072944737656265172310694884425498369514147383892477742320940207831200807235326288053906266018186050424938788677872495503255424284226596271050692646071767467502337805671893450110737377034119346113374033865364675136733661394731550211457104671161445253324850197901083431641989998414045044901130163759520675715567509485243580269104077637210998671624254795385312852889930956570729218673523216666097874989635362610529821472569482799996220825775840988458484250391189447608729685184983976367918242266571167166580157914500811657192200233759765317495922397884982814705506190689275625210462185661305800255607974609726715033327032310025274640428755556546883765838802543227403507431684278620637697054791726484378174446361520570933228587284315690756255569305558818822603590006739339952504379887470935079276181116276309771257983975996526612120317495882059435754883862282508401408885720583992400971219212548074097752974278775912566026443482713647231849125180866278708626116699989634812405803684794587364820124653663228889011636572270887757736152003450102268890189101673572058661410011723664762657835396364297819011647056170279631922332294228739309233330748258937626198997596530084135383241125899639629445129082802023225498936627506499530838925632246794695960669046906686292645006219740121782899872979704859021775060092893328957272392019589994471945147360850770400725717439318148461909406269545285030526341000565022226152309364882887122046454267700577148994335147162504252365173710266068647253458120186683273953682547456536553597546685788700056988360286686450740256993087483441094086086303707908295240576731684941855810482475304758923392801571302824106234999945932390521409856559565661346003396150515164758852742214732517999548977992849522746029855666700811871200856155016457400484170210303038996339253337466556817824410737409336919294104632307731994759826307383499600770372410446285414648704116273895649834555162165685114551383822047005483996671706246467566101291382048909121117229386244253158913066987462045587244806052829378148302622164542280421757760762365459828223070815503469404938317755053305094698999476119419231280721807216964378433313606760676965187138394338772485493689061845700572043696666465080734495814495966306246698679832872586300064215220210171813917325275173672262621454945468506006334692713838311715849753092643252486960220059099802663765386225463265168414963306369548086551101256757717890616694758344043486218485369591602172030456183497524162039926441331651884768606830642004858557924473340290142588876403712518642229016333691585063273727199596362912783344786218887871009533753551054688980236378263714926913289564339440899470121452134572117715657591451734895195016800621353927175419843876163543479806920886666227099512371706241924914282576453125769939735341673046864585181979668232015693792684926999983992413571941496882273704022820805171808003400480615261792013978945186295290558440703738300533552421153903385185829366779190610116306233673144419202893857201855569596330833615450290424822309297087124788002017383072060482680156675397593789931793515799958929562156307338416294599900276730832827716595064217966523190439250543226753731811755315476780739470338931185107297724318378972674957455778183345495942317353558291046967315391275975687281861691161083156337232639968881490543943261197182274996791176628553401860198315809629981791107208804992292016062059067271273599461871634945774995805337947187105456452579396024210259136415528398395201773012712514892051061708228008339985665786646920737114269682301770416324829479409558694699089379165191006305185352102345189798127619143061864362703081977124992751056732909481202057747100687703379708934229207183903744167503493818836342229284946790660285674293251642569044363473087656797056595677285291081242733154406580199802711579126254172797452862574865921933293805915239524735518887119860391319654287576290190503964083560246277534314409155642181729459941596061979622633242715863425977947348682074802021538734729707999753332987785531053820162169791880380753006334350766147737135939362651905222242528141084747045295688647757913502160922040348449149950778743107189655725492651282693489515795075486172341394610365176616750329948642244039659511882264981315925080185126386635308622223491094629059317829408195640484702456538305432056506924422671863255307640761872086780391711356363501269525091291020496042823232628996502758951052844368177415730941874894428065427561430975828127698124936993313028946670560414084308942231140912722238148470364341019630413630736771060038159590829746410114421358321042574358350220737173219745089035573187350445827238770728271406162997919629357224104477155051652535867544109395079218369015261138440382680054150924346511711436477899444553993653667727589565713987505542990824585609510036934663100673714708029927656933435500927189854050109917474979991554392031908961967615444686048175400695689471463928245383807010444181045506171305160584355817521032338465829201071030061124283407458607006060194830551364867021020364708470807422704371893706965688795617928713045224516842027402021966415605280335061293558739079393524404092584248380607177444609964035221891022961909032569042381374492494906892314330884224399631396391545854065286326468807581148748371408284176455226386313520264894016262494802388568231599102952620337126449279901938211134518446387544516391239377974190576649911764237637722282802318465738050121277809680315691477264910257503508758792248110223544524410872448565700755187132146592093548504552829170749596775404450779494836371756062326925757412813110241910373338080434325310884694831555729402265394972913817581338619457057799561808755951413644907613109617155928376585840036489374076822257523935988731081689667688287403837192827690431514106997678303819085690713091931340846019511147482766350724676534922040058626677632935516631939622498979912708004465982264899125226813124300528104995058595676527123591494442612554437618645029202881358582871789577224116380815161831603129728796987480139828621645629196153096358337313619724773332353025466571196902611237380629030242904275794549030022660847446513161741691916851746464945459696005330885252792083472495235473110674109099223541055506299687642153951249355986311346661725116890785633328935569150449485189113488301876365100638502565916433021928565596263914382895068324838727165616560111531517055222955765944972454788815532316417453267167978861141165355597588331979638070962998880767303616940317736448140427867784251232449974693421348217179595190698204602997172001174857303889719205597414742453011135869766256607770970225633261701108463784795555258504578058879440756064974127974530918418405207558526462208821483646754652237609210787539190454684852349759986044943322828073120679922402477507514105890774627334319091255451352225329275913842047384603056163154236552935312278389759446515787337343463172280001031380425481404022090580405056003860937403435068863081434683848900708938565050027569059678069404698435184535134141031615133683043714786642925389717165978629010728400758939700388317742648163725113277369926827709465342583596111881955092462062153978121197244762623771534452048069819082524943963962251113831177428978535825590832490480497516047104257569753442551515779815600370847230603484753977513688390404316017486248871339311818523029425425676202485688393970836748788453789172574145155917919035398535077200900594979352939459631213445503368260690059828717723533375221941915547303742062343262892968397015058892191112049249864792053410872349115430987182160055762209075732304626106597744947658346313025598636315029959672352476943975462530206788193304372284800209305354155640664838569378144603138697563459200233462606995955513484754147891180830329816421587452922952678937925647752029052675349356673744293182673374571642465407748267901046778759085408130531447176455869894169668940436489952465247443988349583871206296485413357553813419500498743813369062703973874586604296871595820715766599826607317005624465541763024501349159567288942619746144496908671655859782729228702723774835097362901019130417812735773037781804081589136005207315806941034305003184349342360269244733060013861119781774472669608928321052543116496033420102032603863672532889648333405862204843616575362001468405476649666473566979572953394809138263703324220930839366954980688240491622063147911494642042500022450413425558561937442905257252436320054487441524307305215070491020434076572476865095751174125413729531644521765577235348601821566833352520532830000108344008762266843817023235605645158256954177359197813649975559601912567744942717986360045847405209290089397315276024304951653864431388147876977541478757432610159879709758855625806766197973098472460769484821127948427976536607055051639104415022554420329721292033009353356687294595912327965886376486894188433640548494009574965791657687213927330153555097865114767947399690623184878377515462613823651665956337209345708208301840482797005728071432925727577436229587047361641609731817241594204270366066404089740245521530725227388637241859646455223673260411164598464020010216920823315155388821071527191267876531795071908204525100447821291318544054814494151867114207103693891129125012750853466337717749376016543454696390042711129829255096830420665725364279472200020835313883708781649957189717629338794854271276882652003766325924561614868744897471519366219275665852462114457407010675380427564184440834805203838265052601698584060084788422421887856927897751810442805474427229455167420335686460609977973124950433321425205053675790499520783597650415379001132579536040655172654879022173595444151139429231648950663177813039057462082449171921311864129633704661406456900178942356738775523130952785912774533241855442484484493664210731348819180640189222317302156645813473186449997905781662091469870718039388885781280740226363602294114354869871402143572055947730892808653678920201935102605361567924483276749476117858316071865710310842200560259545115191391309119544447844361032741876102338843391687589233423790859841968266525610628751237572318491474951945985728897934981791761822652480408237128109790772638864286067917082288575852703470839714561619926247844794692794996845945632382702297364173503430783194115698247820013290851202878474805860188960045901745974055630732714487679085288867978809970695240681006625611440014983413580889737246844064948857074167687916413224205373654067330186392497910915474785959163865597507090581175924899502214799250945635582514315814464060134283490422798357939659258985200763845646681640732681928346007767285876284900068874564639274964415904034033672337814491597032941787294155061054129515400159393851663929325677429557549480046658273579653990940233543644649376827272541873627547532976808190325336141086433084237771738995221536763095302045902438694632702895293994483013577589081214884558493819874505920914067209522469096263076941753340983698859363700314973728977996360018626500174929290087931189997822963712306642297996163582572600112288983647651418045975770042120833949364659647336464289044499325396227091907373705772051322815957863227591912786054297862953188615559804728160710864132803585400160055575686855791785977899197902656592621283007225351401525973569300729015392211116868504740402172174442051738000251361000494534119324331668344243125963098812396962202358858395587831685194833126653577353244379935683215269177042249034574534858913812582681366908929476809052635560638119661306063936938411817713545929884317232912236262458868394202889981693561169865429884776513118227662526739978808816010470651542335015671353744817086234314662531190291040152262927104099285072418843329007277794754111637552176563589316326636049381218401837512818884771168975479483767664084842753623074019542183217985496260666590347925816342392670947839907062923166535037285019751324813803837070894638925470887039085723581006130628646664710006104352115778926613432214655311411882596942926284522109026688414975763341554921135581254616558078273470115814006008345762133130389987843270653719956709570847385786092649188858378739239165554263577301292243641604062551736892335636568854365851646207821875741724364525814143487632761341752707376754922276287782264765154315341585713773522730335403376364204258034257264749686217823666951353410677378421131371131987373222891805275062812277716412494412401207125954319991746574745892582613712825555535080404143944557295994554635608487251339462936358940832098964801619583130429720964794128539388996265368928263807677168759588502216464582430940165009688797366157733560316836710386895228270941509545222744002735499253670214715994056544813842186380128799900820933576320736369405991424263718294000613741900579513096298545330748197802568301089672873802234820488862973130369689882640657904781562389778485365025691064231795736025330908763271784911189748432246868086340383964176127605788646574472284824932687443062551220506955168464669477183681911432873544815836350548146411099960143390595799766290646881295025039150923633011076070632863317393378149693380247580035052789782755750928604039420506342939327064636161031822879248152679306862749237275631852225654266008556849497720285909150930495425967473648331437236349555448901598668408362176913559656039519670425368863482369587129462524759031776813184977588276576740482558136502103649585505703259219957675334264223783723586058509403583977103476670644788640831109650302565215607464019652716999732373465237173456595514559493098166644006211599349133180135150528651842178828026343325934755850761168697709125580056185683710540856081249519403148064618719402577663285267019698387567561524696759028106864896869293315954352097687527137201616160931174250199709289684940034696242325688410665113304377412256176258658941236728171145526423894512631717834790276921171452887352955019336759218908006048633737786728180610254782570436788449503518925787499836694785908612975543084122677060954347612133717433156783790162012337237023338316414706428592185977610158232721997915062871868186750981665537745013020880333904353639770263363809098526494532628146558065546504823486429495390613257400496912888340518222933644476683855037967975809619983575807027759535968788226194659612223044549275600274955168583542582295336042834426318478068825395450746691877897765406038432512843812811316856204608617289408229658626174420766920297427930088129519854678713548623236610413216581279267151545961594352593456757445992307889205519540082316409719591250025455237503106735639748835542480449681383030671851931491335789202123605308199952020584503423499932150962634977812456658304680581824563524814625849331926195406884818446445248429486063016169476663242625231476322371109695369483824482316410396224507675405614287468267835723704895606990652792688455844512046654853378534026646645042339638488257719874953611300494215593735545211926186721478265416885604094928290056616883807637656690510740892510549165222968878676968631652514917701499900066637344546120262780701925698706225540928945194718778004306130021828287425867048748480826948573444778244078734102710824870269523830804910960482013901294024631244800159336670212658317677879752965963472576894326540435889267293950687860830626266263287392087327302547910099932113388977807814336728791448768373686467748528777737403547472871644217767820712964506270880978637928144071192505141148004907055608097229299792441471062852247029870699869227676341773513258602908903875707454368077876422385333700692089616351009233587303986543906071880952557553380364725895007306772122528078179471056481171378557451057691044322925429024149433588396093679321361696954251299731031032804436954501929843820842383121265825740594509426942777307124802176915781835720087170538773256017987133005505911377823841791640280841409623820847637393013930778428554545222367559824666250608754284876104145661362227642405914304455580856318180935230407793891614902116292400515074914068443203230365609954878620999194306564455332547135557365318516011700321550690787716752062881527885897149410320986984083048966524351030502444679931779147659103428949129054120361601695671222140806369405940304552186212879933092856231022418446365289097444640151986623183881962444822590783585914043686193019041458962693878907034982169868696934448086213990534591792826654304798207219634134755646525483143771156678459077797196510772468000293581546267646310224279007313631352522067062951125935874473134186492497282784796644585448962932905262058065248588707020879389134476083344653170939242408249328008915731319541348311820927752486880548733943315867562666122179355051190609992911379445634995627391898459029021713155706096267881673302940198464237390445098028030948975981259252055850973537436556825780313681902007151675693827281818824587541710721180806556448039122504537089422695358382192535075692834095639859265599740391316709290043996275976830375217503360879028295673068862263077729733533853682668734519035709709687322323738300494090123239274318759046526327095178406267264828893646896593219169521106361729757074376148061601331104911692271318609404145014842866423634716982892418180484365230538864559809839273836490685480823014267803143937440431807822678779494006206489151248952516543005634448375046751754207043313372486870633237561645232360481932024377596890914783372179553676992603235715185513391098402739063753280702313301755754269396202629423910945323537910125948964941812563672992967084250667599803456273455598559628512281414582556024841783305645240508450065988755987518601335860624932784487772006842296591945516539562982960591610046578907214842054861830418175604559815168088031783080261445994444677918012432146400983610678683412974872596729258786806223080115822026289014364459002301645823666709265571264559925790622304745235625575111770791512002789380975775468546121017307522799241407026308137792971909461413145802081087738121624539858769697371425881836152605069380926917712087321915005831977113322793572385071940612761291872572099404930250277748156614021327434743881966413330052634229082906400927944924808556131183440161804801357032507836323938921567643159620442612809700944107776130638909071294456394056601559246025454204771186140420155233371270501377121034570009578009389265329385720478576508777149663403003562380595757191609382171312222810465858388943507176431939973012661591423837170284400120399485880996231859472474858776584355077006934099220340378772192728370301380838144394114984971730766162961342059105014814283949700695951676939041557902856356911055547312684571497449635320554677940775184056667637222969090346128706829887104278761090090999160443821794511763620835379716161833124364431267855435550800507986124664397724135502128238026726719914989727248512981287283697489276420792868666970177259794407858155909332508554131299946581118527691652464790819119384233275897699573012098103009171001695718791616942270079528915191912521053891838538959315167400505723817401030621004380243011187977704252328073236575129609372456053680037516596164236147709330391224409752871732067976128120428026739256557305675931512645750047875756531854825821411574030473147492511910835615765732002546109686701890307648531373832912682481741181359032826625082549313211431478953352317043989053928534946642886074268371824902498092479487226633686823799580875637040808655649321905489637785549531167397935270799470452399153297534358690514105864096534514182896474439367182852711843560799285895978176543950113088848419163516673213692860830956744502801800373716458009168082972708715609185038654053436660045504985624687376022557041595800250174095361839287643458003670864954057941720085136357127163768323493134230703821274484501440529541695374381945459456533165140990993722722801019654652726227831512103467686166826131471843610025517863247950150022953695466317739589344131481485834694374523981159954666071205997794363440185078360899108948073419633939259318973940943110042116729120199722626609871927014024105805515315100109804996044147291039451030312664114726736839973315035036742741546992633165270432940675237449075056739508929674779115800864399992564817208847429250821546279856079127768611946086210349405535850134472190244543824521089284409498132717010673966471114931896789977661595488186193176900175027901783824624387873831483279500879026433992577026588005849778984624295660321276945810824348129690840972550671054732471317254997191901039553305847040728081693158626093886019147689944137673621432083607375131574376316754666479186753896571555100850626810005119827486807780592667765654100834778571024250133253391587384761024129794736751001163498977803745930025457609870671092153597115178252014281216647543034075128600240297038428615984289816602143429849088917359682192284469123035904329877231843309914187264674607558318725713138832356015809009594182530207799397648462597901883341793830920965841463574411985878296475850943053008148341821747826603773762252997703468752903517310792083220038080809212164346586817989810504274375385786789186350517717501606531826406928883250135919517178537687865881752366421534010961295763074762648070312757365787762352859057153932484576503944390496668087711899192498933896524852395536795827530614167131757915756386606004839994179548705868209201195154952031294562451315422506574858629161606523796643010172693950282294667489681746821163996794950294284013099235901278250437428192557634533217576162292751110598368271567229778620053722932314082887058749444060116236521627717558503013451471452765841864277071769968435499620257547431811994883385806759692359580622165832464092095350648357935817742903018315351290014321495518177456908388719320697769695657771754499149911431368950836160692539606469893374870942933219185601299108564470256257163505508620689240297589684714283678684735455533583477652536156578189996983068654671736445996343136468195427420490472433064675001442697508322369013083895492637066778406531328664886080129513771720847581157719491012345141774941482773580041432667332379617716965698582785832300505265883502247868050648201444570593197343382923860072601696510903258980909912837652275381493529845099414966933862815568031306981064525192703818515872648691762563239441425216118427769145067718411735714396681005615483952443154944864238384298900399826113322468963346522104692545137969276009719645338955332105584245640187448611050959111766828942711640054010503770420346052521318228045892998637903572350665108782350043349942391285236308896510989246641056331584171142885304143772286629832318970869030400301325951476774237516158840915838059151673504519131178193943428482922272304061422582078027829148070426761629302539228321084917759984200595105312164731818409493139800444072847325902609169730998153853939031280878823902948001579008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "math.factorial(1e4)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "ename": "ValueError", "evalue": "math domain error", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mmath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msqrt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# Epa!!\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mValueError\u001b[0m: math domain error" ] } ], "source": [ "math.sqrt(-1) # Epa!!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pero existe un módulo equivalente para operaciones sobre el dominio complejo" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1j" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import cmath\n", "cmath.sqrt(-1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Y también, sabiendo por propiedad de la potencia, podriamos directamente hacer:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(6.123233995736766e-17+1j)" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(-1)**0.5" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Todo es un \"objeto\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "En Python todo es un *objeto*, es decir, una *instancia* de un clase o tipo de datos. Los objetos no solo *guardan* valores (atributos) sino que que tienen acceso a *métodos*, es decir, traen acciones (funciones) que podemos ejecutar sobre esos valores, a veces requiriendo/permitiendo parámetros adicionales. \n", "\n", "Jupyter/IPython facilita conocer todos los atributos y métodos de un objeto mediante **instrospección**. Prueben escribir `resutado.` y apretar ``. Por ejemplo:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "resultado = 1 + 2j" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "R = 4.2" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "R.is_integer()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
Además del `TAB`, en una sesión interactiva de Jupyter, se puede obtener ayuda contextual para cualquier objeto (cualquier cosa!) haciendo `Shift + TAB` una o más veces, o agregando un signo de interrogación al final (`blah?`) y ejecutando
" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "En python \"puro\", estos comportamientos se logran con las funciones `dir()` y `help()`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para conocer la clase/tipo de cualquier objecto se usa `type`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "En muchos casos, se puede convertir explícitamente (o \"castear\") tipos de datos. En particular, entre números:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Ejercicios\n", "\n", "- 1) Crear una variable llamada `magnitud` con un valor real. Definir otra variable compleja `intensidad` cuya parte real sea 1.5 veces `magnitud` y la parte imaginaria `0.3` veces `magnitud` + `1j`. Encontrar la raiz cuadrada de `intensidad`. \n", "\n", "- 2) Para calcular un [interés compuesto](https://es.wikipedia.org/wiki/Inter%C3%A9s_compuesto) se utiliza la fórmula\n", "\n", "$$ \\ C_F = C_I(1+r)^n $$\n", "\n", "Donde:\n", "\n", "* $ \\ C_F $ es el capital al final del enésimo período\n", "* $ \\ C_I $ es el capital inicial\n", "* $ \\ r $ es la tasa de interés expresada en tanto por uno (v.g., 4 % = 0,04) \n", "* $ \\ n $ es el número de períodos\n", "\n", "Codifique la fórmula en una celda y calcule el capital final para un depósito inicial de 10 mil pesos a una tasa del 1.5% mensual en 18 meses.\n", "\n", "- 3) Investigue, a través de la ayuda interactiva, el parámetro opcional de `int` y las funciones `bin`, `oct` y `hex`. Basado en esto exprese en base 2 la operación 1 << 2 y en base hexadecimal `FA1` * `O17` " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Texto\n", "\n", "Una cadena o *string* es una **secuencia** de caracteres (letras, números, simbolos). Python 3 utiliza el estándar [unicode](http://es.wikipedia.org/wiki/Unicode). " ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hola mundo!\n" ] } ], "source": [ "print(\"Hola mundo!\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "chinito = \"字漢字\"" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "type(chinito)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "De paso, `unicode` se aplica a todo el lenguaje, de manera que el propio código puede usar caracterés \"no ascii\"" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": true }, "outputs": [], "source": [ "años = 13" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Las cadenas se pueden definir con apóstrofes, comillas, o triple comillas, de manera que es menos frecuente la necesidad de \"escapar\" caracteres" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "calle = \"O'Higgings\"\n", "metáfora = 'Los \"patitos\" en fila'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Las triples comillas permiten crear cadenas multilínea" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Me gustas cuando \"callas\"\\nporque estás como ausente...'" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "V = \"\"\"Me gustas cuando \"callas\"\n", "porque estás como ausente...\"\"\"\n", "V" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Me gustas cuando \"callas\"\n", "porque estás como ausente...\n" ] } ], "source": [ "print(poema)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Las cadenas tienen sus propios **métodos**: pasar a mayúsculas, capitalizar, reemplazar una subcadena, etc. " ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Hola amigos'" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v = \"hola amigos\"\n", "v.capitalize()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Las cadenas se pueden concatenar" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"O'Higgings fue un soldado de San Martín\"" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = \" fue un soldado de San Martín\"\n", "calle + a" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "y repetir" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'**********'" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"*\" * 10" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para separar una cadena se usa el método `split`" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['hola', 'amigos', 'como']" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = \"hola,amigos,como\"\n", "\n", "a.split(',')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Y el método inverso es `join`, para unir muchas cadenas intercalandolas con otra" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'y jugando al amor nos encontró'" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\" \".join(['y', 'jugando', 'al', 'amor', 'nos', 'encontró'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Indizado y rebanado" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Las cadenas son **secuencias**. O sea, conjuntos ordenados que se pueden indizar, recortar, reordenar, etc. \n", "\n", "![](/files/img/index_slicing.png)\n" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'HOLA'" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cadena = \"HOLA MUNDO\"\n", "cadena[0:4] " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'ODNUM ALOH'" ] }, "execution_count": 87, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cadena[::-1] #wow!" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'HO'" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cadena[0:2]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "El tipo `str` en python es **inmutable**, lo que quiere decir que, una vez definido un objeto tipo cadena no podemos modificarlo. " ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "'str' object does not support item assignment", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mcadena\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;34m'B'\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;31mTypeError\u001b[0m: 'str' object does not support item assignment" ] } ], "source": [ "cadena[0] = 'B'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pero si podemos basarnos en un string para **crear otro**" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'BOLA MUNDO'" ] }, "execution_count": 92, "metadata": {}, "output_type": "execute_result" } ], "source": [ "'B' + cadena[1:]" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'BOLA MUNDO'" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cadena = cadena.replace('H', 'B')\n", "cadena" ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'BOLA SUBMUNDO'" ] }, "execution_count": 93, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cadena[:4] + \" SUB\" + cadena[5:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### longitud de una secuencia\n", "\n", "La función `len` (de *lenght*) devuelve la cantidad de elementos de cualquier secuencia" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "len(cadena)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### interpolación\n", "\n", "Se puede crear un string a partir de una \"plantilla\" con un formato predeterminado. La forma más poderosa es a través del método [`format`](https://docs.python.org/3.4/library/string.html#format-examples)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Messi es crack'" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"{} es {}\".format('Messi', 'crack') # por posición, implicito" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'crack es Messi'" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"{1} es {0}\".format('Messi', 'crack') # por posición, explícito" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Hola Mundo'" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"{saludo} {planeta}\".format(saludo='Hola', planeta='Mundo') # por nombre de argumentos" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'La parte real es 1.00000 y la imaginaria es 2.0 (1+2j)'" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"La parte real es {numero.real:.5f} y la imaginaria es {numero.imag} {numero}\".format(numero=resultado)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Casting de tipos\n", "\n", "Python es dinámico pero de **tipado es fuerte**. Quiere decir que no intenta adivinar y nos exige ser explícitos." ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'22'" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"2\" + \"2\"" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "int(\"2\") + int(\"2\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\n", "float('2.34545') ** 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Ejercicios\n", "\n", "\n", "1. Dado un texto cualquiera, crear uno equivalente con \"subrayado\" con el caracter \"=\" en toda su longitud . Por ejemplo, `\"Beso a Beso\"`, se debe imprimir por pantalla\n", "\n", " ===========\n", " Beso a Beso\n", " ===========\n", " \n", "\n", "\n", "2. Dada una cadena de palabras separadas por coma, generar otra cadena multilinea de \"items\" que comienzan por `\"* \"`. Por ejemplo \"manzanas, naranjas, bananas\" debe imprimir:\n", "\n", " * manzanas\n", " * naranjas\n", " * bananas\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "----\n", "\n", "### Listas y tuplas: contenedores universales" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [], "source": [ "nombres = [\"Melisa\", \"Nadia\", \"Daniel\"]" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "list" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(nombres)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Las listas tambien son secuencias, por lo que el indizado y rebanado funciona igual" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Daniel'" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nombres[-1]" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Nadia', 'Daniel']" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nombres[-2:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Y pueden contener cualquier tipo de objetos" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [], "source": [ "mezcolanza = [1.2, \"Jairo\", 12e6, calle, nombres[1]]" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1.2, 'Jairo', 12000000.0, \"O'Higgings\", 'Nadia']\n" ] } ], "source": [ "print(mezcolanza)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hasta acá son iguales a las **tuplas**" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "(1.2, (1j, 'Melisa'))\n" ] }, { "data": { "text/plain": [ "('Martín', 1.2, (1j, 'Melisa'))" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "una_tupla = (\"Martín\", 1.2, (1j, nombres[0]))\n", "print(type(una_tupla))\n", "print(una_tupla[1:3])\n", "una_tupla" ] }, { "cell_type": "code", "execution_count": 124, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Martín', 1.2, (1j, 'Melisa')]" ] }, "execution_count": 124, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(una_tupla)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**LA DIFERENCIA** es que las **listas son mutables**. Es decir, es un objeto que puede cambiar: extenderse con otra secuencia, agregar o quitar elementos, cambiar un elemento o una porción por otra, reordenarse *in place*, etc. " ] }, { "cell_type": "code", "execution_count": 119, "metadata": {}, "outputs": [], "source": [ "mezcolanza.extend([1,2])\n", "mezcol" ] }, { "cell_type": "code", "execution_count": 120, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[1.2,\n", " 'Jairo',\n", " 12000000.0,\n", " \"O'Higgings\",\n", " 'Nadia',\n", " 'otro elemento',\n", " 'otro elemento',\n", " 'otro elemento',\n", " [1, 2],\n", " 1,\n", " 2]" ] }, "execution_count": 120, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mezcolanza" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "una_tupla.append('a')" ] }, { "cell_type": "code", "execution_count": 121, "metadata": {}, "outputs": [], "source": [ "mezcolanza[0] = \"otra cosa\"" ] }, { "cell_type": "code", "execution_count": 122, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['otra cosa',\n", " 'Jairo',\n", " 12000000.0,\n", " \"O'Higgings\",\n", " 'Nadia',\n", " 'otro elemento',\n", " 'otro elemento',\n", " 'otro elemento',\n", " [1, 2],\n", " 1,\n", " 2]" ] }, "execution_count": 122, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mezcolanza" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Incluso se pueden hacer asignaciones de secuencias sobres \"slices\"" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "mezcolanza[0:2] = ['A', 'B'] # notar que no hace falta que el valor tenga el mismo tamaño que el slice\n", "mezcolanza" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Como las tuplas son inmutables (como las cadenas), no podemos hacer asignaciones" ] }, { "cell_type": "code", "execution_count": 123, "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "'tuple' object does not support item assignment", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0muna_tupla\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;34m\"osooo\"\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;31mTypeError\u001b[0m: 'tuple' object does not support item assignment" ] } ], "source": [ "una_tupla [-1] = \"osooo\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Las **tuplas** son mucho más eficientes (y seguras) si sólo vamos a **leer** elementos. Pero muchas operaciones son comunes. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "l = [1, 3, 4, 1]\n", "t = (1, 3, 1, 4)\n", "print(l.count(3))\n", "print(t.count(3))\n", "l.append('8')\n", "l" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### packing/unpacking\n", "\n", "Como toda secuencia, las listas y tuplas se pueden *desempacar*" ] }, { "cell_type": "code", "execution_count": 125, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Juan se sacó un 10\n" ] } ], "source": [ "nombre, nota = (\"Juan\", 10)\n", "print(\"{} se sacó un {}\".format(nombre, nota)) # igual a \"{0} se sacó un {1}\"" ] }, { "cell_type": "code", "execution_count": 126, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2.0\n" ] } ], "source": [ "a, b = 1, 2.0\n", "a, b = b, a\n", "print (a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Python 3 permite un desempacado extendido" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(1, 2, [3, 4, 5])" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a, b, *c = (1, 2, 3, 4, 5) # c captura 3 elementos\n", "a, b, c" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1, [2, 3, 4], 5)\n" ] } ], "source": [ "a, *b, c = [1, 2, 3, 4, 5] # b captura 3 elementos del medio\n", "print((a, b, c))" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(1, [2, 3, 4], 5)" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# antes era más complicado\n", "\n", "v = [1, 2, 3, 4, 5]\n", "a, b, c = (v[0], v[1:-1], v[-1])\n", "a, b, c" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Como con los números, se pueden convertir las secuencias de un tipo de dato a otro. Por ejemplo:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "a = (1, 3, 4)\n", "list(('A', 1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Una función *builtin* muy útil es `range`" ] }, { "cell_type": "code", "execution_count": 135, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[3, 5, 7, 9]" ] }, "execution_count": 135, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(range(3, 10, 2))" ] }, { "cell_type": "code", "execution_count": 138, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "range(0, 6)" ] }, "execution_count": 138, "metadata": {}, "output_type": "execute_result" } ], "source": [ "range(6)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "range(-10, 10)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "range(0, 25, 5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "También hay una función estándar que da la sumatoria" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on built-in function sum in module builtins:\n", "\n", "sum(iterable, start=0, /)\n", " Return the sum of a 'start' value (default: 0) plus an iterable of numbers\n", " \n", " When the iterable is empty, return the start value.\n", " This function is intended specifically for use with numeric values and may\n", " reject non-numeric types.\n", "\n" ] } ], "source": [ "help(sum)" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "21.36" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum([1, 5.36, 5, 10])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "En toda secuencia tenemos el método index, que devuelve la posición en la que se encuentra un elemento" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = [1, 'hola', []]\n", "a.index('hola')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "y como las listas son *mutables* también se pueden reordenar *in place* (no se devuelve un valor, se cambia internamente el objeto)" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [], "source": [ "a = [1, 2, 3]\n", "a.reverse()" ] }, { "cell_type": "code", "execution_count": 147, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[3, 2, 1]" ] }, "execution_count": 147, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a" ] }, { "cell_type": "code", "execution_count": 149, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[1, 2, 3]" ] }, "execution_count": 149, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(reversed(a))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La forma alternativa es usando una función, que **devuelve** un valor" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "b = list(reversed(a))\n", "b" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
*Nota*: se fuerza la conversión de tipo con `list()` porque `reversed`, al igual que range, no devuelve estrictamente una lista. Ya veremos más sobre esto.
\n", "\n", "Una función útil es `zip()`, que agrupa elementos de distintas secuencias" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[('Juan', 'cerveza', 'arg'),\n", " ('Martín', 'boca juniors', 'arg'),\n", " ('María', 'lechuga', 'uru')]" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nombres = ['Juan', 'Martín', 'María']\n", "pasiones = ['cerveza', 'boca juniors', 'lechuga']\n", "nacionalidad = ('arg', 'arg', 'uru')\n", "list(zip(nombres, pasiones, nacionalidad))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Ejercicios\n", "\n", "1. Resuelva la siguiente operación $$\\frac{(\\sum_{k=0}^{100}k)^3}{2}$$\n", "\n", "\n", "\n", "2. Dada cualquier secuencia, devolver una tupla con sus elementos concatenados en a la misma secuencia en orden inverso. Por ejemplo para `\"ABCD\"` devuelve `('A', 'B', 'C', 'D', 'D', 'C', 'B', 'A')`\n", "\n", "\n", "\n", "3. Generar dos listas a partir de la funcion `range` de 10 elementos, la primera con los primeros multiplos de 2 a partir de 0 y la segunda los primeros multiplos de 3 a partir de 30 (inclusive). Devolver como una lista de tuplas\n", "`[(0, 30), (2, 33),... ]`\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Estructuras de control de flujos\n", "\n", "#### if/elif/else\n", "\n", "En todo lenguaje necesitamos controlar el flujo de una ejecución segun una condición Verdadero/Falso (booleana). *Si (condicion) es verdadero hacé (bloque A); Sino hacé (Bloque B)*. En pseudo código:\n", "\n", " Si (condicion):\n", " bloque A\n", " sino:\n", " bloque B\n", "\n", "y en Python es muy parecido! \n" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "edad: 12\n", "Hola pibe\n" ] } ], "source": [ "edad = int(input('edad: '))\n", "if edad < 18:\n", " \n", " print(\"Hola pibe\") \n", "else:\n", " print(\"Bienvenido señor\")\n" ] }, { "cell_type": "code", "execution_count": 159, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 159, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Los operadores lógicos en Python son muy explicitos. \n", " \n", " A == B \n", " A > B \n", " A < B\n", " A >= B\n", " A <= B\n", " A != B\n", " A in B\n", "\n", "* A todos los podemos combinar con `not`, que niega la condición\n", "* Podemos combinar condiciones con `AND` y `OR`, las funciones `all` y `any` y paréntesis" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Podemos tener multiples condiciones en una estructura. Se ejecutará el primer bloque cuya condición sea verdadera, o en su defecto el bloque `else`. Esto es equivalente a la sentencia `switch` o `select case` de otros lenguajes " ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Y eso es todo amigos!\n" ] } ], "source": [ "if edad < 12:\n", " print(\"Feliz dia del niño\")\n", "elif 13 < edad < 18:\n", " print(\"Qué problema los granitos, no?\")\n", "elif edad in range(19, 90):\n", " print(\"En mis épocas...\") \n", "else:\n", " print(\"Y eso es todo amigos!\")" ] }, { "cell_type": "code", "execution_count": 162, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 162, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all([True, False, True])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "En un `if`, la conversión a tipo *boolean* es implícita. El tipo `None` (vacío), el `0`, una secuencia (lista, tupla, string) (o conjunto o diccionario, que ya veremos) vacía siempre evalua a ``False``. Cualquier otro objeto evalua a ``True``." ] }, { "cell_type": "code", "execution_count": 163, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Dio cero\n" ] } ], "source": [ "a = 5 - 5\n", "\n", "if a: \n", " a = \"No es cero\"\n", "else: \n", " a = \"Dio cero\"\n", "print(a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para hacer asignaciones condicionales se puede usar la *estructura ternaria* del `if`: `A si (condicion) sino B`" ] }, { "cell_type": "code", "execution_count": 165, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "No es cero\n" ] } ], "source": [ "b = 5 - 6\n", "a = \"No es cero\" if b else \"dio cero\"\n", "print(a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Ejercicio\n", "\n", "dados **valores** numéricos para a, b y c, implementar la formula d $x = \\frac{-b \\pm \\sqrt {b^2-4ac}}{2a}$\n", "\n", "donde a, b y c son lo coeficientes de la ecuación $ax^2 + bx + c = 0, \\quad \\mbox{para}\\;a\\neq 0$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### For\n", "\n", "Otro control es **iterar** sobre una secuencia (o *\"iterador\"*). Obtener cada elemento para hacer algo. En Python se logra con la sentencia `for`\n" ] }, { "cell_type": "code", "execution_count": 166, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "6.6" ] }, "execution_count": 166, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sumatoria = 0\n", "for elemento in [1, 2, 3.6]:\n", " sumatoria = sumatoria + elemento\n", "sumatoria" ] }, { "cell_type": "code", "execution_count": 167, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[(0, 'a'), (1, 'b'), (2, 'c')]" ] }, "execution_count": 167, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(enumerate(['a', 'b', 'c']))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notar que no iteramos sobre el índice de cada elemento, sino sobre los elementos mismos. ¡Basta de `i`, `j` y esas variables innecesarias! . Si por alguna razon son necesarias, tenemos la función `enumerate`\n" ] }, { "cell_type": "code", "execution_count": 168, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "El valor de la posicion 0 es 4\n", "El valor de la posicion 1 es 3\n", "El valor de la posicion 2 es 19\n" ] } ], "source": [ "for (posicion, valor) in enumerate([4, 3, 19]):\n", " print(\"El valor de la posicion %s es %d\" % (posicion, valor))" ] }, { "cell_type": "code", "execution_count": 169, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n", "1\n", "2\n", "3\n", "4\n", "5\n", "6\n", "7\n", "8\n", "9\n" ] } ], "source": [ "for i in range(10):\n", " print(i)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "El bloque `for` se corre hasta el final del *iterador* o hasta encontrar un sentencia `break`" ] }, { "cell_type": "code", "execution_count": 170, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(5050, 101)" ] }, "execution_count": 170, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sumatoria = 0\n", "for elemento in range(1000):\n", " if elemento > 100:\n", " break\n", " sumatoria = sumatoria + elemento\n", "sumatoria, elemento" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "También podemos usar `continue` para omitir la ejecución de \"una iteración\"" ] }, { "cell_type": "code", "execution_count": 171, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n", "2\n", "4\n", "6\n", "8\n", "10\n", "12\n", "14\n", "16\n", "18\n" ] }, { "data": { "text/plain": [ "90" ] }, "execution_count": 171, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sumatoria = 0\n", "for elemento in range(20):\n", " if elemento % 2:\n", " continue\n", " print(elemento)\n", " sumatoria = sumatoria + elemento\n", "sumatoria" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Muchas veces queremos iterar una lista para obtener otra, con sus elementos modificados. Por ejemplo, obtener una lista con los cuadrados de los primeros 10 enteros." ] }, { "cell_type": "code", "execution_count": 172, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[9, 4, 1, 0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196]\n" ] } ], "source": [ "cuadrados = []\n", "for i in range(-3,15,1):\n", " cuadrados.append(i**2)\n", "print (cuadrados)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Una forma compacta y elegante (¡pythónica!) de escribir esta estructura muy frecuente son las **listas por comprehensión**:" ] }, { "cell_type": "code", "execution_count": 173, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[0, 2, 4, 6, 8]" ] }, "execution_count": 173, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[n*2 for n in range(5)]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Se lee: \"Obtener el cuadrado de cada elemento i de la secuencia (rango 0 a 9)\". \n", "\n", "Pero además podemos filtrar: usar sólo los elementos que cumplen una condición. " ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[1, 1, 9, 25]" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[i**2 for i in range(-2, 6) if i % 2 == 1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "#### Ejercicios\n", "\n", "- 1) Obtener la sumatoria de los cubos de los numeros impares menores a 100. $$\\sum_{a=0}^{100}a^3 \\mid a\\ impar $$\n", "\n", "\n", "\n", "- 2) Obtener la productoria de los primeros 12 digitos decimales de PI\n", "\n", "\n", "\n", "- 3) Encuentre el mínimo de $$f(x) = (x-4)^2-3 \\mid x \\in [-100, 100)$$ \n", "- 4) Encuentre el promedio de los números reales de la cadena `\"3,4 1,2 -6 0 9,7\"`\n", "\n", "" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Expresiones generadores\n", "\n", "Al crear una lista por comprehensión, se calculan todos los valores y se agregan uno a uno a la lista, que una vez completa se \"devuelve\" como un objeto nuevo. \n", "\n", "Cuando no necesitamos todos los valores *al mismo tiempo*, porque por ejemplo podemos consumirlos de 1 en 1, es mejor crear *generadores*, que son tipos de datos **iterables pero no indizables** (es el mismo tipo de objeto que devuelve `reversed`, que ya vimos)." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sum(a**2 for a in range(10))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### While\n", "\n", "Otro tipo de sentencia de control es *while*: iterar mientras se cumpla una condición" ] }, { "cell_type": "code", "execution_count": 180, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ingrese un numero3\n", "3\n", "4\n", "5\n", "6\n", "7\n", "8\n", "9\n" ] } ], "source": [ "a = int(input('ingrese un numero'))\n", "while a < 10:\n", " print (a)\n", " a += 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Como en la iteración con `for` se puede utilizar la sentencia `break` para \"romper\" el bucle. Entonces puede modificarse para que la condición esté en una posicion arbitraria" ] }, { "cell_type": "code", "execution_count": 181, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2 elefantes se balanceaban sobre la tela de una araña\n", "Desea invitar a otro elefante?si\n", "3 elefantes se balanceaban sobre la tela de una araña\n", "Desea invitar a otro elefante?si\n", "4 elefantes se balanceaban sobre la tela de una araña\n", "Desea invitar a otro elefante?s\n", "5 elefantes se balanceaban sobre la tela de una araña\n", "Desea invitar a otro elefante?no\n" ] } ], "source": [ "n = 1\n", "while True:\n", " n = n + 1\n", " print('{} elefantes se balanceaban sobre la tela de una araña'.format(n))\n", " continuar = input('Desea invitar a otro elefante?')\n", " if continuar == 'no':\n", " break" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Diccionarios\n", "\n", "La diccionarios son otro tipo de estructuras de alto nivel que ya vienen incorporados. A diferencia de las secuencias, los valores **no están en una posición** sino bajo **una clave**: son asociaciones `clave:valor`\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "camisetas = {'Orión': 1, 'Carlitos': 10, 'Gago': 5, 'Gaitán': 'Jugador nº 12'} " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Accedemos al valor a traves de un clave" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "camisetas['Perez'] = 8" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "camisetas" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Las claves pueden ser cualquier objeto inmutable (cadenas, numeros, tuplas) y los valores pueden ser cualquier tipo de objeto. Las claves no se pueden repetir pero los valores sí.\n", "\n", "**Importante**: los diccionarios **no tienen un orden definido**. Si por alguna razón necesitamos un orden, debemos obtener las claves, ordenarlas e iterar por esa secuencia de claves ordenadas.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sorted(camisetas.keys(), reverse=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Los diccionarios **son mutables**. Es decir, podemos cambiar el valor de una clave, agregar o quitar. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "list(camisetas.items())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hay muchos *métodos* útiles" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "for jugador, camiseta in camisetas.items():\n", " if jugador == 'Gaitán':\n", " continue \n", " print(\"%s lleva la %d\" % (jugador, camiseta))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Se puede crear un diccionario a partir de tuplas `(clave, valor)` a traves de la propia clase `dict()`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "dict([('Yo', 'gaitan@gmail.com'), ('Melisa', 'mgomez@phasety.com'), ('Cismondi', 'cismondi@phasety.com')])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Que es muy útil usar con la función `zip()` que ya vimos" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "nombres = (\"Martin\", \"Mariano\")\n", "emails = (\"tin@email.com\", \"nano@email.com\")\n", "\n", "dict(zip(nombres, emails))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Ejercicio\n", "\n", "#. Dados la lista de precios por kilo:\n", "\n", " precios = {\n", " \"banana\": 12,\n", " \"manzana\": 8.5,\n", " \"naranja\": 6,\n", " \"pera\": 18\n", " }\n", "\n", " Y la siguiente lista de compras \n", "\n", " compras = {\n", " \"banana\": 1,\n", " \"naranja\": 3,\n", " \"pera\": 0,\n", " \"manzana\": 1\n", " }\n", "\n", " Calcule el costo total de la compra. \n", "\n", "\n", "#. Ejecute `import this` y luego analice el código del módulo con `this??` . ¿comprende el algoritmo? Cree el algoritmo inverso, es decir, codificador de [rot13](https://es.wikipedia.org/wiki/ROT13)\n" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The Zen of Python, by Tim Peters\n", "\n", "Beautiful is better than ugly.\n", "Explicit is better than implicit.\n", "Simple is better than complex.\n", "Complex is better than complicated.\n", "Flat is better than nested.\n", "Sparse is better than dense.\n", "Readability counts.\n", "Special cases aren't special enough to break the rules.\n", "Although practicality beats purity.\n", "Errors should never pass silently.\n", "Unless explicitly silenced.\n", "In the face of ambiguity, refuse the temptation to guess.\n", "There should be one-- and preferably only one --obvious way to do it.\n", "Although that way may not be obvious at first unless you're Dutch.\n", "Now is better than never.\n", "Although never is often better than *right* now.\n", "If the implementation is hard to explain, it's a bad idea.\n", "If the implementation is easy to explain, it may be a good idea.\n", "Namespaces are one honking great idea -- let's do more of those!\n" ] } ], "source": [ "import this" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [], "source": [ "this??" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Conjuntos\n", "\n", "Los conjuntos (`set()` o `{}`) son grupos de elementos únicos. Al igual que los diccionarios, no están necesariamente ordenados" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "mamiferos = set(['perro', 'gato', 'leon'])\n", "domesticos = {'perro', 'gato', 'gallina'}\n", "aves = {'gallina', 'halcón', 'colibrí'}" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "mamiferos" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Los conjuntos tienen métodos para cada una de las operaciones del [álgebra de conjuntos](https://es.wikipedia.org/wiki/%C3%81lgebra_de_conjuntos)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "mamiferos.intersection(domesticos) # mamiferos & domesticos" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "mamiferos.union(domesticos) # mamiferos | domesticos" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "aves.difference(domesticos) # mamiferos - domesticos" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "mamiferos.symmetric_difference(domesticos) # mamiferos ^ domesticos" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Se puede comparar pertenencia de elementos y subconjuntos" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "'gato' in mamiferos" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "domesticos.issubset(mamiferos) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Además, tienen métodos para agregar o extraer elementos" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "mamiferos.add('elefante')\n", "mamiferos" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Por supuesto, se puede crear un conjunto a partir de cualquier iterador" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "set([1, 2, 3, 2, 1, 3])" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "Existe también una **versión inmutable** de los diccionarios, llamado `frozenset`" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "frozenset" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "frozenset" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Ejercicio\n", "\n", "La función `dir()` devuelve una lista con los nombre de todos los métodos y atributos de un objeto. Obtener una lista ordenada de los métodos en común entre `list`, `tuple` y `str` y los que son exclusivos para cada uno\n", "\n", "" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.1" } }, "nbformat": 4, "nbformat_minor": 1 }