{ "cells": [ { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "# Bevezetés a Python nyelvbe\n", "\n", "

\n", "Az előadás nagyvonalakban a hivatalos Python tutorial-t követi.\n", "

\n", "

\n", "A Python egy olyan általános körben használható magas szintű programozási nyelv, aminek az egyik alapelve az olvasható kód írása egy nagyon tiszta szintaxis használatával. 1991-ben alkotta meg Guido Van Rossum.\n", "

\n", "

\n", "Nevét a Monthy Python ihlette, nem az állat.\n", "

" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "## Miért Python?\n", "### Népszerűsége\n", "\n", "* http://blog.codeeval.com/codeevalblog/2016/2/2/most-popular-coding-languages-of-2016\n", "* http://www.tiobe.com/tiobe-index/\n", "* http://spectrum.ieee.org/static/interactive-the-top-programming-languages-2016\n", "* http://pypl.github.io/PYPL.html\n", "\n", "### Előnyei\n", "\n", "* Könnyen tanulható, interaktív, kezdőknek ideális (ld. Raspberry Pi)\n", "* A kód könnyen olvasható, bonyolult feladatokra egyszerű parancsok\n", "* Több rendszeren, platformon fut\n", "* Objektumorientált\n", "* Web-programozásra alkalmas (Google, Yahoo, IBM, NASA, Disney, Dropbox,...)\n", "* Gyors fejlesztés, rövid kód, nagy feladatokra is alkalmas\n", "* Források nagy száma\n", "* Az adattudományban (data science) erős\n", "* Nyílt forráskódú, szabadon hozzáférhető, használható, üzleti célra is\n", "\n", "### Hátrányai\n", "\n", "* Lassú\n", "* Mobil-programozásra nem a legjobb\n", "* Nagy grafikai igényű (3D) programozásra nem alkalmas\n" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "# Futtatás\n", "Több módon is futtathatunk python kódot.\n", "\n", "### Parancssorból\n", "Parancssorból futtatható, pl interaktívan:\n", "\n", "$ python\n", "\n", "Ekkor interaktív pythont kapunk amibe közvetlen írhatunk parancsokat.\n", "
\n", "
\n", "De lefuttathatunk parancssorból egy létező python file-t is (.py kiterjesztésű file):\n", "\n", "$ python hello.py\n", "\n", "Ekkor lefut a program és ha van szöveges kimenete a programnak az látható lesz a parancssorban.\n", "\n", "### Jupyter (IPython)\n", "A Jupyter egy böngészőn keresztül használható fejlesztői környezet pythonhoz, mely a tavalyi Sage notebookhoz hasonlít. Ez az amit az előadás írásához használunk és gyakorlaton is fogjuk használni.\n", "
\n", "
\n", "Indítani egy IPython szervert a következő paranccsal tudunk a leibniz-en:\n", "\n", "$ ipython notebook --port=##### --no-browser\n", "\n", "Ahol a ##### helyére egy 16000 és 20000 közti számot írjunk. Ekkor böngészőben a localhost:##### oldalon érhetjük el az IPython notebookunkat.\n", "\n", "### Spyder\n", "A Spyder is egy fejlesztői környezet pythonhoz, a leibniz-en fent van és kényelmesen telepíthető bármilyen oprendszerre: Telepítés\n", "
\n", "
\n", "Windowsra ajánljuk a WinPython telepítését (ezen belül a 2.7-es verziót), mely kényelmesen tartalmazza a Jupytert és Spydert is." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "# Objektumok\n", "Az objektumok a nyelv alapelemei, ezekkel fogunk dolgozni. Minden objektumnak van típusa. A következő típusokkal kezdjük:\n", "* int (egész): 2354, -12\n", "* float (lebegőpontos szám): 1.0, -23.567, 2.3E4\n", "* bool (logikai): True, False\n", "* string (karakterlánc): \"kiskutya\", \"Volt egyszer egy kiskutya\"" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "# Műveletek, kifejezések\n", "Az objektumok műveletekkel összekapcsolva kifejezéseket adnak, melyek kiértékelve valamilyen típusú objektumot adnak. Az egész és a lebegőpontos műveletek:\n", "* a + b összeadás\n", "* a - b kivonás\n", "* a * b szorzás\n", "* a / b osztás (Python 2.7-ben int/int = int, Python 3-tól float)\n", "* a // b egész osztás\n", "* a % b maradékképzés\n", "* a ** b hatványozás (NEM a ^ b, mint a sage-ben!)\n", "* a == b, a < b, a > b, a <= b, a >= b, a != b, a <> b\n", "\n", "Logikai műveletek bool-típusúak közt:\n", "* a and b, „és”\n", "* a or b, „megengedő vagy” \n", "* not a, „nem”\n", "\n", "Stringeken alapvető műveletek:\n", "* a + b, konkatenálás\n", "* a in b, tartalmazás vizsgálat (eredménye bool)\n", "\n", "### Például" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "5 + 11" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "2 ** 251" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "a = 54\n", "b = a - 50\n", "a * b" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "54 > 12" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "b < 0" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "54 > 12 or b < 0" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "s = \"macska\"\n", "\"ma\" in s" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "s = \"kis\" + s\n", "s" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "# Változónevek\n", "* a név betűvel vagy aláhúzással kezdődhet: [_a-zA-Z]\n", "* a név további karakterei az előbbieken felül számok is lehetnek: [_a-zA-Z0-9]\n", "* elméletileg bármilyen hosszú lehet a név\n", "* név nem lehet foglalt szó\n", "* nagybetű-kisbetű érzékeny, tehát a val1 név nem azonos a Val1 névvel" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "# Karakterláncok\n", "Három módon adhatunk meg karakterláncokat:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "s = \"kiskutya\"" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "s = 'kiskutya'" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "s = \"\"\"Volt egyszer egy kiskutya.\n", "Elment a vásárba.\"\"\"" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "s" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Itt a vezérlő karaketerek (\\n a sorvége jel) és az ékezetes karakterek UTF-8 kódja (á betű kódja c3a1, \\x után a bájt hexa kódja) jelenik meg. A print utasítás olvashatóan írja ki: " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print s" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Az első kettőnek kényelmi szerepe van, mert amelyik idézőjelet nem használjuk a string jelzésére azt használhatjuk a stringben. Például:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "print \"Egy 'macskaköröm' \" + 'ketto \"macskaköröm\"'" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "'Van ilyen: \\' meg ilyen: \"'" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print 'Van ilyen: \\' meg ilyen: \"'" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "A harmadikban használhatunk sortörést és ez a stringben is sortörésként fog megjelenni. Míg a többi jelöléssel sortörést a \\n kifejezéssel tudunk tenni.\n", "
\n", "
\n", "További speciális karakterek stringekben: \\\\\\\\ (\\\\), \\' ('), \\\" (\"), \\n (új sor), \\t (tab)\n" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "# Kiírás\n", "Itt a Jupyterben az egyes cellák eredménye az utolsó érték ami kiértékelődött, de például, ha parancssorban futtatunk egy korábban megírt python file-t, akkor még ez sem lesz kiírva. Ha valamit ki akarunk írni azt konkrétan meg kell tennünk:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "5 + 8\n", "5 + 7" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "a = 5\n", "print a\n", "a = 15\n", "print a * 2\n", "a" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "string = \"kiskutya\"\n", "\"Volt egyszer egy \" + string" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "print \"Volt egyszer egy %s, elment a vásárba.\" % string" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Ha egy stringben %s szerepel akkor utána % jellel behelyettesíthetünk erre a pozícióra egy másik stringet. Több behelyettesítés esetén:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "print \"Volt %s egy %s, elment a %s.\" % (\"egyszer\", \"kiskutya\", \"vásárba\")" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Nem csak stringeket lehet behelyettesíteni, egész vagy lebegőpontos számokat is lehet:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "print \"\"\"A %d egy decimális egész (integer), \n", "a %f pedig egy lebegőpontos (floating point) szám.\"\"\" % (23, 1.0/3)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "# Beolvasás\n", "Ha már kiírni tudunk dolgokat, akkor tanuljunk meg beolvasni is:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "raw_input()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "a = 5\n", "nev = raw_input(\"Mi a neved? \")\n", "print \"Szia %s!\" % nev" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "input() > 10" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "input() ** 10" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true, "deletable": true, "editable": true }, "source": [ "A különbség a raw_input és input között ez:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "a = raw_input()\n", "a + \" macska\"" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "b = input()\n", "b + \" macska\"" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Azaz a raw_input mindig stringként olvassa be bármit is adunk meg, míg az input megpróbálja értelmezni azt amit beírtunk:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "type(input())" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "# Elágazás" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "x = input()\n", "if x < 0:\n", " print \"ez negatív\"\n", "elif x == 0:\n", " print \"ez nulla\"\n", "elif x == 1:\n", " print \"ez egy\"\n", "else:\n", " print \"ez sok\"" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true, "slideshow": { "slide_type": "-" } }, "source": [ "Az elif-ek száma tetszőleges, de se az elif se az else megadása nem kötelező.\n", "
\n", "
\n", "Ha az eredeti feltétel teljesül (igazra értékelődik), akkor az ő blokkjába eső (alatta behúzott) kód fut le, ha nem teljesül akkor az első olyan elif blokk fut le aminek a feltétele igaz, ha ezek se igazak akkor az else ág blokkja fut le, feltéve hogy van.\n", "
\n", "
\n", "A behúzás (indentálás) legelterjedtebb mértéke a négy szóköz." ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "# While ciklus" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "n = 1000\n", "a = 1\n", "while a ** 3 < n:\n", " print a ** 3, # a vessző miatt egy sorba kerülnek\n", " a = a + 1\n", "print \"vége\"" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "A while ciklus blokkja lefut újra és újra, amíg teljesül a ciklus feltétele.\n", "
\n", "
\n", "Így tehát a fenti kód addig növeli az a változót, amíg annak köbe legalább 1000 nem lesz.\n", "
\n", "
\n", "Ciklusokat és elágazásokat egymásba ágyazhatunk:" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "A híres Collatz- vagy $3x+1$-probléma:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "a = input()\n", "while a != 1:\n", " print a, # a vessző miatt egy sorba kerülnek\n", " if a % 2 == 0:\n", " a = a / 2\n", " else:\n", " a = a * 3 + 1" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Ezt megtehetjük akárhány mélységig (ciklusok is ágyazhatók egymásba):" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "a = input()\n", "if type(a) == int:\n", " while a != 1:\n", " print a, # a vessző miatt egy sorba kerülnek\n", " if a % 2 == 0:\n", " a = a / 2\n", " else:\n", " a = a * 3 + 1\n", "else:\n", " print \"Egesz szamot adjunk meg\"" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "A fenti kód már azt is teszteli, hogy a felhasználó egész számot adott-e meg. Védjük ki azt is, ha negatív számot adott meg:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "a = input()\n", "if type(a) == int:\n", " if a < 0:\n", " a = -1 * a\n", " while a != 1:\n", " print a, # a vessző miatt egy sorba kerülnek\n", " if a % 2 == 0:\n", " a = a / 2\n", " else:\n", " a = a * 3 + 1\n", "else:\n", " print \"Egesz szamot adjunk meg\"" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Végül már csak a 0 alesetet kell kizárni, hisz 0-ra se működik:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "a = input()\n", "if type(a) == int and a != 0:\n", " if a < 0:\n", " a = -1 * a\n", " while a != 1:\n", " print a, # a vessző miatt egy sorba kerülnek\n", " if a % 2 == 0:\n", " a = a / 2\n", " else:\n", " a = a * 3 + 1\n", "else:\n", " print \"Nullatol kulonbozo egesz szamot adjunk meg\"" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "### Break\n", "Ciklusokban használható a break utasítás, hogy a feltételt figyelmen kívül hagyva azonnal kiugorjunk a ciklusból:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [], "source": [ "n = input(\"Adj meg egy negyzetszamot 10000 alatt! \")\n", "a = 0\n", "while a ** 2 < 10000:\n", " if a ** 2 == n:\n", " break\n", " a = a + 1\n", "if a ** 2 < 10000:\n", " print \"A négyzetszám gyöke: %d\" % a\n", "else:\n", " print \"Hazudtál! :(\"" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "Ha több ciklus van egymásba ágyazva, akkor a legbelső ciklusból ugrik ki, melynek blokkjában van." ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.12" } }, "nbformat": 4, "nbformat_minor": 0 }