Ugrás a lényegre

Modulok

the Cake is a lie 🎂

TL;DR Tartalom
Extra feladatok

Ezek nem kötelező feladatok, csak megoldásuk közben könyebb megtanulni a dolgokat

  • Készíts egy fájlt, melyben az eddig megírt függvényeid összegyüjtöd
  • Importáld be egy másik fájlba és kezd el használni. Keletkezik valami új fájl?
  • Írj egy szkriptet, ami az argumentumban kapott IP cím és hálózati maszk párosról megmondja, hogy milyen hálózatban van, továbbá, hogy mi a Broadcast címe.
    (Tipp: Előzőleg írtál egy hasonló funkciót már)

Fájl és enkódolás

Miután kilépsz az Interpreterből tapasztalhatod, hogy elvesznek a módosításaid mikor újra belépsz. Továbbá az is feltünhetett, hogy egy valamivel bonyolultabb programot nehéz lenne csak az interpreterben megírni.

Erre megoldás, hogy egy fájlba írjuk meg a kódunkat, majd pedig később azt fordítja le az interpreter.

Ezeket a fájlokat a python alapértelmezette UTF-8 fogja értelmezni. (python 2-ben ASCII volt az alap) Ezt akár definiálhatjuk is ha a fájl elejére írjuk, hogy
# coding=<Kódolás>
# coding=UTF-8

Egy modul egy fájl, melyben Python definíciók és utasítások találhatóak. Ezeknek a kiterjesztése .py

Hozz létre egy fájlt fibo.py néven a kedvenc szövegszerkesztődben.

# Fibonacci számokért felelős modul

def fib(n): # Fibonacci kiírása n-ig
a, b = 0, 1
while a < n:
print(a, end=' ')
a, b = b, a+b
print()

def fib2(n): # Fibonacci-k listája n-ig
result = []
a, b = 0, 1
while a < n:
result.append(a)
a, b = b, a+b
return result

Az itt definiált függvényeket később más fájlokból is elérjük.

Importálás

Akár az interpreterünkbe is tudjuk használni a definiált függvényeink.

>>> import fibo
>>> fibo.fib(1000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2(100)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__ # modul neve
'fibo'

Akár egy lokális változóhoz is rendelhetjük egy modul függvényét / változóját.

>>> fib = fibo.fib
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

Többféleképp is importálhatunk.

Ha csak pár függvényt szeretnénk:

>>> from fibo import fib, fib2
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

Ha az összes függvényt:

>>> from fibo import *
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

Ha átszeretnénk nevezni:

>>> import fibo as fib
>>> fib.fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

De akár ötvözhetjük az eddigieket is:

>>> from fibo import fib as fibonacci
>>> fibonacci(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

Szkriptként indítás

Akár el is tudunk egy modult önállóan indítani.

$ python3 fajl_neve.py <argumentumok>

Például nálam van egy ilyen fájl:

print("Első fájlba írt Python kódom")
py_szoveg = "Python"

for betu in reversed(py_szoveg):
print(betu)

if __name__ == '__main__':
print("main")

Ha ezt futtatom:

Első fájlba írt Python kódom
n
o
h
t
y
P
main

A modul neve __main__-re változott. Így akár tudjuk ellenőrizni, hogy tényleg az adott fájlt indítottuk-e és csak akkor lefuttatni a programot.

if __name__ == "__main__":
import sys
fib(int(sys.argv[1]))

Ilyenkor a python nem fogja feldolgozni 1-1 importáláskor a feltételben lévő dolgokat, mivel nem azt indítottuk. Ezt tudjuk is ellenőrizni egy interpreterben. Próbáld ki if-el és a nélkül.

>>> import fibo

Láthattuk ennél a kódnál, hogy a sys nevű modult beimportáltuk, majd az argv tömbből lekértük az első elemet. Ez valójában a kapott argumentumokat jelenti a függvény meghívásakor.

$ python fibo.py 50
0 1 1 2 3 5 8 13 21 34

Az importált modulokat a python folyamatosan cacheli a __pycache__ nevű mappában. Importáld be a fibo.py fájlodat egy másik fájlba és nézd meg mi történik.

The Cake: 🍔