{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Bevezetés a Python nyelvbe\n",
"\n",
"Az előadás nagyvonalakban a hivatalos [Python tutorial 3.7](https://docs.python.org/3.7/tutorial/)-et követi, de lehet használni a [w3schools](https://www.w3schools.com/python/) tutorial-ját is.\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](https://en.wikipedia.org/wiki/Guido_van_Rossum).\n",
"\n",
"Nevét a Monthy Python ihlette, nem az állat."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Miért Python?\n",
"### Népszerűsége\n",
"\n",
"* [Most Popular Programming Languages 1965 - 2019](https://www.youtube.com/watch?v=Og847HVwRSI)\n",
"* [Most Popular Programming Languages on Stack Overflow Bar Chart Race](https://www.youtube.com/watch?v=cKzP61Gjf00)\n",
"* [TIOBE - egy szoftver minőségellenőrző cég](http://www.tiobe.com/tiobe-index/)\n",
"* [IEEE – Spectrum](https://spectrum.ieee.org/static/interactive-the-top-programming-languages-2019)\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ő (free as in [free speach __not__ as in free beer](https://www.gnu.org/philosophy/free-sw.en.html)), használható, üzleti célra is\n",
"\n",
"### Hátrányai\n",
"\n",
"* Lassú (hatékony szoftverek írására kevésbé alkalmas)\n",
"* Mobil-programozásra nem a legjobb\n",
"* Nagy grafikai igényű (3D) programozásra nem alkalmas\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Futtatás\n",
"* a `python` ú.n. _interpretált (interpreteres)_ nyelv (_Interpretált_ nyelv végrehajtja az utasításokat anélkül, hogy közvetlenül gépi kódra fordítaná azt – ellentétben a _fordítóprogramos_ nyelvekkel) \n",
"* egy általunk írt kód lefuttatásához egy másik programra van szükségünk: ú.n. _interpreter_ (mint egy tolmács az általunk írt kód és a gépi kód között), valójában itt van egy köztes lépés, az interpreter egy ún. Python byte-kódot állít elő,\n",
"* az általunk írt kód gép és operációs rendszer független (többnyire), a futtató program gép illetve oprendszer függő.\n",
"\n",
"Több módon is futtathatunk python kódot."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Parancssorból\n",
"Parancssorból futtatható, a Python interaktív interpretere:\n",
"\n",
"$ python\n",
"
\n",
"Ez egy saját prompt-ot ad, ahová közvetlenül írhatunk Python-kódot.\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",
"Itt az interpreter a `python`(`.exe`)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### IDLE (Interactive Development & Learning Environment)\n",
"\n",
"Az [IDLE](https://docs.python.org/3/library/idle.html) a Pythonnal együtt jön, és egyszerre ad az interaktív interpreternek is és a programkód szerkesztésének is egy ablakot (ha szükséges, többet):\n",
"\n",
"$ idle
\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Jupyter notebook\n",
"A [Jupyter](http://jupyter.org/) egy böngészőn keresztül használható fejlesztői környezet, többek közöt python-hoz. Ezt lehet saját gépről is használni (ha telepítve van), de gyakorlaton a [jupyter.math.bme.hu](https://jupyter.math.bme.hu:8888/)-t fogjuk használni. Ez ugyan olyan, mintha a saját gépről kiadnánk a `jupyter notebook` parancsot.\n",
"\n",
"A Jupyter maga egy webes felhasználói felület, a háttérben Python (és akár Sage, R vagy más) interpretert ( _kernel_ ) futtat."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Spyder\n",
"A [Spyder](https://spyder-ide.github.io/) egy grafikus fejlesztői környezet pythonhoz, a `leibniz`-en fent van de kényelmesen telepíti bárki bármilyen oprendszerre.\n",
"\n",
"Ez nem interpreter, hanem egy program ami a kód írását és futtatását könnyíti meg, de muszáj használnia egy interpretert."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Otthonra\n",
"\n",
"Az [Anaconda](https://www.anaconda.com/distribution/) disztribúciót javaslom. Van minden főbb asztali oprendszerre (Linux, Mac, Windows)\n",
"* válasszuk ki a megfelelő oprendszert\n",
"* válasszunk a __3.7__-es verziót\n",
"* figyeljünk, hogy 32 vagy 64 bites\n",
"\n",
"Ez nagyon sok mindent tartalmaz, pl. parancssori (`python`, `ipython`), notebook (`jupyter`) és grafikus (`Spyder`) környezetet, statisztikai programnyelvet (R), és sok hasznos függvénykönytárat."
]
},
{
"cell_type": "markdown",
"metadata": {},
"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",
"* str
(karakterlánc, sztring): \"Pál fogyó IQ-jú kun exvő, ím dühös a WC-bűzért.\", \"öt hűtőházból kértünk színhúst\", \"ハンガリーからのご挨拶\", \"هنغاريا\", \"Венгрия\", \"헝가리\", \"הונגריה\", \"匈牙利\", \"ฮังการี\",\n",
"\n",
"Dolgok típusát lekérdezhetjük a type
paranccsal."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"type(5.0)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Műveletek, kifejezések"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"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
eredményük `bool`\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",
"* a != b
, „kizáró vagy” (exclusive or, xor)\n",
"\n",
"Stringeken alapvető műveletek:\n",
"* a + b
, konkatenálás\n",
"* a in b
, tartalmazás vizsgálat (eredménye bool)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"5 + 11"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"2 ** 251"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"12 ^ 7 # bitenkénti kizáró vagy: 1100 ^ 0111 = 1011"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"a = 54\n",
"b = a - 50\n",
"a * b"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"54 > 12"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"b <= 0"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"54 > 12 or b <= 0"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"(1 < 2) != (3 == 3) # != exclusive or"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"(1 < 2) != (3 == 3)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"s = \"ハンガリー\"\n",
"\"ハン\" in s"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"s = \"hon\"\n",
"s = 'Pyt' + s\n",
"s"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Változónevek\n",
"* a név betűvel vagy aláhúzással kezdődhet (szumma, almák_száma, \\_yes)\n",
"* a név további karakterei az előbbieken felül számok is lehetnek: (var1, szumma2)\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": {},
"source": [
"# Karakterláncok\n",
"Három módon adhatunk meg karakterláncokat:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"s = \"kiskutya\"\n",
"type(s)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"s = 'kiskutya'\n",
"type(s)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"s = \"\"\"Volt egyszer egy kiskutya.\n",
"Elment a vásárba.\"\"\"\n",
"type(s)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"s"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Itt a vezérlő karaketerek (\\n a sorvége jel), a print utasítás a vezérlő karaktereket is megjeleníti: "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(s)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"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": {},
"outputs": [],
"source": [
"print(\"Egy 'macskaköröm', \" + 'kettő \"macskaköröm\".')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"sztring = 'Van ilyen: \\', meg ilyen: \".'"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"sztring"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(sztring)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A harmadik változatban 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 (ún. escape) karakterek stringekben: \\\\\\\\ (\\\\), \\\\\\' ('), \\\\\\\" (\"), \\n
(új sor), \\t
(tab)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(\"\"\"első sor,\n",
"második sor\"\"\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(\"\\home\\name\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(r\"\\home\\name\") # raw text, no escape sequences"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Kiírás\n",
"Interaktív módban (akár parancssori, akár itt a Jupyterben) az egyes cellák eredménye az utolsó érték ami kiértékelődött, de ha futtatunk egy korábban megírt python programot, akkor csak az lesz kiírva, amit meg akarunk jeleníteni (pl. a print()
függvénnyel.)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"5 + 8\n",
"5 + 7"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"a = 5\n",
"print(a)\n",
"a = 15\n",
"a + 1\n",
"print(a * 2)\n",
"a"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(\"Volt egyszer egy %s, elment a vásárba.\" % \"nagykutya\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"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": {},
"outputs": [],
"source": [
"print(\"Volt %s egy %s, elment a %s.\" % (\"egyszer\", \"kiskutya\", \"vásárba\"))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Nem csak stringeket lehet behelyettesíteni, egész vagy lebegőpontos számokat is lehet:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"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": {},
"source": [
"| `%` | típus | példa | eredmény|\n",
"| --- | ----- | ----- | --------|\n",
"| `%s`| sztring| \"Volt egyszer egy %s\" % \"kiscica\"
| \"Volt egyszer egy kiscica\"
|\n",
"| `%d`| egész | \"Volt egyszer %d kiscica\" % 1
| \"Volt egyszer 1 kiscica\"
|\n",
"| `%f`| lebegőpontos | \"Volt egyszer %f kiscica\" % math.pi
| \"Volt egyszer 3.141593 kiscica\"
|\n",
"| | | \"Volt egyszer %d %s és osztozniuk kellett %fdkg sajton\" % (3, 'kisegér', math.pi)
| \"Volt egyszer 3 kisegegér és osztozniuk kellett 3.141593dkg sajton\"
|"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Az hogy mi történjen a sor végén, az end=
opcióval adható meg. Értéke alapértelmezésben '\\n'
. Egy üres print
egyszerűen új sort kezd."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(1, 3.14, \"kutya\")\n",
"print(\"macska\", end=' ') # egy szóköz\n",
"print(\"teve\", end='') # üres string\n",
"print(\"gel\", end=' ')\n",
"print()\n",
"print(\"vége\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Beolvasás"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"input()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"nev = input(\"Hogy hívnak? \")\n",
"print(\"Szia %s!\\nÖrülök, hogy megismerkedtünk!\" % nev)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"input() > 10 # amit beolvas, az string"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"int(input()) > 10 # konvertáljuk egésszé"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"type(input())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Elágazás"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"x = float(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": {
"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": {},
"source": [
"# While ciklus"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"n = 1000\n",
"a = 1\n",
"while a ** 3 <= n:\n",
" print(a ** 3, end=' ')\n",
" a = a + 1\n",
"print(\"vége\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A while
ciklus blokkja újra és újra lefut, amíg teljesül a ciklus feltétele.\n",
"Ciklusokat és elágazásokat egymásba ágyazhatunk:"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A híres Collatz- vagy $3x+1$-probléma:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"a = int(input())\n",
"while a != 1:\n",
" print(a, end=' ')\n",
" if a % 2 == 0:\n",
" a = a // 2\n",
" else:\n",
" a = a * 3 + 1\n",
"print(a)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ezt megtehetjük akárhány mélységig (ciklusok is ágyazhatók egymásba):"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"a = int(input())\n",
"if a > 0:\n",
" while a != 1:\n",
" print(a, end=' ')\n",
" if a % 2 == 0:\n",
" a = a // 2\n",
" else:\n",
" a = a * 3 + 1\n",
" print(a)\n",
"else:\n",
" print(\"Pozitív egész számot adjunk meg!\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A fenti kód már azt is teszteli, hogy a felhasználó pozitív egész számot adott-e meg. Változtassunk a kódon úgy, hogy többször egymás után is lefusson, és 0 érték megadása esetén álljon le! Ehhez a break
parancsot használhatjuk, mellyel kiugorunk a ciklusból!"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"while True:\n",
" a = int(input())\n",
" if a > 0:\n",
" while a != 1:\n",
" print(a, end=' ')\n",
" if a % 2 == 0:\n",
" a = a // 2\n",
" else:\n",
" a = a * 3 + 1\n",
" print(a)\n",
" elif a == 0:\n",
" break\n",
" else:\n",
" print(\"Nemnegatív egész számot adjunk meg, a 0-val befejezzük a futtatást!\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"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 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.8"
},
"pygments_lexer": "ipython3",
"version": "3.6"
},
"nbformat": 4,
"nbformat_minor": 1
}