\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# If\n",
"\n",
"\n",
"\n",
"Ha azt szeretnénk, hogy valami akkor történjen, ha megfelel vagy épp nem felel meg valamilyen feltételnek (valami egyenlő-e valamivel, nagyobb-e, ...) akkor feltétel vizsgálatot kell végezni és az eredmény szerinti feladatot elvégezni.\n",
"\n",
"Például, ha gyököt akarunk vonni egy beadott számból szükséges lehet ilyen vizsgálat. Ugyanis ha pozitív a szám semmi gond, ha viszont negatív, akkor ezt kezelni kell, mondjuk szorozzuk meg -1-el. \n",
"\n",
"Ez a kérdés magyarul hogy is szól: Ha a szám nagyobb (vagy egyenlő) mint 0 akkor vonjunk gyököt, ha pedig nem akkor szorozzuk meg mínusz eggyel és utána vonjunk gyököt belőle. Lehet érzeni a mondatban, mit mikor kell elvégezni."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ennek a műveleteknek az elvégzésére több paranccsal is alkalmas, de a leggyakoribb az `if-else` parancs. Ez lényegében egy elágazás, ami azt teszik, hogy ha igaz az állítás, akkor megcsinál valamit, ha meg hamis, akkor mást.\n",
"\n",
"Szerkezete:\n",
"\n",
"```python\n",
"if (feltétel vizsgálat):\n",
" utasítás1\n",
"else:\n",
" utasítás2\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Megjegyzés: Nem kötelező mindkét ágban utasítást adni, ilyenkor csakis a feltétel teljesülésekor hajtódik végre utasítás. \n",
"\n",
">Tehát a következő parancs is értelmes:\n",
"\n",
">```python\n",
"if \"élet értelme\" == 42:\n",
" print(\"Naná\") # És itt nem adunk meg else ágat\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Példák"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"var1 = 100\n",
"if var1:\n",
" print(\"A változónak van értéke\")\n",
" print(var1)\n",
"else:\n",
" print(\"A változónak nincs értéke\")\n",
" print(var1)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"var1 = \"cica\"\n",
"if var1:\n",
" print(\"A változónak van értéke\")\n",
" print(var1)\n",
"else:\n",
" print(\"A változónak nincs értéke\")\n",
" print(var1)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"var1 = \"\"\n",
"if var1:\n",
" print(\"A változónak van értéke\")\n",
" print(var1)\n",
"else:\n",
" print(\"A változónak nincs értéke\")\n",
" print(var1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Adjunk magyarázatot a kovetkezőre:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"var1 = 0\n",
"if var1:\n",
" print(\"A változónak van értéke\")\n",
" print(var1)\n",
"else:\n",
" print(\"A változónak nincs értéke\")\n",
" print(var1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Többszörös elágazások (`if-elif-else`)\n",
"\n",
"Az elágazások egymásba fűzhetőek két módon. Vagy egy már nyitott elágazásban helyezünk el újabb elágazást, vagy többszörös feltételvizsgálatot végzünk az elágazásunkon. Lássuk most az első esetet:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"szam=int(input(\"Kérem adjon meg egy egész számot:\"))\n",
"\n",
"if szam > 0:\n",
" if szam%2 == 0:\n",
" print(\"A megadott szám páros pozitív\")\n",
" else: \n",
" print(\"A megadott szám páratlan pozitív\")\n",
"else: \n",
" if szam%2 == 0:\n",
" print(\"A megadott szám páros negatív\")\n",
" else: \n",
" print(\"A megadott szám páratlan negatív\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ha nem egymásba akarunk teljesen eltérő feltételeket vizsgálni, hanem összefüggően, több feltételt külön-külön vizsgálni (több elágazásunk van), akkor használjuk az `if-elif-else` szerkezetet:\n",
"\n",
""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"szam=float(input(\"Kérem adjon meg egy számot:\"))\n",
"\n",
"if szam == 0:\n",
" print(\"nulla\")\n",
"elif szam > 0:\n",
" print(\"pozitív\")\n",
"else:\n",
" print(\"negatív\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Megjegyzés: Törekedjünk a lehető legkevesebb új elágazás használatára. Mivel a sok elágazás átláthatatlanná teszi a program működését. Azaz szerencsésebb az `if-elif-else` használata, mint sok önálló `if-else`.**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Oldjuk meg együtt\n",
"\n",
"Írjunk egy if tömböt amely a nap és az óra valtozók megadott értékei alapján eldönti, hogy épp az adott időben a diák mit csinál. Az if tömb válasza az alábbiak szerint osztandó ki:\n",
"- A fiúk is és a lányok is hétköznap délelőtt tanulnak.\n",
"- 12-től fociznak.\n",
"- Hétvégén mindenki kirándul.\n",
"- Mindennap mindenki 8-kor megy aludni, és reggel 8 kor kel."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Megoldás helye"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# For\n",
"\n",
"A számítógépek legfontosabb tulajdonságai közt szerepel az, hogy nagyon gyorsak és \"fáradhatatlanok\". Olyan feladatok megoldásában a leghatékonyabbak, amikor a feladatot kevés munkával meg lehet fogalmazni (\"az alkotó pihen\") de végrehajtása nagyon sok ismétlést, iterációt igényel (\"a gép forog\"). Az iteráció (angol: iterate) azt jelenti, hogy például egy lista elemein egyesével végigmegy a program, és műveleteket végez el rajtuk. \n",
"\n",
"\n",
"\n",
"A Python-ban, az egyik erre használható utasítás a **for** parancs (magyarul kb. a ...-ra, azaz pl. a hét minden napjára, a lista minden elemére):\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"days_of_the_week = [\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"for day in days_of_the_week:\n",
" print(day)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ez a kódrészlet a **days_of_the_week** listán megy végig és a meglátogatott elemet hozzárendeli a **day** változóhoz, amit *ciklusváltozónak* is neveznek. Ezek után mindent végrehajt amit a beljebb tabulált (angolul: *indented*) parancsblokkban írtunk (most csak egy **print** utasítás), amihez felhasználhatja a ciklusváltozót is. Miután vége a beljebb tabulált régiónak, kilép a ciklusból.\n",
"\n",
"Szinte minden programnyelv használ hasonló ciklusokat. A C, C++, Java nyelvekben kapcsos zárójeleket {} használnak a ciklusok elkülönítésére, kb. így: \n",
"\n",
"`for (i=1..10) {print i}` \n",
"\n",
"A FORTRAN nyelvben az *END* szócska kiírása jelzi a ciklus végét. A pythonban a kettőspont (\":\"), majd szóközökkel beljebb írt sorok szolgálnak erre. Ha más programokból másolunk át részleteket figyeljünk arra hogy a behúzás helyett nem TAB-ot használ. (A TAB néhol megengedett de kerülendő. A modern [python kódolási stílusirányzat](http://django.arek.uni-obuda.hu/python3-doc/html/tutorial/controlflow.html#intermezzo-kodolasi-stilus) minden behúzást 4 szóköznek javasol.) \n",
"\n",
"Annak semmi jelentősége nincs, hogy a példában a **day** nevet adtunk az iterációban szereplő *ciklusváltozó*nak. A program semmit se tud az emberi időszámításról, például, hogy a hétben napok vannak és nem kiscicák:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"for macska in days_of_the_week:\n",
" print(macska)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A ciklus utasításblokkja állhat több utasításból is:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"for day in days_of_the_week:\n",
" statement = \"Today is \" + day\n",
" print(statement)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A **range()** parancs remekül használható ha a **for** ciklusban adott számú műveletet szeretnénk elvégezni:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"for i in range(20):\n",
" print(\"The square of \",i,\" is \",i*i)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Akkor válik mindez még érdekesebbé, ha az eddig tanult iterációt és feltétel vizsgálatot kombináljuk:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"for day in days_of_the_week:\n",
" statement = \"Today is \" + day\n",
" print(statement)\n",
" if day == \"Sunday\":\n",
" print (\" Sleep in\")\n",
" elif day == \"Saturday\":\n",
" print (\" Do chores\")\n",
" else:\n",
" print (\" Go to work\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Figyeljük meg a fenti példában hogy ágyazódik egymás alá a **for** és az **if**! "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Egy példa program: Fibbonacci sorozat\n",
"\n",
"A [Fibonacci](http://en.wikipedia.org/wiki/Fibonacci_number) sorozat első két eleme 0 és 1, majd a következő elemet mindig az előző kettő összegéből számoljuk ki: 0,1,1,2,3,5,8,13,21,34,55,89,...\n",
"\n",
"Ha nagyobb **n** értékekre is ki akarjuk számolni a sorozatot, ez kiváló feladat lehet egy fáradhatatlan és gyors számítógépnek!"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"n=int(input(\"Adjon meg egy egész számot:\")) #Bekér a program egy számot (ennyi tagú lesz a sorozat)\n",
"\n",
"if n<0: # Megvizsgáljuk, hogy nem-e negatív számot adott-e meg a felhasználó\n",
" print(\"Negatív számot adott meg, megszorzom -1-gyel.\\n\")\n",
" n=n*(-1)\n",
"\n",
"sequence = [0,1] # A két kezdőérték\n",
"for i in range(2,n): # számok 2-től n-ig, Figyelni kell hogy n ne legyen kisebb mint 2!!\n",
" sequence.append(sequence[i-1]+sequence[i-2]) # Így számoljuk a következő tagot\n",
"print (sequence)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Nézzük végig lépésről lépésre! Először **n** értékét, azaz a kiszámolandó sorozat hosszát állítjuk be 10-re. A sorozatot majdan tároló listát **sequence**-nek neveztük el, és *inicializáltuk* az első két értékkel. A \"kézi munka\" után következhet a gép automatikus munkája, az iteráció.\n",
"\n",
"Az iterációt 2-vel kezdjük (ez ugye a 0-s indexelés miatt a 3. elem lesz, hisz az első kettőt már mi megadtuk) és **n**-ig, a megadott lista méretig számolunk. \n",
"\n",
"A ciklus törzsében az addig kiszámolt lista végére hozzátűzzük (**append**) az előző két tag összegét. A ciklus vége után kiíratjuk az eredményt."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"dat=[];\n",
"for i in range(10):\n",
" dat.append(i**2)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"dat"
]
}
],
"metadata": {
"hide_input": false,
"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.1"
},
"latex_envs": {
"bibliofile": "biblio.bib",
"cite_by": "apalike",
"current_citInitial": 1,
"eqLabelWithNumbers": true,
"eqNumInitial": 0
},
"nav_menu": {},
"toc": {
"navigate_menu": true,
"number_sections": false,
"sideBar": true,
"threshold": 6,
"toc_cell": false,
"toc_section_display": "block",
"toc_window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 0
}