Skip to content
Snippets Groups Projects
Verified Commit fadebdfa authored by Réthelyi Bálint's avatar Réthelyi Bálint :no_mouth:
Browse files

elso feladat

parent 055c70ad
No related branches found
No related tags found
No related merge requests found
README.md 0 → 100644
# 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!
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
#!/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)
# 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/
# 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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment