Professional Documents
Culture Documents
6.python Pakiety Moduly
6.python Pakiety Moduly
Python
Dr. Inż. Marcin Caryk
Moduły i pakiety
Wstęp
• Programowanie modułowe odnosi się do procesu dzielenia dużego, nieporęcznego zadania
programistycznego na osobne, mniejsze, łatwiejsze do zarządzania podzadania lub moduły.
• Poszczególne moduły można następnie łączyć ze sobą jak klocki, tworząc większą aplikację.
module.py main_module.py
def show_name(self):
print(self.__name)
Import
import <module_name> • Instrukcja import <nazwa_modułu> umieszcza tylko
<nazwa_modułu> w tablicy symboli wywoływanych.
import <module_name>[, <module_name> ...] • Obiekty zdefiniowane w module pozostają w prywatnej tablicy
symboli modułu.
import module • Z poziomu wywołującego obiekty w module są dostępne tylko
print(dir(module)) wtedy, gdy są poprzedzone <nazwą_modułu> w notacji
print(module.my_text) kropkowej, jak pokazano poniżej.
from <module_name> import <name(s)> • Ta forma instrukcji import pozwala na import poszczególnych
obiektów z modułu bezpośrednio do tablicy symboli
from module import my_text, list_pi wywoływanych.
print(my_text, list_pi) • Po wykonaniu powyższej instrukcji, w środowisku wywołującym
można odwoływać się do <nazwy> bez prefiksu
<nazwa_modułu>
• Ponieważ ta forma importu umieszcza nazwy obiektów
bezpośrednio w tabeli symboli wywoływanych, wszelkie
istniejące już obiekty o tej samej nazwie zostaną nadpisane
Import
from <module_name> import * • Możliwe jest nawet masowe importowanie wszystkiego z
modułu za jednym zamachem
from module import * • Spowoduje to umieszczenie nazw wszystkich obiektów z
print(list_pi) <nazwa_modułu> w lokalnej tablicy symboli, z wyjątkiem tych,
print(add_two_numbers(5, 6)) które zaczynają się od znaku podkreślenia (_)
• Niekoniecznie jest to zalecane w przypadku kodu
produkcyjnego na dużą skalę. Jest to trochę niebezpieczne,
ponieważ masowo wprowadzasz nazwy do lokalnej tablicy
from <module_name> import <name> as symboli.
<alt_name> • Może powodować nadpisywanie modułów co będzie
prowadziło do konfliktów
from module import my_text as t • Możliwe jest również importowanie pojedynczych obiektów, ale
from module import add_two_numbers as a2 wprowadzanie ich do lokalnej tablicy symboli z alternatywnymi
print(t) nazwami
print(a2(1,2))
• Umożliwia to umieszczanie nazw bezpośrednio w lokalnej
tablicy symboli, ale pozwala uniknąć konfliktów z wcześniej
istniejącymi nazwami
Import
import <module_name> as <alt_name> • Można także zaimportować cały moduł pod alternatywną
nazwą
import module as m • Zawartość modułu można importować z definicji funkcji. W
print(m.my_text) takim przypadku import nie nastąpi do momentu wywołania
print(m.list_pi) funkcji
Wbudowana zmienna __name__
• __name__ jest wbudowaną zmienną która odnosi się do nazwy obecnego modułu.
• Pozwala też definiować czy dany skrypt jest użyty jako importowany moduł przez inny skrypt albo jako samodzielny skrypt.
• Kiedy plik .py jest importowany jako moduł, Python ustawia specjalną zmienną dunder __name__ na nazwę modułu.
• Jeśli jednak plik jest uruchamiany jako samodzielny skrypt, __name__ jest ustawiane na ciąg „__main__”.
mod1.py mod2.py
import mod2 as md def check_test(test_name):
print(__name__) __main__ print("{} - {} checked".format(__name__, test_name))
print(md.__name__) mod2
def run_test(test):
test = "Small_test" mod2 - Small_test checked print("{} - Runing the {}".format(__name__, test))
print("{} - {}.....OK".format(__name__, test))
md.check_test(test) mod2 - Runing the Small_test
md.run_test(test) mod2 - Small_test.....OK
def main(test):
check_test(test)
run_test(test) __main__ - SuperTest checked
if __name__ == '__main__':
__main__ - Runing the SuperTest
main("SuperTest") __main__ - SuperTest.....OK
Pakiety
• Pakiety umożliwiają hierarchiczną strukturę przestrzeni nazw modułu przy użyciu notacji kropkowej.
• W ten sam sposób, w jaki moduły pomagają unikać kolizji między nazwami zmiennych globalnych, pakiety pomagają unikać
kolizji między nazwami modułów.
• Tworzenie pakietu jest dość proste, ponieważ wykorzystuje wrodzoną hierarchiczną strukturę plików systemu
operacyjnego.
• Jeśli katalog pkg znajduje się w lokalizacji, w której można go znaleźć (w jednym z katalogów zawartych w sys.path), można
odwołać się do dwóch modułów z notacją kropkową (pkg.mod1, pkg.mod2) i zaimportuj je ze składnią import
import <package_name>
from <package_name> import <modules_name>[, <module_name> ...]
from <package_name> import <module_name> as <alt_name>
Pakiety
main_pkg.py
main_pkg1.py
import pkg1
print(pkg1.some_list)
__init__.py
print(f'Invoking __init__.py for {__name__}')
some_list = ["mod1", "mod2"]
Inicjalizacja pakietu
mod1.py mod3.py
def func_example1(): def func_example3():
print("This is function func_example1") print("This is function func_example3")
mod2.py mod4.py
def func_example2(): def func_example4():
print("This is function func_example2") print("This is function func_example4")
main_pkg1.py
__init__.py from pkg1.mod1 import *
print(dir())
__all__ = ['mod1', 'mod2']
from pkg1 import *
print(dir())
• Python postępuje zgodnie z następującą konwencją: jeśli plik __init__.py w katalogu pakietu zawiera listę o
nazwie __all__, przyjmuje się, że jest to lista modułów, które powinny zostać zaimportowane w przypadku
napotkania instrukcji z <nazwa_pakietu> import *.
Inicjalizacja pakietu i subpakietu
subpackage/__init__.py
from .mod3 import func_example3, ClsExample3
from .mod4 import func_example4, ClsExample4
__init__.py
from .subpackage import *
main_pkg1.py
from .mod1 import func_example1, ClsExample1
from pkg1 import * from .mod2 import func_example2, ClsExample2
print(dir())
func_example1() __all__ = ['func_example1',
func_example2() 'func_example2',
func_example3() 'func_example3',
func_example4() 'func_example4',
c1 = ClsExample1() 'ClsExample1',
c2 = ClsExample2() 'ClsExample2',
c3 = ClsExample3() 'ClsExample3',
c4 = ClsExample4() 'ClsExample4']
Wbudowane pakiety pythona
Wbudowane moduły python
. https://docs.python.org/3/py-modindex.html
.
.
Moduł os
• Moduł OS w Pythonie zapewnia funkcje interakcji z systemem operacyjnym.
• System operacyjny należy do standardowych modułów narzędziowych Pythona.
• Moduł ten zapewnia przenośny sposób korzystania z funkcjonalności zależnych od systemu operacyjnego.
• Moduły os i os.path zawierają wiele funkcji umożliwiających interakcję z systemem plików.
• Oprócz operacji na plikach i katalogach moduł os umożliwia uzyskać informacje o systemie operacyjnym,
zarządzać procesami, operować na strumieniach we/wy przy użyciu deskryptorów plików.
• Uzyskujemy to poprzez import os
Moduł os
sprawdzanie czy katalog
rodzaj systemuname tworzenie katalogów mkdir istnieje path.exists
import os import os import os
timestamp = time.time()
print("Timestamp:", timestamp)
d = date.fromtimestamp(timestamp)
print("Date:", d)
Moduł datetime
• Moduł datetime udostępnia kilka metod tworzenia obiektu daty. Jedną z nich jest metoda fromisoformat,
która przyjmuje datę w formacie RRRR-MM-DD zgodnym z normą ISO 8601.
• Norma ISO 8601 określa sposób przedstawiania daty i godziny. Jest często używany, dlatego warto poświęcić
chwilę na zapoznanie się z nim.
d = date.fromisoformat('2019-11-04')
print(d)
• Czasami może być konieczne zastąpienie roku, miesiąca lub dnia inną wartością. Nie można tego zrobić w
przypadku atrybutów roku, miesiąca i dnia, ponieważ są one tylko do odczytu.
• W takim przypadku możesz użyć metody o nazwie replace.
from datetime import date
d = date(1991, 2, 5)
print(d)
student = Student()
student.take_nap(5)
Moduł datetime
import time
• Moduł time udostępnia funkcję o nazwie ctime, która konwertuje czas w
timestamp = 1572879180
sekundach od 1 stycznia 1970 r. (epoka Uniksa) na ciąg znaków. print(time.ctime(timestamp))
• Część funkcji dostępnych w module time wymaga znajomości klasy struct_time. import time
• Klasa struct_time umożliwia także dostęp do wartości za pomocą indeksów.
Indeks 0 zwraca wartość w tm_year, natomiast 8 zwraca wartość w tm_isdst timestamp = 1572879180
• Wyjątkami są tm_zone i tm_gmoff, do których nie można uzyskać dostępu za print(time.gmtime(timestamp))
print(time.localtime(timestamp))
pomocą indeksów.
• Moduł time posiada funkcje oczekujące obiektu struct_time lub krotki
przechowującej wartości zgodnie z indeksami przedstawionymi
podczas omawiania klasy struct_time.
• Pierwsza z funkcji, zwana asctime, konwertuje obiekt struct_time lub
timestamp = 1572879180
krotkę na ciąg znaków. Zauważ, że do pobrania obiektu struct_time st = time.gmtime(timestamp)
używana jest znana funkcja gmtime. Jeśli nie podasz argumentu
funkcji asctime, zostanie użyty czas zwrócony przez funkcję localtime print(time.asctime(st))
• Druga funkcja o nazwie mktime konwertuje obiekt struct_time lub print(time.mktime((2019, 11, 4, 14, 53, 0, 0, 308, 0)))
krotkę wyrażającą czas lokalny na liczbę sekund od epoki Uniksa. W
naszym przykładzie przekazaliśmy do niego krotkę
Moduł datetime
• W module datetime data i godzina mogą być reprezentowane from datetime import datetime
jako oddzielne obiekty lub jako jeden. dt = datetime(2019, 11, 4, 14, 53)
• Klasa łącząca datę i godzinę nazywa się datetime.
print("Datetime:", dt)
print("Date:", dt.date())
print("Time:", dt.time())
• Klasa datetime ma kilka metod zwracających bieżącą datę i
godzinę. Metody te to:
• today() — zwraca bieżącą lokalną datę i godzinę z atrybutem
tzinfo ustawionym na None;
• now() — zwraca bieżącą lokalną datę i godzinę taką samą jak
from datetime import datetime
metoda Today, chyba że przekażemy jej opcjonalny
argument tz. Argument tej metody musi być obiektem print("today:", datetime.today())
podklasy tzinfo; print("now:", datetime.now())
Moduł datetime
from datetime import datetime • Wyliczanie znacznik czasu na podstawie podanej daty i godziny jest to
dt = datetime(2020, 10, 4, 14, 55)
możliwe dzięki metodzie timestamp udostępnianej przez klasę datetime.
print("Timestamp:", dt.timestamp())
c = calendar.Calendar(calendar.SUNDAY) c = calendar.Calendar()
import calendar
c = calendar.Calendar()
import random
• losowanie wartości z określonego zakresu o określonym skoku
v = random.random() randrange
print(f"Random value between 0.0 and 1.0 = {v}") import random
• mieszanie wartości w liście shuffle print(f"Random value form range 1 - 10 (step 1) = {random.randrange(1, 10)}")
print(f"Random value form range 1 - 10 (step 2) = {random.randrange(1, 10, 2)}")
import random print(f"Random value form range 0 - 101 (step 10) = {random.randrange(0, 101, 10)}")
sample_list = [1, 2, 3, 4, 5]
random.shuffle(sample_list)
print(f"After the first shuffle : {sample_list}")
random.shuffle(sample_list)
print(f"After the second shuffle : {sample_list}")
Moduł Random przykłady
• Generowanie hasła
import random
import string
number_of_characters = 8
characters = string.ascii_letters + string.digits + string.punctuation
• Losowanie słownika ze studentami
password = ''.join(random.choice(characters) for i in range(number_of_characters))
print("Random password is:", password)
import random
ShuffledStudentDict = dict()
for key in keys:
ShuffledStudentDict.update({key: student_dict[key]})
Zasady:
Nic – pięć nie tworzących żadnego układu oczek.
Para – dwie kości o tej samej liczbie oczek.
Dwie Pary – dwie pary kości, o tej samej liczbie oczek.
Wygrana
Trójka – trzy kości o tej samej liczbie oczek.
Mały Strit – kości pokazujące wartości od 1 do 5, po kolei.
Duży Strit – kości pokazujące wartości od 2 do 6, po kolei.
Full – jedna para i trójka.
Kareta – cztery kości o tej samej liczbie oczek.
Poker – pięć kości o tej samej liczbie oczek.
Moduł math
Stałe math
math.e Zwraca liczbę Eulera (2,7182...)
math.inf Zwraca zmiennoprzecinkową dodatnią nieskończoność
math.nan Zwraca zmiennoprzecinkową wartość NaN (nie liczbę).
math.pi Zwraca PI (3.1415...)math.tau Zwraca tau (6.2831...)
Funkcje math
math.ceil() Zaokrągla liczbę w górę do najbliższej liczby całkowitej
math.cos() Zwraca cosinus liczby
math.floor() Zaokrągla liczbę w dół do najbliższej liczby całkowitej
math.exp() Zwraca E podniesione do potęgi x
math.log() Zwraca logarytm naturalny liczby lub logarytm liczby o podstawie
math.pow() Zwraca wartość x do potęgi y
math.sin() Zwraca sinus liczby
math.fabs() Zwraca wartość bezwzględną liczby
math.sqrt() Zwraca pierwiastek kwadratowy z liczby
math.radians() Konwertuje wartość w stopniach na radiany
math.degrees() Konwertuje kąt z radianów na stopnie