{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 7. előadás\n",
    "*Tartalom:* Függvények, pár további hasznos library (import from ... import ... as szintaktika, time, random, math, regex (regular expressions), os, sys)\n",
    "\n",
    "### Függvények\n",
    "\n",
    "Találkozhattunk már függvényekkel más programnyelvek kapcsán. \n",
    "\n",
    "De valójában mik is azok a függvények? A függvények:\n",
    "\n",
    "    • újrahasználható kódok\n",
    "    • valamilyen specifikus feladatot végeznek el\n",
    "    • flexibilisek\n",
    "    • egyszer definiálandók\n",
    "    • nem csinálnak semmit, amíg nem hívjuk meg őket\n",
    "\n",
    "Hogyan definiálunk egy függvényt?\n",
    "\n",
    "\n",
    "``` python\n",
    "def fuggveny_neve(parameter1, parameter2, stb):\n",
    "    # ide írjuk a kódot\n",
    "    return visszatérési_érték_lista1, v_2, v_3 # opcionális! \n",
    "```\n",
    "\n",
    "Ezt hívni a következőképp lehet:\n",
    "\n",
    "``` python\n",
    "a, b, c = fuggveny_neve(parameter1, parameter2 …)\n",
    "# vagy, ha nem vagyunk kiváncsiak az összes visszatérési értékre\n",
    "a, _, _ = fuggveny_neve(parameter1, parameter2 …)\n",
    "```\n",
    "\n",
    "\n",
    "Kezdjük egy egyszerű függvénnyel! Írjunk egy olyan függvényt, amely a `\"Helló, <név>\"` sztringet adja vissza:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Hello, Tamás!"
     ]
    }
   ],
   "source": [
    "def udvozlet(nev):\n",
    "    print(\"Hello,\", nev, end=\"!\")\n",
    "\n",
    "udvozlet(\"Tamás\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Egyes függvényeknek van paraméterük/argumentumuk, másoknak azonban nincs. Egyes esetekben a paraméteres függvények bizonyulhatnak megfelelőnek, pont a paraméterek nyújtotta flexibilitás miatt, más esetekben pedig pont a paraméter nélküli függvények használata szükséges.\n",
    "Egyes függvényeknek sok visszatérési érékük van, másoknál elhagyható a `return`. \n",
    "\n",
    "Írjunk egy olyan `adat_generalas` függvényt, amely 3 paramétert fogad: a generálandó listák darabszámát, lépésközét és opcionálisan egy eltolás értéket, amit hozzáadunk a generált adatokhoz. Amenyyiben nem adjuk meg a 3. paramétert, az eltolást, úgy az alapértelmezett érték legyen `0`. A 3 visszatérsi érték az `X` adat, valamint a 2 `Y` adat (koszinusz és színusz)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import math\n",
    "\n",
    "def adat_generalas(darab, lepes, eltolas = 0):\n",
    "    x = [x * lepes for x in range(0, darab)]\n",
    "    y_sin = [math.sin(x * lepes) + eltolas for x in range(0, darab)]\n",
    "    y_cos = [math.cos(x * lepes) + eltolas for x in range(0, darab)]\n",
    "    return x, y_sin, y_cos"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Próbáljuk ki a fenti függvényt és jelezzük ki `plot`-ként."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nziodAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "x1, y1, y2 = adat_generalas(80, 0.1)\n",
    "x2, y3, _  = adat_generalas(400, 0.02, 0.2)\n",
    "\n",
    "plt.plot(x1, y1, \"*\")\n",
    "plt.plot(x1, y2, \"*\")\n",
    "plt.plot(x2, y3, \"*\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A paraméterekkel rendelkező függvényeknél nagyon fontos a paraméterek sorrendje. Nem mindegy, hogy függvényhíváskor milyen sorrendben adjuk meg a paramétereket. Pl.:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def upload_events(events_file, location):\n",
    "    # … (feltehetően a kód jön ide) …\n",
    "    return\n",
    "\n",
    "# Helytelen hívás!!!\n",
    "upload_events(\"New York\", \"events.csv\")\n",
    "# Helyes hívás!!!\n",
    "upload_events(\"events.csv\", \"New York\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ha azonban nem kedveljük ezt a szabályt, akár át is hághatjuk úgy, hogy megmondjuk a függvénynek, melyik érték, melyik változóhoz tartozik!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Így is helyes!!!\n",
    "upload_events(location=\"New York\", events_file=\"events.csv\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Fontos még megemlíteni a függvények visszatérési értékét. A függvények egy vagy több értéket adhatnak vissza a **return** parancsszó meghívásával. A nem meghatározott visszatérési érték az ún. **None**. Ezen kívül visszatérési érték lehet *szám, karakter, sztring, lista, könyvtár, TRUE, FALSE,* vagy bármilyen más típus."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "30"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Egy érték vissza adása\n",
    "def product(x, y):\n",
    "    return x*y\n",
    "\n",
    "product(5,6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Több érték vissza adása\n",
    "def get_attendees(filename):\n",
    "    # Ide jön a kód, amely vissza adja a „teacher”, „assistants” és „students” értékeket.\n",
    "    #teacher, assistants, students = get_attendees(\"file.csv\")\n",
    "    return"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## További hasznos könyvtárak:\n",
    "\n",
    "#### Az *import* szintakszis\n",
    "\n",
    "Ahhoz, hogy beépített függvényeket használjunk a kódban, szükség van azok elérésére. Ezek általában modulokban, vagy csomagokban találhatók. Ezeket az **import** kulcsszóval tudjuk beépíteni. Amikor a Python importálja pl. a *hello* nevű modult, akkor az interpreter először végig listázza a beépített modulokat, és ha nem találja ezek között, akkor elkezdi keresni a *hello.py* nevű fájlt azokban a mappákban, amelyeknek listáját a **sys.path** változótól kapja meg. Az importálás alapvető szintaktikája az **import** kulcsszóból és a beillesztendő modul nevéből áll.\n",
    "\n",
    "**import hello**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Mikor importálunk egy modult, elérhetővé tesszük azt a kódunkban, mint egy különálló névteret (*namespace*). Ez azt jelenti, hogy amikor meghívunk egy függvényt, pont (.) jellel kell összekapcsolnunk a modulnévvel így: [modul].[függvény]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import random\n",
    "\n",
    "random.randint(0,5) #meghívja a randint függvényt, ami egy random egész számot ad vissza"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Nézzünk erre egy példát, amely 10 véletlenszerű egész számot ír ki!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5\n",
      "16\n",
      "20\n",
      "8\n",
      "12\n",
      "14\n",
      "15\n",
      "23\n",
      "17\n",
      "4\n"
     ]
    }
   ],
   "source": [
    "import random\n",
    "\n",
    "for i in range(10):\n",
    "    print(random.randint(1, 25))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### A *from … import …*  szintakszis\n",
    "\n",
    "Általában akkor használjuk, mikor hivatkozni akarunk egy konkrét függvényre a modulból, így elkerüljük a ponttal való referálást. Nézzük az előző példát ezzel a megoldással:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "7\n",
      "19\n",
      "3\n",
      "14\n",
      "18\n",
      "3\n",
      "8\n",
      "7\n",
      "16\n",
      "5\n"
     ]
    }
   ],
   "source": [
    "from random import randint\n",
    "\n",
    "for i in range(10):\n",
    "    print(randint(1, 25))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Aliasok használata, az *import … as …*  szintakszis\n",
    "\n",
    "Pythonban lehetőség van a modulok és azok függvényeinek átnevezésére az **as** kulcsszó segítségével, _ilyet már régebben is használtunk_. Pl.:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import math as m"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Egyes hosszú nevű modulok helyett pl. általánosan megszokott az aliasok használata. Ilyet régóta használunk pl.:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### A *time* és *datetime* könyvtárak:\n",
    "\n",
    "A **time** modul alapvető idővel és dátummal kapcsolatos függvényeket tartalmaz. Két különböző megjelenítési formát használ és számos függvény segít ezeknek az oda-vissza konvertálásában:\n",
    "\n",
    "   - **float** másodpercek száma – ez a UNIX belső megjelenítési formája. Ebben a megjelenítési formában az egyes időpontok között eltelt idő egy lebegőpontos szám.\n",
    "   - **struct_time** oblektum – ez kilenc attribútummal rendelkezik egy időpont megjelenítésére, a Gergely naptár szerinti dátumkövetést alkalmazva. Ebben a formában nincs lehetőség két időpont között eltelt idő megjelenítésére, ilyenkor oda-vissza kell konvertálnunk a **float** és **struct_time** között.\n",
    "\n",
    "A **datetime** modul tartalmaz minden szükséges objektumot és metódust, amelyek szükségesek lehetnek a Gergely naptár szerinti időszámítás helyes kezeléséhez. A **datetime** csak egyfajta időpont megjelenítési formát tartalmaz, ellenben négy olyan osztállyal rendelkezik, amelyekkel könnyedén kezelhetjük a dátumokat és időpontokat:\n",
    "\n",
    "   - **datetime.time** – négy attribítummal rendelkezik, ezek az óra, perc, másodperc és a századmásodperc.\n",
    "   - **datetime.date** – három attribútuma van, ezek az év, hónap és a nap.\n",
    "   - **datetime.datetime** – ez kombinálni képes a **datetime.time** és **datetime.date** osztályokat.\n",
    "   - **datetime.timedelta** – ez az eltelt időt mutatja meg két **date**, **time** vagy **datetime** között. Az értékei megjeleníthetők napokban, másodpercekben vagy századmásodpercekben.\n",
    "\n",
    "Nézzünk néhány példát:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2018-11-03\n"
     ]
    }
   ],
   "source": [
    "from datetime import date\n",
    "print(date.today()) # aktuális napi dátum"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2018-11-03 18:00:12.616984\n"
     ]
    }
   ],
   "source": [
    "from datetime import datetime\n",
    "print(datetime.now()) # pillanatnyi idő"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Próbáljuk ki, hogy amennyiben két időpont között várunk 2 másodpercet, az ténylegesen pontosan mennyi eltelt időt jelent."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2018-11-03 18:00:12.672979\n",
      "2018-11-03 18:00:14.674316\n",
      "Ténylegesen eltelt idő: 0:02:00.080220\n"
     ]
    }
   ],
   "source": [
    "from datetime import timedelta\n",
    "from time import sleep\n",
    "\n",
    "t1 = datetime.now()\n",
    "print(t1)\n",
    "sleep(2) # várjunk 2 másodpercet\n",
    "t2 = datetime.now()\n",
    "print(t2)\n",
    "\n",
    "print(\"Ténylegesen eltelt idő:\", timedelta(minutes=(t2-t1).total_seconds())) # valamilyen eltelt idő"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5e-07"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import time\n",
    "time.clock() # másodpercek lebegőpontos ábrázolása. UNIX rendszeren a processzor időt, Windowson a függvény első hívásától eltelt időt mutatja fali óra szerint."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### A *random* könytár:\n",
    "\n",
    "Ez a könyvtár pszeudó-random generátorokat képes létrehozni. Nézzünk néhány konkrét példát:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.803289050063443"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from random import random\n",
    "random() #random float [0, 1) között"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "9.187722608197578"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from random import uniform\n",
    "uniform(2.5, 10.0) #random float [2.5, 10.0) között"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9930064020195424"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from random import expovariate\n",
    "expovariate(1/10) # 1 osztva egy nem nulla értékű középértékkel"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(3, 98)"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from random import randrange\n",
    "num1=randrange(10) # [0,9] közé eső random integer: randrange(stop)\n",
    "num2=randrange(0, 101, 2) # [0,100] közé eső páros integer: randrange(start, stop, step)\n",
    "num1, num2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'draw'"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from random import choice\n",
    "choice(['win', 'lose', 'draw']) # egy lista egyik random eleme"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['two', 'three', 'ace', 'four']"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from random import shuffle\n",
    "deck = 'ace two three four'.split()\n",
    "shuffle(deck) # elemek összekeverése\n",
    "deck"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[70, 20, 40, 10]"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from random import sample\n",
    "sample([10, 20, 30, 40, 50, 60, 70], k=4) #k=n darab elemet ad vissza a halmazból"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from random import randint\n",
    "randint(1,10) # random integert ad [1,10] intervallumban"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### A *math* könyvtár\n",
    "\n",
    "Matematikai függvények használatát teszi lehetővé C szabvány alapján. Néhány konkrét példa:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "6"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import math\n",
    "math.ceil(5.6) # lebegőpontos számok felkerekítése egész típusú számmá"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3628800"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "math.factorial(10) # fatoriális számítás"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "math.floor(5.6) # lebegőpontos számok lefele kerekítése egész típusú számmá"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "math.gcd(122, 6) # visszaadja a két szám legnyagyobb közös osztóját"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "7.38905609893065"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "math.exp(2) # Euler-féle szám az x hatványra emelve"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ennek pythonban nem sok értelme van, ahatványozás megy a `**` művelettel is. (`2 ** 3`)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "8.0"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "math.pow(2, 3) # pow(x,y): x az y hatványra emelve, rövidebben 2**3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "6.0"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "math.sqrt(36) # négyzetgyökvonás, rövidebben 36**0.5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8775825618903728"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "math.cos(0.5) # cosinus függvény radiánokban kifejezve, ugyanígy működik a math.sin(x) is."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "57.29577951308232"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "math.degrees(1) # radián-fok konverzió, ugyanígy math.radian(x) fok-radián átalakító."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Matematikai állandók:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3.141592653589793\n",
      "2.718281828459045\n",
      "inf\n",
      "nan\n"
     ]
    }
   ],
   "source": [
    "print(math.pi) # Pi\n",
    "print(math.e) # Euler-szám\n",
    "print(math.inf) # végtelen\n",
    "print(math.nan) # nem szám (not a number)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Az *OS* könyvtár\n",
    "\n",
    "Az OS modul alapvetően olyan függvényeket tartalmaz melyek az operációs rendszerrel kapcsolatos műveleteket támogatja. A modul beszúrása az **`import os`** paranccsal történik. Nézzünk néhány ilyen metódust:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import os\n",
    "os.system(\"dir\") # shell parancsot hajt végre, ha a parancs hatással van a kimentre, akkor ez nem jelenik meg"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Visszatérésként csak `0`-t ad, ha sikeres és `1`-et, ha nem sikeres a művelet. De a konzolon megjelenik minden kimenet: \n",
    "\n",
    "```python\n",
    "\n",
    "Directory of C:\\Users\\herno\\Documents\\GitHub\\sze-academic-python\\eload\n",
    "\n",
    "2018-11-03  16:42    <DIR>          .\n",
    "2018-11-03  16:42    <DIR>          ..\n",
    "2018-10-24  06:16    <DIR>          .ipynb_checkpoints\n",
    "2018-10-24  11:02    <DIR>          data\n",
    "2018-10-24  06:16             5,846 ea00.md\n",
    "2018-11-03  15:30            18,775 ea01.ipynb\n",
    "2018-07-31  17:41            21,838 ea02.ipynb\n",
    "2018-07-31  17:41            26,484 ea03.ipynb\n",
    "2018-09-10  15:23           293,223 ea04.ipynb\n",
    "2018-10-24  06:16           128,088 ea05.ipynb\n",
    "2018-07-17  11:01            34,838 ea06.ipynb\n",
    "2018-11-03  16:42            49,489 ea07.ipynb\n",
    "2018-11-03  15:30            10,384 ea08.ipynb\n",
    "2018-11-03  15:30           401,267 ea10.ipynb\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'C:\\\\Users\\\\herno\\\\Documents\\\\GitHub\\\\sze-academic-python\\\\eload'"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "os.getcwd() # kiírja az ektuális munkakönytárat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "12324"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "os.getpid() # ez a futó folyamat ID-jét írja ki"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A további példák nem kerülnek lefuttatásra, csak felsoroljuk őket:\n",
    "\n",
    "1) `os.chroot(path)` - a folyamat root könytárának megváltoztatása `'path'` elérésre\n",
    "\n",
    "2) `os.listdir(path)` - belépések száma az adott könytárba\n",
    "\n",
    "3) `os.mkdir(path)` - könyvtár létrehozása a `'path'` útvonalon\n",
    "\n",
    "4) `os.remove(path)` - a `'path'`-ban levő fájl törlése\n",
    "\n",
    "5) `os.removedirs(path)` - könyvtárak rekurzív törlése\n",
    "\n",
    "6) `os.rename(src, dst)` - az `'src'` átnevezése `'dst'`-re, ez lehet fájl vagy könyvtár"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### A *sys* könyvtár\n",
    "\n",
    "A **sys** modul különféle információval szolgál az egyes Python interptreterrel kapcsolatos konstansokról, függvényekről és metódusokról. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Ez egy stderr szoveg\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ez egy stdout szoveg\n"
     ]
    }
   ],
   "source": [
    "import sys\n",
    "\n",
    "sys.stderr.write('Ez egy stderr szoveg\\n') # stderr kimenetre küld hibaüzenetet\n",
    "sys.stderr.flush() # a pufferben eltárolt tartalmat flush-olja a kimenetre\n",
    "sys.stdout.write('Ez egy stdout szoveg\\n') # szöveget küld az stdout-ra"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "script name is c:\\users\\herno\\appdata\\local\\programs\\python\\python35\\lib\\site-packages\\ipykernel_launcher.py\n"
     ]
    }
   ],
   "source": [
    "print (\"script name is\", sys.argv[0]) # az 'argv' tartalmazza a parancssori argumentumokat,\n",
    "                                    # ezen belül az argv[0] maga a szkript neve"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Az elérési útvonalon 8 elem van.\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "['',\n",
       " 'c:\\\\users\\\\herno\\\\appdata\\\\local\\\\programs\\\\python\\\\python35\\\\python35.zip',\n",
       " 'c:\\\\users\\\\herno\\\\appdata\\\\local\\\\programs\\\\python\\\\python35\\\\DLLs',\n",
       " 'c:\\\\users\\\\herno\\\\appdata\\\\local\\\\programs\\\\python\\\\python35\\\\lib',\n",
       " 'c:\\\\users\\\\herno\\\\appdata\\\\local\\\\programs\\\\python\\\\python35',\n",
       " 'c:\\\\users\\\\herno\\\\appdata\\\\local\\\\programs\\\\python\\\\python35\\\\lib\\\\site-packages',\n",
       " 'c:\\\\users\\\\herno\\\\appdata\\\\local\\\\programs\\\\python\\\\python35\\\\lib\\\\site-packages\\\\IPython\\\\extensions',\n",
       " 'C:\\\\Users\\\\herno\\\\.ipython']"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print (\"Az elérési útvonalon\", len(sys.path), \"elem van.\") # lekérdezzük a 'path'-ban levő elemek számát\n",
    "sys.path # kiíratjuk a 'path'-ban levő elemeket"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "``` python\n",
    "print(sys.modules.keys()) # kiíratjuk az importált modulok neveit\n",
    "```\n",
    "```\n",
    "dict_keys(['pkgutil', '__future__', 'filecmp', 'mpl_toolkits', 'platform', 'distutils.debug', 'jedi.evaluate.context', 'ctypes._endian', 'msvcrt', 'parso.pgen2.parse', '_stat', 'jedi.evaluate', '_pickle', 'parso.python.pep8', 'jedi.evaluate.context.module', 'distutils.log', 'collections', \n",
    "......\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "win32\n"
     ]
    }
   ],
   "source": [
    "print (sys.platform) # lekérdezzük a platformunk típusát"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "``` python\n",
    "print(\"hello\")\n",
    "\n",
    "sys.exit(1) # nem lép ki egyből, hanem meghívja a 'SystemExit' kivételt. Ennek kezelésére látsd a következő példát.\n",
    "\n",
    "print(\"there\")\n",
    "\n",
    "Output:\n",
    "hello\n",
    "SystemExit: 1\n",
    "``` "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "hello\n",
      "there\n"
     ]
    }
   ],
   "source": [
    "print (\"hello\")\n",
    "\n",
    "try: # 'try'-al kezeljük a 'SystemExit' kivételt\n",
    "    sys.exit(1)\n",
    "except SystemExit:\n",
    "    pass\n",
    "\n",
    "print (\"there\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### A reguláris kifejezések: *regex*\n",
    "\n",
    "\n",
    "Számos helyzetben kell sztringeket feldolgoznunk. Ezek a sztringek azonban nem mindig érkeznek egyből értelmezhető formában, vagy nem követnek semmilyen mintát. Ilyenkor elég nehéz ezek feldolgozása. Erre nyújt egy elfogadható megoldást a reguláris kifejezések alkalmazása. A **reguláris kifejezés** tehát egy minta, vagy mintasorozat, amelynek segítségével könnyebben feldolgozhatjuk az egy adott halmazhoz tartozó adatokat, melyeknek egy közös mintát kellene követniük. Nézzünk egy példát!\n",
    "\n",
    "Ha pl. a minta szabályom az \"aba\" szócska, akkor minden olyan sztring, amely megfelel az \"aba\" formátumnak, beletartozik a halmazba. Egy ilyen egyszerű szabály azonban csak egyszerű sztringeket képes kezelni.\n",
    "\n",
    "Egy összetettebb szabály, mint pl. a \"ab&ast;a\" már sokkal több kimeneti lehetőséget nyújt. Lényegében, sztringek végtelen halmazát képes generálni, olyanokat mint: \"aa\", \"aba\", \"abba\", stb. Itt már kicsit nehezebb ellenőrizni, hogy a generált sztring ebből a szabályból származik-e. \n",
    "\n",
    "#### Néhány alapszabályt a reguláris kifejezések létrehozásával kapcsolatban\n",
    "\n",
    "- Bármely hagyományos karakter, akár önmagában is reguláris kifejezést alkothat\n",
    "- A '.' karakter bármely egyedülálló karakternek megfelelhet. Pl. az \"x.y\"-nak megfelelhet a \"xay\", \"xby\", stb., de a \"xaby\" már NEM.\n",
    "- A szögletes zárójelek [...] olyan szabályt definiálnak, amely alapján az adott elem megfelel a zárójelben levő halmaznak. Pl. a \"x[abc]z\"-nak megfelelhet az \"xaz\", \"xbz\" és az \"xcz\" is. Vagy pl. az \"x[a-z]z\" mintában a középső karakter az ABC bármely betűje lehet. Ilyenkor az intervallumot kötőjellel '-' jelöljük meg.\n",
    "- A '^' jellel módosított szögletes zárójelek [^...] azt jelentik, hogy a reguláris kifejezésben a zárójelben felsoroltakon kívűl minden más szerepelhet. Pl. a \"1[^2-8]2\" kifejezésben a zárójel helyén csak '1' és '9' lehet, mert a \"2-8\" közötti intervallumot kizártuk.\n",
    "- Több reguláris kifejezést csoportosíthatunk zárójelek (...) segítségével. Pl. a \"(ab)c\" szabály az \"ab\" és 'c' reguláris kifejezések csoportosítása.\n",
    "- A reguláris kifejezések ismétlődhetnek. Pl. a \"x&ast;\" megismételheti a 'x'-t nullászor, vagy ennél többször, a \"x+\" megismétli az 'x'-t 1 vagy annál többször, a \"x?\" megismétli 'x'-t 0 vagy 1 alkalommal. Konkrét példa: a \"1(abc)&ast;2\" kifejezésnek megfelelhet a \"12\", \"1abc2\", és akár a \"1abcabcabc2\" is.\n",
    "- Ha valamilyen szabály a sor elején kezdődik, akkor azt \"^\" mintával jelöljük, ha a sor végén található, akkor pedig a \"^&dollar;\" mintával.\n",
    "\n",
    "#### A reguláris kifejezések alkalmazása Pythonban\n",
    "\n",
    "A reguláris kifejezések alkalmazásához be kell szúrnunk a **re** könyvtárat. Nézzünk ezzel kapcsolatban néhány konkrét feladatot:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Minden szám: ['2019', '12']\n",
      "Minden egyéb: [' ', 'n', 'o', 'v', 'e', 'm', 'b', 'e', 'r', ' ']\n",
      "Angol a-z A-Z: ['november']\n"
     ]
    }
   ],
   "source": [
    "import re\n",
    "szov1 = \"2019 november 12\"\n",
    "print(\"Minden szám:\", re.findall(\"\\d+\", szov1))\n",
    "print(\"Minden egyéb:\", re.findall(\"[^\\d+]\", szov1))\n",
    "print(\"Angol a-z A-Z:\", re.findall(\"[a-zA-Z]+\", szov1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['<body>', '<br>', '</body>']\n"
     ]
    }
   ],
   "source": [
    "szov2 = \"<body>Ez egy példa<br></body>\"\n",
    "print(re.findall(\"<.*?>\", szov2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "s.r      : ['sör', 'sör', 'sár', 'sír']\n",
      "s.r.     : ['sör ', 'sört', 'sár ', 'sír ']\n",
      "s[áí]r   : ['sár', 'sír']\n",
      "P.t.     : ['Peti', 'Pite', 'Pete']\n",
      "P.*t.    : ['Pártol Piros Sanyi Peti Pite Pete']\n",
      "P.{0,3}t.: ['Párto', 'Peti', 'Pite', 'Pete']\n"
     ]
    }
   ],
   "source": [
    "szov3 = \"sör sört sár sír sátor Pártol Piros Sanyi Peti Pite Pete \"\n",
    "print(\"s.r      :\", re.findall(\"s.r\", szov3))\n",
    "print(\"s.r.     :\", re.findall(\"s.r.\", szov3))\n",
    "print(\"s[áí]r   :\", re.findall(\"s[áí]r\", szov3))\n",
    "print(\"P.t.     :\", re.findall(\"P.t.\", szov3))\n",
    "print(\"P.*t.    :\", re.findall(\"P.*t.\", szov3))\n",
    "print(\"P.{0,3}t.:\", re.findall(\"P.{0,3}t.\", szov3))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Nézzünk egy összetettebb példát:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "_S\\d+_y\\d+\\.png \n",
      "---------------\n",
      "valami_S015_y001.png\n",
      "valami_S014_y001.png\n",
      "valami_S013_y001.png\n",
      "\n",
      "_S\\d+_y\\d+\\..* \n",
      "---------------\n",
      "valami_S015_y001.png\n",
      "valami_S015_y001.npy\n",
      "valami_S014_y001.png\n",
      "valami_S014_y001.npy\n",
      "valami_S013_y001.png\n",
      "valami_S013_y001.npy\n",
      "_S999999_y999.npy\n"
     ]
    }
   ],
   "source": [
    "fajl_lista = [    \"valami_S015_y001.png\",\n",
    "                  \"valami_S015_y001.npy\",\n",
    "                  \"valami_S014_y001.png\",\n",
    "                  \"valami_S014_y001.npy\",\n",
    "                  \"valami_S013_y001.png\",\n",
    "                  \"valami_S013_y001.npy\",\n",
    "                  \"_S999999_y999.npy\"]\n",
    "\n",
    "r1 = re.compile(r\"_S\\d+_y\\d+\\.png\")\n",
    "r2 = re.compile(r\"_S\\d+_y\\d+\\..*\")\n",
    "f1 = list(filter(r1.search, fajl_lista))\n",
    "f2 = list(filter(r2.search, fajl_lista))\n",
    "print(\"_S\\d+_y\\d+\\.png \\n---------------\")\n",
    "for f in f1: print(f)\n",
    "print(\"\"); print(\"_S\\d+_y\\d+\\..* \\n---------------\")\n",
    "for f in f2: print(f)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "További információt a reguláris kifejezésekkel kapcsolatban [ITT](https://www.regular-expressions.info/index.html) találnak."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## _Used sources_ / Felhasznált források:\n",
    "   - [Shannon Turner: Python lessons repository](https://github.com/shannonturner/python-lessons) MIT license (c) Shannon Turner 2013-2014,\n",
    "   - [Siki Zoltán: Python mogyoróhéjban](http://www.agt.bme.hu/gis/python/python_oktato.pdf) GNU FDL license (c) Siki Zoltán,\n",
    "   - [BME AUT](https://github.com/bmeaut) MIT License Copyright (c) BME AUT 2016-2018,\n",
    "   - [Python Software Foundation documents](https://docs.python.org/3/) Copyright (c), Python Software Foundation, 2001-2018,\n",
    "   - [Regular expressions](https://www.regular-expressions.info/index.html) Copyright (c) 2003-2018 Jan Goyvaerts. All rights reserved."
   ]
  }
 ],
 "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.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}