{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## [Modulok](https://docs.python.org/3/tutorial/modules.html) és [csomagok](https://docs.python.org/3/tutorial/modules.html#packages)\n", "\n", "**Modul**: Python nyelvű fájl.\n", "- Definíciókat és utasításokat tartalmaz.\n", "- Ha a modulhoz az `xyz.py` fájl tartozik, akkor a modulra `xyz` néven lehet hivatkozni.\n", "- A modulok más Python programokból importálhatók.\n", "\n", "**Csomag**: Modulok gyűjteménye.\n", "- Egy csomag alcsomagokat/almodulokat is tartalmazhat. A hierarchiát a csomagon belüli könyvtárszerkezet határozza meg.\n", "- A standard csomagok és modulok a standard könyvtárban találhatók, és nem igényelnek telepítést.\n", "- A külső csomagok gyűjtőhelye a PyPI (https://pypi.python.org/pypi)." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Modul/csomag importálása.\n", "import random" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "77" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "random.randint(1, 100)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "15" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Függvény importálása egy modulból/csomagból.\n", "from random import randint\n", "randint(1, 100)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-0.24241318164150646" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Modul/csomag teljes tartalmának importálása. (Megjegyzés: Ez a megoldás általában kerülendő.)\n", "from random import *\n", "normalvariate(0, 1)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'/tmp'" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Függvény importálása almodulból/alcsomagból.\n", "from os.path import dirname\n", "dirname('/tmp/pistike.txt')" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# Modul/csomag importálása rövidített néven.\n", "import numpy as np # a numpy csomag importálása np néven\n", " # (a numpy külső csomag)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.0" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.cos(0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fejezetek a [standard könyvtárból](https://docs.python.org/3/library/index.html) I.\n", "\n", "- A Python standard könyvtára több mint 200 csomagot ill. modult tartalmaz. Szabványos megoldást biztosít a programozás mindennapjaiban felmerülő számos feladatra.\n", "- A kurzuson csak a standard könyvtár egy kis részének az áttekintésére vállalkozunk.\n", "- A jó programozó nem találja fel újra a spanyolviaszt. Ha lehetséges, akkor a standard könyvtár eszközeivel oldja meg a feladatot." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### [datetime](https://docs.python.org/3/library/datetime.html)\n", "- Dátum- és időkezelésre biztosít eszközöket.\n", "- Támogatja a dátumaritmetikát, kezeli az időzónákat, óraátállítást, szökőéveket stb.\n", "- Időzónamentes és időzónával rendelkező dátumokat is megenged." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "import datetime" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "datetime.datetime(2021, 3, 8, 9, 0, 10, 300)" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Mikroszekundum pontosságú időpont megadása.\n", "dt1 = datetime.datetime(2021, 3, 8, 9, 0, 10, 300)\n", "dt1" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "datetime.datetime" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(dt1)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "datetime.date(2020, 12, 6)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Nap pontosságú dátum megadása.\n", "d1 = datetime.date(2020, 12, 6)\n", "d1" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "datetime.date" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(d1)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "# Időpont aritmetika.\n", "dt2 = datetime.datetime(2021, 1, 15, 12, 0, 10)\n", "diff = dt1 - dt2" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "datetime.timedelta(days=51, seconds=75600, microseconds=300)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "diff" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "datetime.timedelta" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(diff)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "51\n", "75600\n", "300\n" ] } ], "source": [ "# Az eltérés 51 nap + 75600 másodperc 300 mikroszekundum.\n", "print(diff.days)\n", "print(diff.seconds)\n", "print(diff.microseconds)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4482000.0003" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Másodpercben kifejezve:\n", "diff.total_seconds()" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "datetime.datetime(2021, 3, 16, 4, 0)" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Adjunk hozzá 8 órát egy időponthoz!\n", "datetime.datetime(2021, 3, 15, 20, 0) + datetime.timedelta(0, 8 * 3600)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "44261" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Aritmetika nap pontosságú dátumokkal.\n", "(datetime.date(2021, 3, 8) - datetime.date(1900, 1, 1)).days" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Feladat\n", "- Kérjünk be egy dátumot (év, hónap, nap), majd írjuk ki azt, hogy a dátum hányadik nap az adott évben!" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Kérek egy dátumot (éééé.hh.nn): 2023.01.02\n", "2\n" ] } ], "source": [ "# Megoldás\n", "import datetime\n", "\n", "s = input('Kérek egy dátumot (éééé.hh.nn): ')\n", "t = s.split('.')\n", "dt = datetime.date(int(t[0]), int(t[1]), int(t[2]))\n", "n = (dt - datetime.date(dt.year, 1, 1)).days + 1\n", "print(n)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Feladat\n", "- Adott egy lista, amelyben személyek neve és születési dátuma szerepel! Készítsünk életkor szerint növekvően rendezett listát a személyek adatairól!" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[('Békés Farkas', datetime.date(2014, 7, 30)),\n", " ('Git Áron', datetime.date(1995, 2, 28)),\n", " ('Har Mónika', datetime.date(1995, 2, 27)),\n", " ('Bank Aranka', datetime.date(1980, 9, 1)),\n", " ('Wincs Eszter', datetime.date(1980, 5, 7)),\n", " ('Trab Antal', datetime.date(1961, 4, 1)),\n", " ('Gipsz Jakab', datetime.date(1957, 11, 21))]" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Megoldás\n", "import datetime\n", "\n", "people = [\n", " # név, születési dátum\n", " ('Gipsz Jakab', datetime.date(1957, 11, 21)),\n", " ('Wincs Eszter', datetime.date(1980, 5, 7)),\n", " ('Békés Farkas', datetime.date(2014, 7, 30)),\n", " ('Har Mónika', datetime.date(1995, 2, 27)),\n", " ('Trab Antal', datetime.date(1961, 4, 1)),\n", " ('Git Áron', datetime.date(1995, 2, 28)),\n", " ('Bank Aranka', datetime.date(1980, 9, 1))\n", "]\n", "sorted(people, key=lambda p: p[1], reverse=True)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "datetime.datetime(2023, 11, 7, 11, 38, 32, 206260)" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Aktuális idő lekérdezése.\n", "dt = datetime.datetime.now()\n", "dt" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2023\n", "11\n", "7\n", "11\n", "38\n", "32\n", "206260\n" ] } ], "source": [ "# A datetime objektum mezőinek lekérése.\n", "print(dt.year)\n", "print(dt.month)\n", "print(dt.day)\n", "print(dt.hour)\n", "print(dt.minute)\n", "print(dt.second)\n", "print(dt.microsecond)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# A hét napjának lekérdezése (0=hétfő, ..., 6=vasárnap):\n", "dt.weekday()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Feladat\n", "- Hány db péntek 13-adika volt a 20. században (azaz 1901.01.01-től 2000.12.31-ig)?" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "171\n", "171\n" ] } ], "source": [ "import datetime\n", "\n", "# Megoldás 1: a 20. század összes napját megvizsgáljuk.\n", "db = 0\n", "dt = datetime.date(1901, 1, 1)\n", "while dt <= datetime.date(2000, 12, 31):\n", " if dt.weekday() == 4 and dt.day == 13:\n", " db += 1\n", " dt += datetime.timedelta(1)\n", "print(db)\n", "\n", "# Megoldás 2: csak minden érintett hónap 13. napját vizsgáljuk meg.\n", "db = 0\n", "for y in range(1901, 2001): # végigmegyünk az éveken\n", " for m in range(1, 13): # azon belül a hónapokon\n", " if datetime.date(y, m, 13).weekday() == 4:\n", " db += 1\n", "print(db)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### [time](https://docs.python.org/3/library/time.html)\n", "- Alacsony szintű időkezelésre ad eszközöket, ide tartozik pl. az időtartam mérés és a várakozás." ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "import time" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1699353589.2763045" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Aktuális idő lekérdezése (UNIX időbélyegként).\n", "time.time() # 1970-01-01 óta eltelt idő, másodpercben" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "s=1.64493306684777, dt=0.23554015159606934\n" ] } ], "source": [ "# Időtartam mérés.\n", "t0 = time.time()\n", "s = 0\n", "for k in range(1, 1000000):\n", " s += 1 / k**2\n", "dt = time.time() - t0\n", "print(f's={s}, dt={dt}')" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "# Várakozás 2 másodpercig.\n", "time.sleep(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### [random](https://docs.python.org/3/library/random.html)\n", "- Álvéletlenszám-generálásra biztosít eszközöket." ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "import random" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "60" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Egész szám sorsolása egy intervallumból.\n", "random.randint(1, 100)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "93" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Ha a felső határt ki akarjuk zárni:\n", "# 1 és 99 közötti véletlen egész számot generál.\n", "random.randrange(1, 100)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-1.6302778550631207" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Valós szám sorsolása egy intervallumból.\n", "random.uniform(-2.2, 5.4)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.675777119325788" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Sorsolás standard normális eloszlásból.\n", "random.normalvariate(0, 1)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "82\n", "15\n", "4\n" ] } ], "source": [ "# Véletlenszám generátor állapotának beállítása.\n", "random.seed(42)\n", "print(random.randint(1, 100))\n", "print(random.randint(1, 100))\n", "print(random.randint(1, 100))" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "82\n", "15\n", "4\n" ] } ], "source": [ "random.seed(42)\n", "print(random.randint(1, 100))\n", "print(random.randint(1, 100))\n", "print(random.randint(1, 100))" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "# Az állapot visszaállítása véletlenszerűre.\n", "random.seed()" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "82\n", "82\n", "15\n", "15\n" ] } ], "source": [ "# Véletlenszám generátor objektum létrehozása.\n", "r1 = random.Random(42)\n", "r2 = random.Random(42)\n", "\n", "print(r1.randint(1, 100))\n", "print(r2.randint(1, 100))\n", "print(r1.randint(1, 100))\n", "print(r2.randint(1, 100))" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'alma'" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Elem kisorsolása egy szekvenciából.\n", "random.choice(['alma', 'körte', 'szilva'])" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[49, 58, 30, 62, 88]" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Visszatevés nélküli mintavétel.\n", "random.sample(range(1, 91), 5)" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['körte', 'alma', 'szilva']" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Véletlen keverés.\n", "l = ['alma', 'körte', 'szilva']\n", "random.shuffle(l)\n", "l" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Feladat\n", "- Rakjuk egy szöveg karaktereit véletlenszerű sorrendbe!" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ailntcaspa\n", "aclsitpaan\n" ] } ], "source": [ "s = 'palacsinta'\n", "\n", "# Megoldás 1: random.sample-vel\n", "print(''.join(random.sample(s, len(s))))\n", "\n", "# Megoldás 2: random.shuffle-vel\n", "l = list(s)\n", "random.shuffle(l)\n", "print(''.join(l))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Feladat\n", "- Szimuláljunk egy 10000 hosszú dobás sorozatot 2 db dobókockával, majd írjuk ki azt, hogy az esetek hány százalékában volt a dobások összege 2, 3, ..., 12!" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 2: 2.45\n", " 3: 5.66\n", " 4: 8.45\n", " 5: 11.48\n", " 6: 14.17\n", " 7: 16.33\n", " 8: 13.72\n", " 9: 11.13\n", "10: 8.20\n", "11: 5.64\n", "12: 2.77\n" ] } ], "source": [ "# Megoldás\n", "n = 10000\n", "freq = [0] * 13\n", "for i in range(n):\n", " # dobások szimulálása\n", " s = random.randint(1, 6) + random.randint(1, 6)\n", " # megfelelő számláló növelése\n", " freq[s] += 1 \n", " \n", "# kiírás\n", "for s in range(2, 13):\n", " print(f'{s:2}: {freq[s] / n * 100:.2f}')" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.11.3" } }, "nbformat": 4, "nbformat_minor": 2 }