Dziś poznamy m. in moduły wbudowane i nauczymy się z nich importować ich zawartość oraz dalej będziemy poznawać podstawy Pythona.
Moduły wbudowane to tak samo jak wbudowane funkcje, zbiór pewnych modułów, których nie musimy w żaden sposób instalować, są częścią Pythona i mają nam ułatwić jakieś czynności. Musimy je natomiast zaimportować
Import modułów wbudowanych – random
Istnieje kilka sposobów na używanie wbudowanych modułów. Rzućmy okiem na poniższy kod
import random
lst = ["Hi", "Hello", "Whats up?"]
msg = random.choice(lst)
print(msg)
Importujemy moduł random, który posiada funkcję choice. Pozwala ona wybrać losowo element listy. Odnosimy się do tego modułu po jego nazwie, następnie kropka i nazwa funkcji. Ten kod wybiera nam losowy element listy i go wyświetla.
Możemy oczywiście nadać jakiś alias naszemu modułowi
import random as r
lst = ["Hi", "Hello", "Whats up?"]
msg = r.choice(lst)
print(msg)
Tutaj nazwaliśmy go sobie r i tak się do niego odnosimy. Ale możemy też zaimportować tylko i wyłącznie jedną funkcję z tego modułu i wtedy nie musimy jej w żaden sposób poprzedzać nazwą modułu:
from random import choice
lst = ["Hi", "Hello", "Whats up?"]
msg = choice(lst)
print(msg)
Oczywiście takie coś może być problematyczne. Nie tylko psuje się czytelność, używamy (tutaj akurat w linijce 3 ale mogłaby to być linijka 300) jakiejś funkcji nie wiadomo do końca skąd. Przede wszystkim jednak, takie coś może doprowadzić do tego, że dwie jednakowo nazywające się funkcje wystąpią w naszym kodzie. I jedna „przesłoni” drugą. Tutaj akurat przynajmniej wiemy co importujemy, więc ryzyko na dwie funkcje choice w jednym skrypcie są minimalne, ale w Pythonie możemy też zrobić coś takiego:
from random import *
lst = ["Hi", "Hello", "Whats up?"]
msg = choice(lst)
print(msg)
shuffle(lst)
print(lst)
Taki kod zaimportował nam wszystkie funkcje z modułu random. M.in funkcję choice, która wybiera jeden losowy element z listy, ale także funkcję shuffle, która „tasuje” losowo listę niczym karty, już w takim kodzie czytelność zaczyna cierpieć, nie bardzo wiadomo skąd to shuffle się wzięło, a jeszcze dodajmy do tego, że importujemy sami nie wiemy ile funkcji. Ryzyko, że w naszym kodzie znajdą się dwie tak samo nazwane funkcje i jedna przysłoni drugą rośnie. Dlatego tak nie importujemy, tylko w ten sposób:
import random
lst = ["Hi", "Hello", "Whats up?"]
msg = random.choice(lst)
print(msg)
random.shuffle(lst)
print(lst)
Tak jest najlepiej.
Używanie modułu random
Poznaliśmy już funkcję choice, która wybiera losowy element z listy, oraz funkcję shuffle, która „tasuje” listę. Oto kilka innych funkcji wartych uwagi:
import random
dice_roll = random.randint(1,6)
print(dice_roll)
Tutaj symulujemy rzut kostką. Funkcja randint losuję liczbę w zakresie od 1 do 6 (włącznie). Mamy też funkcję randrange:
import random
dice_roll = random.randrange(1,7)
print(dice_roll)
Randrange w takiej postaci losuje nam od 1 do 7 (bez 7). Taka jest różnica między nimi. Jest jeszcze jedna funkcja:
import random
number = random.random()
print(number)
#0.4197031427035489
Funkcja random.random() losuje nam liczbę od 0 do 1 w takiej postaci.
Zadanie 1 – wygeneruj rgb
W CSS (element tworzenia stron internetowych) używa się notacji do zapisu kolorów w postaci rgb. Wygląda to tak: rgb(red, green, blue). W miejsce red, green i blue mamy liczbę od 0 do 255 oznaczającą ilość czerwonego, zielonego i niebieskiego. W ten sposób mamy zapisany kolor.
Napiszmy funkcję, która generuje nam kolor w takiej postaci. Zaczniemy od wygenerowania trzech losowych liczb od 0 do 255 (włącznie). Pomoże nam moduł random
import random
def get_rgb():
red = random.randint(0,255)
green = random.randint(0,255)
blue = random.randint(0,255)
return red, green, blue
print(get_rgb())
#(49, 139, 7)
Troszkę się tutaj dzieje. Trzy razy generujemy losową liczbę w zakresie od 0 do 255 włącznie, korzystając z modułu random. Zwracamy 3 wartości na raz (w Pythonie jest to możliwe). Dostajemy dziwny typ danych z trzema losowymi elementami.
Ten danych to tzw. tuple czyli po naszemu krotka (albo tupla, tak chyba też mówić możemy). Jest to rodzaj listy, która jest niemutowalna. Czyli nie można do niej dodawać ani z niej zabierać elementów. Natomiast działa tak, jak lista.
Oto mały przykład:
import random
def get_rgb():
red = random.randint(0,255)
green = random.randint(0,255)
blue = random.randint(0,255)
return red, green, blue
rgb = get_rgb()
print(rgb)
#(167, 106, 81)
print(type(rgb))
#<class 'tuple'>
print(rgb[0])
#167
print(rgb[1])
#106
print(rgb[2])
#81
Oczywiście liczby za każdym razem będą inne. Co jeszcze możemy zrobić z tuplą? Rozpakować ją, zamiast ładować całą do 1 zmiennej:
import random
def get_rgb():
red = random.randint(0,255)
green = random.randint(0,255)
blue = random.randint(0,255)
return red, green, blue
red,green,blue = get_rgb()
print(red)
print(green)
print(blue)
Tyle o tuplach. Teraz postarajmy się, aby nasza funkcja zwracała te dane w odpowiednim formacie:
import random
def get_rgb():
red = random.randint(0,255)
green = random.randint(0,255)
blue = random.randint(0,255)
return red, green, blue
def css_rgb_color():
red, green, blue = get_rgb()
return f"rgb({red}, {green}, {blue})"
color = css_rgb_color()
print(color)
#rgb(216, 157, 236)
Korzystamy z naszej funkcji get_rgb i rozpakowywujemy ją. Zwracamy w odpowiednim formacie używając f-string i interpolację. Można jeszcze się pokusić o średnik na końcu, ale już to sobie darowaliśmy – chodzi nam tylko o kolor.
Zadanie 2 – wygeneruj rgba
Rgba to zapis koloru w CSS, który jest bardzo podobny do rgb. Na początku red, green i blue w wersji liczby od 0 do 255, później zaś kanał alfa czyli liczba od 0 do 1. Zobaczmy, jak to możemy osiągnąć:
import random
def get_rgb():
red = random.randint(0,255)
green = random.randint(0,255)
blue = random.randint(0,255)
return red, green, blue
def css_rgba_color():
red, green, blue = get_rgb()
alpha = random.random()
return f"rgba({red}, {green}, {blue}, {alpha})"
color = css_rgba_color()
print(color)
#rgba(122, 82, 149, 0.7184440003019493)
No niby fajnie, random.random() generuje nam liczbę od 0 do 1, ale nikt takich długich liczb nie używa. Jedno, maksimum dwa miejsca po przecinku, jeżeli już.
Do zaokrąglenia liczby do 2 miejsc po przecinku możemy użyć funkcji round:
import random
def get_rgb():
red = random.randint(0,255)
green = random.randint(0,255)
blue = random.randint(0,255)
return red, green, blue
def css_rgba_color():
red, green, blue = get_rgb()
alpha = random.random()
alpha = round(alpha, 2)
return f"rgba({red}, {green}, {blue}, {alpha})"
color = css_rgba_color()
print(color)
#rgba(201, 59, 241, 0.23)
Zadanie 3 – wygeneruj kolor hex
W CSS mamy też kolor w hex. Jest to taki zapis, w którym mamy znak # a potem 6 znaków. Pierwsze dwa to red w zapisie szesnastkowym, drugie dwa to green w takim samym zapisie, kolejne to niebieski.
W Pythonie do konwersji na system 16 służy funkcja hex. Niestety nie działa ona tak, jakbyśmy tego chcieli:
import random
def get_rgb():
red = random.randint(0,255)
green = random.randint(0,255)
blue = random.randint(0,255)
return red, green, blue
def css_hex_color():
red, green, blue = get_rgb()
red = hex(red)
green = hex(green)
blue = hex(blue)
return f"#{red}{green}{blue}"
color = css_hex_color()
print(color)
##0xa30x8a0xf
Po pierwsze, każda liczba ma tutaj przedrostek 0x oznaczający system szesnastkowy. Po drugie, mamy mieć 6 cyfr. f to jest dosłownie 16 ale notacja ma być taka: #, dwie cyfry na red, dwie cyfry na green, dwie cyfry na blue.
Zamiast te liczby zamieniać na system szesnastkowy, możemy je wyświetlić w takim formacie. Wystarczy jako format podać :x, co oznacza wyświetl w formacie szesnastkowym:
import random
def get_rgb():
red = random.randint(0,255)
green = random.randint(0,255)
blue = random.randint(0,255)
return red, green, blue
def css_hex_color():
red, green, blue = get_rgb()
return f"#{red:x}{green:x}{blue:x}"
color = css_hex_color()
print(color)
##46c364
I tym sposobem wygenerowaliśmy losowy kolor w formacie hex, gotowy do użycia w CSS. Jeżeli zaś interesuje nas, jak ten kolor wygląda w rgb, to możemy sobie przekonwertować z systemu 16 do dziesiętnego w ten sposób:
##46c364
print(int("0x46", 16)) #70
print(int("0xc3", 16)) #195
print(int("0x64", 16)) #100
Czyli konwertujemy taki napis do typu int, podając jeszcze, że to z systemu szesnastkowego. Podać w dwóch miejscach musimy, jako przedrostek 0x przed liczbą oraz jako liczba, 2 argument.
Nieczęsto się takie rzeczy robi, ale w ten sposób możemy sprawdzić, że 46 to po naszemu 70, c3 to 195 zaś 64 to 100. Zatem „#46c364” w rgb wyglądałby tak: rgb(70, 195, 100). Taka ciekawostka.
Tym akcentem zakończmy. Poznaliśmy sposoby na importowanie modułów, moduł random i jego podstawowe, najczęściej używane funkcjonalności, nowy typ danych – tuplę/krotkę (listę, które nie można modyfikować) oraz zrobiliśmy trzy ciekawe ćwiczenia. Jeszcze o konwersje z dziesiętnego na szesnastkowy zahaczyliśmy a nawet różne formaty f-stringów.
To naprawdę dużo jak na jedną lekcję. Naukę Pythona będziemy kontynuować.