diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..f56cf230e0ce073fdadf2c500719b03274b85f86 --- /dev/null +++ b/README.md @@ -0,0 +1,115 @@ +# Python mĂŠrĂŠs + +## 1. Feladat - BemelegĂtĹ gyakorlatok + +A kĂśvetkezĹ rĂŠszfeladatok cĂŠlja bemutatni a Python alapvetĹ szintaktikai elemeit ĂŠs a nyelv hasznĂĄlhatĂłsĂĄgĂĄt, +lehetĹsĂŠgeit. + +A Python nyelvvel valĂł ismerkedĂŠshez cĂŠlszerĹą elĹszĂśr egy elszeparĂĄlt kĂśrnyezetet kialakĂtani, amiben kedvĂźnkre +telepĂthetĂźnk kĂźlĂśnbĂśzĹ verziĂłjĂş csomagokat anĂŠlkĂźl, hogy azok ĂśsszeakadnĂĄnak a globĂĄlis Python csomagokkal. EzĂĄltal +rendezetten ĂŠs elszeparĂĄltan tarthatĂłak a globĂĄlis rendszercsomagok ĂŠs egy kĂśnnyen menedzselhetĹ, virtuĂĄlis kĂśrnyezetet +kapunk. Ehhez telepĂtenĂźnk kell a `virtualenv` Python csomagot a `pip3` csomagmenedzselĹ segĂtsĂŠgĂŠvel. Ha a `pip3` nincs +telepĂtve, elĹszĂśr adjuk ki a `$ sudo apt-get install python3-pip` parancsot a pip3, majd a +`$ sudo pip3 install virtualenv` parancsot a `virtualenv` telepĂtĂŠsĂŠhez. + +A virtuĂĄlis mĂŠrĂŠsi kĂśrnyezet lĂŠtrehozĂĄsĂĄhoz adjuk ki a `$ virtualenv py-meres` parancsot. Ekkor lĂŠtrejĂśn egy mappa benne +a szĂźksĂŠges futtathatĂł Python ĂĄllomĂĄnyokkal ĂŠs a `pip3` csomagmenedzselĹ fĂźggĹsĂŠgeivel. AlapĂŠrtelmezetten a globĂĄlisan +telepĂtett kĂźlsĹ csomagok nem kerĂźlnek linkelĂŠsre, Ăgy minden a Python standard kĂśnyvtĂĄrĂĄban nem szereplĹ fĂźggĹsĂŠg kĂźlĂśn +telepĂtendĹ, ha szĂźksĂŠges. + +Dolgozzunk a lĂŠtrejĂśtt `py-meres` mappĂĄban. Minden rĂŠszfeladatot, ahol egy szkript fĂĄjlt kell kĂŠszĂteni, egy kĂźlĂśnĂĄllĂł +`.py` kiterjesztĂŠsĹą fĂĄjlban oldjuk meg! + +A virtuĂĄlis kĂśrnyezet aktivĂĄlĂĄsĂĄhoz adjuk ki a mappĂĄban a `$ source bin/activate` parancsot. Ekkor a prompt elĂŠ bekerĂźlĹ +nĂŠv jelzi, hogy melyik kĂśrnyezetben dolgozunk. + +KĂśrnyezet deaktivĂĄlĂĄsa: `$ deactivate` + +EllenĹrizzĂźk, hogy elĂŠrhetĹ-e a megfelelĹ Python verziĂł (>= 3.5.x): `$ python3 --version`. +Ha a hasznĂĄlt Python verziĂł nem **3.x**, akkor ĂĄllĂtsuk be: `$ virtualenv âp /usr/bin/python3 py-meres` + +```bash +czentye@ThinkPad-L470:~$ virtualenv py-meres +created virtual environment CPython3.8.5.final.0-64 in 471ms + creator CPython3Posix(dest=/home/czentye/py-meres, clear=False, no_vcs_ignore=False, global=False) + seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/czentye/.local/share/virtualenv) + added seed packages: pip==21.0.1, setuptools==52.0.0, wheel==0.36.2 + activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator +czentye@ThinkPad-L470:~$ cd py-meres/ +czentye@ThinkPad-L470:~/py-meres$ source bin/activate +(py-meres) czentye@ThinkPad-L470:~/py-meres$ python3 -V +Python 3.8.5 +(py-meres) czentye@ThinkPad-L470:~/py-meres$ +``` + +FONTOS! ImportĂĄlĂĄsi hibĂĄk elkerĂźlĂŠsĂŠre figyeljĂźnk a kĂśvetkezĹkre: + +- VirtuĂĄlis kĂśrnyezetben tevĂŠkenykedĂŠshez ne felejtsĂźk el aktivĂĄlni a kĂśrnyezetet! +- KĂźlsĹ Python csomag virtuĂĄlis kĂśrnyezetbe telepĂtĂŠsĂŠnĂŠl ne hasznĂĄljunk rendszeradmin jogosultsĂĄgot, mert a csomag +abban az esetben a globĂĄlis Python csomagok kĂśzĂŠ telepĂtĹdik, amelyek alapĂŠrtelmezetten nem linkelĹdnek a virtuĂĄlis +kĂśrnyezetĂźnkbe! TehĂĄt `$` ~~sudo~~ `pip3 install ...` +- Python szkriptet (amit virtuĂĄlis kĂśrnyezetben futtatunk) ne a szokvĂĄnyos `#!/usr/bin/python3` shebang sorral kezdjĂźk, +hanem a rugalmasabb ĂŠs esetĂźnkben fontos `#!/usr/bin/env python3` sorral. Ez elĹbbi esetben ugyanis kĂśzvetlenĂźl a +globĂĄlis Python interpretert jelĂśljĂźk ki, ami nem lĂĄthatja a virtuĂĄlis kĂśrnyezetbe telepĂtett csomagjainkat. Az utĂłbbi +sorral az env programot hĂvjuk meg, ami jelen esetĂźnkben mĂĄr a virtuĂĄis kĂśrnyezetbe linkelt Python interpretert fogja +meghĂvni. ErrĹl magunk is megbizonyosodhatunk, ha meghĂvjuk a `$ which python3` parancsot, ami a virtuĂĄlis kĂśrnyezeten +kĂvĂźl a `/usr/bin/python3` Ăştvonalat, mĂg aktivĂĄlĂĄs utĂĄn a `/home/user/py-meres/bin/python3` Ăştvonalat adja vissza. + +## 1.a Feladat - InteraktĂv mĂłd + +IndĂtsuk el az interpretert a `$ python3` paranccsal. Az interpreter ĂŠrvĂŠnyes Python kifejezĂŠseket vĂĄr, amelyeket +megadĂĄs utĂĄn azonnal feldolgoz ĂŠs az eredmĂŠnyt (minden Python kifejezĂŠsnek van eredmĂŠnye!) kiĂrja a konzolra. +InterpreterbĹl kilĂŠpĂŠshez hasznĂĄlhatĂł az `exit()` fĂźggvĂŠnyhĂvĂĄst, vagy a kĂŠnyelmesebb **CTRL + D** billenytĹąkombinĂĄciĂłt +(EOT - end-of-transmission karakter). + +**Feladat:** A Python nyelv gyakran hasznĂĄlt tudomĂĄnyos ĂŠs matematika algoritmusok implementĂĄlĂĄsĂĄra. Ărassuk ki +mĂŠrfĂśldben 3 tizedes jegy pontossĂĄggal egy fĂŠlmaraton hosszĂĄt az interpreter segĂtsĂŠgĂŠvel! + +- Az arĂĄnyossĂĄgi adatokat tĂĄroljuk vĂĄltozĂłkban: fĂŠlmaratoni tĂĄv - 21097,5 m; 1 mĂŠrfĂśld - 1,6093 km +- LebegĹpontos tĂpusnĂĄl tizedes pontot hasznĂĄljunk (`3.14` ĂŠs nem `3,14`)! +- KĂŠplet: (tĂĄv(m) / 1000 ) / arĂĄny (km/mil) +- KiĂratĂĄsra hasznĂĄljuk a print() fĂźggvĂŠnyt ĂŠs sztring formĂĄzĂĄshoz a `format()` fĂźggvĂŠnyt (float tĂpus `-f` karakter, +formĂĄtum (link) a segĂŠdletben) + +**ĂrdekessĂŠg:** FigyeljĂźk meg a lebegĹ pontos ĂŠrtĂŠkek kerekĂtĂŠsi tulajdonsĂĄgĂĄt az eredeti ĂŠs a 3 tizedes pontossĂĄgal +kiĂrt eredmĂŠnyen! +([Floating Point Arithmetic: Issues and Limitations](https://docs.python.org/3.5/tutorial/floatingpoint.html)) + +## 1.b Feladat - KĂźlsĹ modul hasznĂĄlata + +**Feladat:** Ărassuk ki a *google.com* (nem kell a *www* elĂŠ!) tartomĂĄnynĂŠvhez rendelt levelezĹ szervereket (MX rekord)! + +A DNS rekordok kezelĂŠsĂŠhez hasznĂĄljuk a `dnspython` csomagot. A csomagot a `$ pip3 install dnspython` paranccsal tudjuk +telepĂteni. A DNS rekord lekĂŠrĂŠsĂŠhez hasznĂĄljuk a `dns.resolver` csomag `query()` fĂźggvĂŠnyĂŠt. + +- HasznĂĄlat elĹtt ne felejtsĂźk el importĂĄlni a szĂźksĂŠges csomagot! +- DokumentĂĄciĂł megtekintĂŠsĂŠhez hasznĂĄljuk a `help()` beĂŠpĂtett fĂźggvĂŠnyt. NĂŠzzĂźk meg mind a csomag, mind a fĂźggvĂŠny +dokumentĂĄciĂłjĂĄt! +- A lekĂŠrĂŠsnĂŠl rekord tĂpusnak adjuk meg az `'MX'` stringet! +- A `query()` visszatĂŠrĂŠsi ĂŠrtĂŠke a `dnspython` csomag egy speciĂĄlis objektuma (ami a `dns.resolver.Answer` osztĂĄly egy +pĂŠldĂĄnya), ami egyben iterĂĄlhatĂł is. A bejegyzĂŠsek kiĂratĂĄsĂĄhoz jĂĄrjuk be az objektumot a megfelelĹ nyelvi elemmel! Ne +felejtsĂźk el a behĂşzĂĄst a kĂłdblokk esetĂŠn! + +## 1.c Feladat - SajĂĄt DNS modul + +**Feladat:** Hosszabb kĂłdok esetĂŠn az interaktĂv interpreter hasznĂĄlata kĂśrĂźlmĂŠnyes. Ărjunk Python modult `dns_tool.py` +nĂŠven az elĹzĹ feladatban megvalĂłsĂtott funkciĂłhoz! + +- [dns_tool1.py.txt](https://qosip.tmit.bme.hu/foswiki/pub/Meres/PythonFeladatok/dns_tool1.py.txt): Skeleton szkript az +1. feladathoz - NevezzĂźk ĂĄt a fĂĄjlt! + +- A rekordok lekĂŠrĂŠsĂŠt egy kĂźlĂśn fĂźggvĂŠnyben (`get_mx()`) definiĂĄljuk, amely a DNS nevet egy paramĂŠterkĂŠnt kapja meg ĂŠs +az eredmĂŠnyeket egy nagy listĂĄba csomagolva adja vissza. +- Adjunk minimĂĄlis dokumentĂĄciĂłt a fĂźggvĂŠnyĂźnkhĂśz! +- A rekordtĂpus opcionĂĄlisan legyen megadhatĂł a fĂźggvĂŠnynek (pl. kĂŠsĹbbi tovĂĄbbfejlesztĂŠshez), ami alapĂŠrtelmezetten az +`'MX'` ĂŠrtĂŠket vegye fel! +- A rekordokat egyenkĂŠnt tuple-ben adjuk vissza: (preferencia, nĂŠv) sorrendben. Az elemekhez az egy darab rekordot +reprezentĂĄlĂł objektum `preference` ĂŠs `exchange` attribĂştumĂĄn keresztĂźl fĂŠrhetĂźnk hozzĂĄ. A visszaadott struktĂşra tehĂĄt a +kĂśvetkezĹ formĂĄtumĂş: `[(pref1, exch1), (pref2, exch2), ...]` +- A rekord attribĂştumokat mindenkĂŠppen konvertĂĄljuk string tĂpusĂşvĂĄ! +- HiĂĄnyzĂł vĂĄlasz vagy nem lĂŠtezĹ rekord esetĂŠn a `query()` fĂźggvĂŠny kivĂŠtelt dob, amelyek a `dns.exception.DNSException` +leszĂĄrmazottai. KezeljĂźk valamilyen mĂłdon a kivĂŠtelt (akĂĄr minden kivĂŠtel elkapĂĄsĂĄval) ĂŠs ekkor egyszerĹąen tĂŠrjĂźnk +vissza egy Ăźres tuple-lal! +- TeszteljĂźk a most megĂrt modulunkat interaktĂv mĂłdon (indĂtsunk egy Python interpretert, importĂĄljuk be ĂŠs hĂvjuk meg +a fĂźggvĂŠnyt) ĂŠs nĂŠzzĂźk meg a modul/fĂźggvĂŠny dokumentĂĄciĂłkat is a `help()` fĂźggvĂŠnnyel! + diff --git a/dns_tool.py b/dns_tool.py new file mode 100644 index 0000000000000000000000000000000000000000..e7e798474b462a60cef1251d8e906f15d715fd5a --- /dev/null +++ b/dns_tool.py @@ -0,0 +1,19 @@ +from dns.resolver import query +from dns.exception import DNSException + + +# input: dns name and optional the type of the record and return all the answered data in a list or in case of exception +# an empty list +def get_mx(dns_name, type="MX"): + try: + answers = query(dns_name, type) + except DNSException: + return [] + ret = [] + for a in answers: + element = (str(a.preference), str(a.exchange)) + ret.append(element) + + return ret + + diff --git a/dns_tool2.py b/dns_tool2.py new file mode 100755 index 0000000000000000000000000000000000000000..814f738b164f79acfb49126e6b35200ad213066a --- /dev/null +++ b/dns_tool2.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 + +from dns.resolver import query +from dns.exception import DNSException + + +# input: dns name and optional the type of the record and return all the answered data in a list or in case of exception +# an empty list +def get_mx(dns_name, type="MX"): + try: + answers = query(dns_name, type) + except DNSException: + return [] + ret = [] + for a in answers: + element = (str(a.preference), str(a.exchange)) + ret.append(element) + + return ret + + +if __name__ == "__main__": + inp = input("Add meg a lekĂŠrdezendĹ domain-t, valamint ha szeretnĂŠd specifikĂĄlni, a rekord tĂpusĂĄt is szĂłkĂśzzel " + "elvĂĄlasztva (az alapĂŠrtelmezett rekord tĂpus az MX): ") + inp = inp.split(" ") + if len(inp) >= 2: + list = get_mx(inp[0], inp[1]) + for e in list: + print(e) + else: + list = get_mx(inp[0]) + for e in list: + print(e) + diff --git a/main.py b/main.py deleted file mode 100644 index 5596b44786f04e4810aefe9f8d712f08ed310f71..0000000000000000000000000000000000000000 --- a/main.py +++ /dev/null @@ -1,16 +0,0 @@ -# This is a sample Python script. - -# Press Shift+F10 to execute it or replace it with your code. -# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings. - - -def print_hi(name): - # Use a breakpoint in the code line below to debug your script. - print(f'Hi, {name}') # Press Ctrl+F8 to toggle the breakpoint. - - -# Press the green button in the gutter to run the script. -if __name__ == '__main__': - print_hi('PyCharm') - -# See PyCharm help at https://www.jetbrains.com/help/pycharm/ diff --git a/solutions/1_feladat.md b/solutions/1_feladat.md new file mode 100644 index 0000000000000000000000000000000000000000..3b4e8abd9c916b389a99e4a897b61e6eaed40b68 --- /dev/null +++ b/solutions/1_feladat.md @@ -0,0 +1,75 @@ +# 1. feladat + +## 1.a interaktĂv mĂłd + +A Python nyelv gyakran hasznĂĄlt tudomĂĄnyos ĂŠs matematika algoritmusok implementĂĄlĂĄsĂĄra. Ărassuk ki mĂŠrfĂśldben 3 tizedes jegy pontossĂĄggal egy fĂŠlmaraton hosszĂĄt az interpreter segĂtsĂŠgĂŠvel! + +MegoldĂĄs: + +```bash +$ python3 +>>> dist = 21097.5 +>>> dist +21097.5 +>>> mile = 1.6093 +>>> mile +1.6093 +>>> dist_in_miles = (dist / 1000) / mile +>>> dist_in_miles +13.109737152799354 +>>> print("Distance of a half maraton in miles is: {:.3f}".format(dist_in_miles)) +Distance of a half maraton in miles is: 13.110 +``` + +## 1.b Feladat - KĂźlsĹ modul hasznĂĄlata + +**Feladat:** Ărassuk ki a *google.com* (nem kell a *www* elĂŠ!) tartomĂĄnynĂŠvhez rendelt levelezĹ szervereket (MX rekord)! + +MegoldĂĄs: + +```bash +$ python3 +>>> import dns.resolver +>>> answers = dns.resolver.query('google.com', 'MX') +<stdin>:1: DeprecationWarning: please use dns.resolver.resolve() instead +>>> for rdata in answers: +... print('Host', rdata.exchange, 'has preference', rdata.preference +... +Host aspmx.l.google.com. has preference 10 +Host alt3.aspmx.l.google.com. has preference 40 +Host alt4.aspmx.l.google.com. has preference 50 +Host alt1.aspmx.l.google.com. has preference 20 +Host alt2.aspmx.l.google.com. has preference 30 +``` + +## 1.c Feladat - SajĂĄt DNS modul + +**Feladat:** Hosszabb kĂłdok esetĂŠn az interaktĂv interpreter hasznĂĄlata kĂśrĂźlmĂŠnyes. Ărjunk Python modult `dns_tool.py` +nĂŠven az elĹzĹ feladatban megvalĂłsĂtott funkciĂłhoz! + +```bash +$ python3 +>>> import dns_tool +>>> help() +help> dns_tool.get_mx +Help on function get_mx in dns_tool: + +dns_tool.get_mx = get_mx(dns_name, type='MX') + # input: dns name and optional the type of the record and return all the answered data in a list or in case of exception + # an empty list +>>> list = dns_tool.get_mx('google.com') +>>> for e in list: +... print(e) +... +('40', 'alt3.aspmx.l.google.com.') +('20', 'alt1.aspmx.l.google.com.') +('50', 'alt4.aspmx.l.google.com.') +('10', 'aspmx.l.google.com.') +('30', 'alt2.aspmx.l.google.com.') +>>> +>>> list = dns_tool.get_mx('nemletezik.asd') +>>> for e in list: +... print(e) +... +>>> +``` \ No newline at end of file