Pętle
Instrukcje, które pozwalają wielokrotnie powtórzyć fragment programu nazywają się iteracjami lub pętlami.
Pętle for…
#aby wyświetlić sekwencję liczb w kolejności, możemy skorzystać z funkcji range()
#range() tworzy sekwencję liczb od 0 do podanej liczby
print(f"Sekwencja od 0 do 9:")
for i in range(10):
print(i, end=",")
print(f"\nSekwencja od 5 do 9:")
for i in range(5,10):
print(i, end=",")
#można rozszerzyć zakres o "skok"
print(f"\nSekwencja od 1 do 10 ze skokiem o 2:")
for i in range(1, 11, 2):
print(i, end=",")
print()
Zastosowanie pętli for do przeglądania list
lista = ["element1", 10, 22.4, [1,2,3]]
for element in lista:
print("Element listy:",element)
Zastosowanie pętli for do przeglądania tuple
foods = ('Pizza', 'Burgers', 'Kebab')
for food in foods:
print("Food is:",food)
#pamiętamy, że tuple nie zmienimy
Zastosowanie pętli for do przeglądania danych wprowadzonych przez użytkownika
menu = ['Pizza', 'Burger', 'Fish']
for food in menu:
if food=='Pizza':
pizza_type = input("What kind of pizza do you want?") #np. bambola
size = input("What size pizza would you like?") #np. large
print(f"You ordered a {size} {pizza_type} pizza")
Zastosowanie pętli for w łańcuchach znaków
word = "Uwielbiam Python!"
for letter in word:
print(letter)
Zastosowanie pętli for do przeglądania słowników
osoba = {
"name" : "Kama",
"surname" : "Kaczmarek",
"mail" : "kamakaczmarek@zse-zdwola.pl"
}
for key in osoba.keys(): #wyświetli klucze
print(key)
for value in osoba.values(): #wyświetli wartości
print(value)
for key,value in osoba.items(): #wyświetli pary klucz i wartość
print(key + ":" + value)
Przykład:
users = {
"Anna" : "active",
"Jakub" : "inactive",
"Kasia" : "inactive",
"Robert" : "active",
}
print(users)
#stworzymy nowy słownik aktywnych użytkowników na bazie kopii
active_users = {}
for user, status in users.copy().items():
if status == "inactive":
del users[user]
else:
active_users[user] = status
print(active_users)
for i in range(3,101):
if i<100: print(i, end=", ") #oddzielamy kolejne liczby przecikami, z wyjątkiem ostatniej
else: print(i)
Przykład 2: Napisz skrypt, obliczający n! (n silnia).
n=5
s = 1
for i in range(2, n+1):
s *= i
print(f"silnia wynosi: {s}")
Przykład 3: Napisz skrypt, który za pomocą znaków * (gwiazdki) narysuje trójkąt.
#prostokątny
x = 5
for i in range(x):
print("*"*(i+1))
#równoboczny
for w in range(x+1):
for k in range(x+w+1):
if(k==x+w): print("\n")
elif k>x-w and k<x+w: print("*", end="")
else: print(" ", end="")
Przykład 4: Napisz skrypt wyświetlający ciąg Fibonacciego i wypisz wartość ostatniego elementu.
n=10
if n<=2: print(f"{n} elementem ciągu Fibonacciego jest 1")
else:
f1=0 #wartość pierwszego elementu
f2=1 #wartość drugiego elementu
for i in range(2,n+1):
fn = f1+f2
f1=f2
f2=fn
print(fn,end=", ")
print(f"\n{n} elementem ciagu Fibonacciego jest {f2}")
Pętle while…
Korzystając z pętli while musimy uważać, żeby nie pominąć warunku zatrzymania pętli. Jeżeli tego nie zrobimy, pętla będzie wykonywała się w nieskończoność.
Działanie pętli: dopóki warunek jest spełniony, wykonuj akcję i zwiększ o…
print(f"Sekwencja od 0 do 9:")
i=0 #deklarujemy wartość początkową
while i<=10: #dopóki i jest mniejsze równe 10 to wykonaj:
print(i, end=",") #wyświetl i
i+=1 #zwiększ wartość i o 1
print()
Przykład 1: Wyświetl wszystkie liczby całkowite nieujemne, mniejsze od podanej liczby.
x=10
min=0 #najmniejsza liczba nieujemna
print(f"Liczby całkowite mniejsze od {x}, to:")
while min<x:
print(min)
min+=1
Przykład 2: Napisz skrypt wyznaczający NWD (największy wspólny dzielnik).
a, b = 15, 10
msg = "Dla a={a} i b={b}"
while a!=b:
if a>b: a-=b
else: b-=a
nwd = a #lub b - obie zmienne przechowują wynik NWD(a,b)
print(f"{msg} NWD = {nwd}")
#Fibonacci
a, b = 0, 1 #multideklaracja
print("Ciąg Fibonacciego")
while a < 10:
print(a, end=' ')
a, b = b, a+b
print()
Zatrzymywanie pętli i skryptu
Działanie pętli lub skryptu możemy przerwać w dowolnej chwili lub możemy pominąć część instrukcji do wykonania:
- instrukcja break; powoduje natychmiastowe wyjście z pętli
- instrukcja continue; powoduje przeskoczenie do następnego obiegu pętli
Przerywanie działania pętli za pomocą instrukcji break;
for i in range(3,101):
text = i
if i<=9: print(text)
else: break
print("Ta instrukcja została wykonana")
Przeskok do następnej iteracji (obiegu pętli) za pomocą instrukcji continue;
for i in range(1,101):
if i%2==0: print(i, end=", ")
else: continue
Zadania do samodzielnego wykonania:
Zadanie 1: Napisz skrypt, który sprawdzi, czy podana liczba jest liczbą pierwszą.
Zadanie 2: Za pomocą pętli stwórz tabliczkę mnożenia.
Zadanie 3: Napisz skrypt, który za pomocą znaków * (gwiazdki) narysuje kwadrat.
Zadanie 4: Napisz skrypt, który po podaniu przez użytkownika promienia koła, za pomocą znaków * (gwiazdki), narysuje je.
Zadanie 5: Napisz program, który wydrukuje do konsoli 10 pierwszych liczb pierwszych rozdzielonych przecinkiem.
W rozwiązaniu użyj pętli while oraz instrukcji break.
Oczekiwany wynik:
2,3,5,7,11,13,17,19,23,29
Zadanie 6: Wykorzystując pętlę while policz ile trzeba czekać lat, aby zwrot z poniżej opisanej inwestycji co najmniej się podwoił (pod uwagę bierzemy tylko pełne okresy).
Oznaczenia:
n – liczba okresów (w latach)
pv – present value – wartość obecna
r – stopa procentowa (roczna)
fv – future value – wartość przyszła
Opis inwestycji:
pv = 1000
r = 0.04
Oczekiwany wynik:
Wartość przyszła: 2025.82 PLN. Liczba okresów: 18 lat
Zadanie 7:
Użyj algorytmu stochastycznego spadku wzdłuż gradientu do znalezienia minimum funkcji straty określonej wzorem: L(w) = w^2-4w.
Pochodna tej funkcji to dL/dw = 2*w-4
Przybliżona zasada działania algorytmu:
- Zaczynamy od punktu startowego należącego do dziedziny funkcji, weźmy:
w_0 = -1
- Określamy z góry maksymalną liczbę iteracji:
max_iters = 10000
- Określamy zmienną, która pomoże nam kontrolować rozmiar kroku w kierunku minimum, ustalmy jej wartość na 1:
previous_step_size = 1
- Określamy wskaźnik uczenia:
learning_rate = 0.01
- Określamy precyzję jaka wystarczy do znalezienia minimum:
precision = 0.000001
- Definiujemy pochodną jako funkcję:
derivative = lambda w: 2 * w – 4
Aby znaleźć minimum funkcji L należy poruszać się wzdłuż kierunku przeciwnego do kierunku wyznaczanego przez gradient funkcji L aktualizując wartość w_0 następująco:
w_0 = w_0 – learning_rate * derivative(w_prev)
gdzie w_prev jest punktem z poprzedniej iteracji. Dla pierwszego korku jest to po prostu w_0.
Zbuduj pętlę while, która pozwoli zatrzymać działanie algorytmu w momencie, gdy minimum zostanie odnalezione z zakładaną przez nas wartością precyzji lub gdy przekroczymy maksymalną liczbę iteracji.
Wskazówka:
Warunek w pętli while.
while previous_step_size > precision and iters < max_iters:
Rozmiar poprzedniego skoku:
previous_step_size=abs(w_0-w_prev)
Oczekiwany wynik:
Minimum lokalne w punkcie: 2.00
Zadanie 8: Napisz program, który sprawdzi czy podany element (target) znajduje się w posortowanej liście (numbers). Podane są:
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
target = 7
Zasada działania algorytmu:
- Ustalamy indeks startowy (start) oraz końcowy (end) oraz flagę flag = None.
- Dopóki indeks startowy jest nie większy niż indeks końcowy wybieramy środkowy indeks (mid) listy (średnia arytmetyczna indeksu startowego i końcowego -> należy pamiętać o skonwertowaniu wyniku funkcją int). Jeżeli indeks startowy jest większy niż indeks końcowy kończymy działanie algorytmu.
- Sprawdzamy czy element listy dla tak obliczonego indeksu jest naszym szukanym (target). Jeżeli tak, ustawiamy flagę flag na wartość True i kończymy działanie algorytmu. Jeżeli nie -> krok 4.
- Sprawdzamy, czy wartość elementu listy dla indeksu mid jest mniejsza niż target. Jeśli tak, to zwiększamy indeks startowy o 1. Jeśli nie, zmniejszamy indeks końcowy o 1 i przechodzimy do kroku 2.
Po wykonaniu pętli while w zależności od wartości flagi flag wydrukuj do konsoli tekst: 'Znaleziono’, 'Nie znaleziono’.
Oczekiwany wynik:
Znaleziono
Zadanie 9:
Napisz program, który znajdzie wszystkie liczby dwucyfrowe podzielne przez 11. Wynik wydrukuj do konsoli w postaci wartości rozdzielonych przecinkiem.
Oczekiwany wynik:
11,22,33,44,55,66,77,88,99
Zadanie 10:
Napisz program, który znajdzie wszystkie liczby dwucyfrowe podzielne przez 11 oraz niepodzielne przez 3. Wynik wydrukuj do konsoli w postaci wartości rozdzielonych przecinkiem.
Oczekiwany wynik:
11,22,44,55,77,88
Zadanie 11:
Podana jest lista liczb:
items = [1, 3, 4, 5, 6, 9, 10, 17, 23, 24]
Napisz program, który usunie liczby nieparzyste i zwróci pozostałe. Wynik wydrukuj do konsoli.
Oczekiwany wynik:
[4, 6, 10, 24]
Zadanie 12:
Podana jest poniższa lista:
items = [1, 5, 3, 2, 2, 4, 2, 4]
Napisz program, który usunie duplikaty z listy (kolejność musi zostać zachowana).
Oczekiwany wynik:
[1, 5, 3, 2, 4]
Zadanie 13:
Napisz program, który z podanego tekstu:
text = 'Python jest bardzo popularnym językiem programowania’
wytnie dokładnie cztery pierwsze wyrazy. Przeprowadź standaryzację każdego wyrazu, tzn. zamień duże litery na małe. Wynik przedstaw w postaci listy i wydrukuj do konsoli.
Oczekiwany wynik:
[’python’, 'jest’, 'bardzo’, 'popularnym’]
Zadanie 14:
Napisz program, który z podanej listy zwróci listę wartości powyżej ustalonego progu 0.5:
probabilities = [0.21, 0.91, 0.34, 0.55, 0.76, 0.02]
Oczekiwany wynik:
[0.91, 0.55, 0.76]
Zadanie 15:
Rozważmy problem klasyfikacji binarnej. Model uczenia maszynowego zwraca prawdopodobieństwo przynależności do klasy. Jeżeli jest ono mniejsze niż 0.5 próbka zostaje przypisana do klasy 0, przeciwnie do klasy 1.
Podana jest lista prawdopodobieństw otrzymanych z modelu uczenia maszynowego:
probabilities = [0.21, 0.91, 0.34, 0.55, 0.76, 0.02]
Napisz program, który przypisze klasę 0 dla wartości mniejszych niż 0.5 oraz 1 dla wartości większych lub równych 0.5. Wynik w postaci listy wydrukuj do konsoli.
Oczekiwany wynik:
[0, 1, 0, 1, 1, 0]
Zadanie 16:
Napisz program, który utworzy histogram – rozkład częstości w postaci słownika z podanych wartości:
items = [’x’, 'y’, 'z’, 'y’, 'x’, 'y’, 'y’, 'z’, 'x’]
W odpowiedzi utworzony słownik wydrukuj do konsoli.
Oczekiwany wynik:
{’x’: 3, 'y’: 4, 'z’: 2}
Zadanie 17:
Podany jest poniższy tekst:
text = „””Python – język programowania wysokiego poziomu
ogólnego przeznaczenia, o rozbudowanym pakiecie bibliotek
standardowych, którego ideą przewodnią jest czytelność i
klarowność kodu źródłowego.”””
Utwórz listę słów z podanego tekstu. Następnie dokonaj standaryzacji (zamień duże litery na małe, usuń znaki interpunkcyjne). Wydobądź tylko wyrazy z długością powyżej 10 znaków. Otrzymaną listę wydrukuj do konsoli:
Oczekiwany wynik:
[’programowania’, 'przeznaczenia’, 'rozbudowanym’, 'standardowych’]
Zadanie 18:
Podana jest lista indeksów notowanych na GPW:
indexes = [
„WIG”,
„WIG-banki”,
„WIG-budownictwo”,
„WIG-CEE”,
„WIG-chemia”,
„WIG-energia”,
„WIG-ESG”,
„WIG-górnictwo”,
„WIG-informatyka”,
„WIG-leki”,
„WIG-media”,
„WIG-motoryzacja”,
„WIG-nieruchomości”,
„WIG-odzież”,
„WIG-paliwa”,
„WIG-Poland”,
„WIG-spożywczy”,
„WIG-telekomunikacja”,
„WIG-Ukraine”,
„WIG.GAMES”,
„WIG.MS-BAS”,
„WIG.MS-FIN”,
„WIG.MS-PET”,
„WIG20”,
„WIG20dvp”,
„WIG20lev”,
„WIG20short”,
„WIG20TR”,
„WIG30”,
„WIG30TR”,
„WIGdiv”,
„WIGtech”,
]
Dokonaj iteracji po liście indexes oraz wydrukuj do konsoli tylko te indeksy, które zwierają w nazwie ’20’ lub ’30’.
Oczekiwany wynik:
WIG20
WIG20dvp
WIG20lev
WIG20short
WIG20TR
WIG30
WIG30TR
Zadanie 19:
Podany jest słownik spółek z indeksu sektorowego WIG.GAMES. Kluczem jest 3-literowy kod spółki (ticker), wartością cena zamknięcia:
gaming = {
’11B’: 362.5,
'CDR’: 297.0,
'CIG’: 0.85,
'PLW’: 318.0,
'TEN’: 300.0
}
Przeprowadź iterację po słowniku. Wydrukuj kody (tickery) tych spółek, których cena zamknięcia jest większa niż 100.00 PLN.
Oczekiwany wynik:
11B
CDR
PLW
TEN
Zadanie 20: Podana jest lista imion wprowadzonych do systemu przez użytkowników (bez procesu walidacji):
names = [’Jack’, 'Leon’, 'Alice’, ’32-3c’, 'Bob’]
Sprawdź, czy każde imię jest poprawne (składa się tylko z liter). Jeżeli tak, wynik wydrukuj do konsoli w następującej postaci, np. Hello Jack!
Wskazówka: Użyj metody str.isalpha().
Oczekiwany wynik:
Hello Jack!
Hello Leon!
Hello Alice!
Hello Bob!
Zadanie 21: Napisz program, który porówna dwie listy i zwróci wartość True w przypadku gdy listy będą zawierały co najmniej jeden ten sam element. W przeciwnym razie zwróci wartość False. Użyj instrukcji break.
Podane listy:
- list1 = [1, 2, 0]
- list2 = [4, 5, 6, 1]
Wynik wydrukuj do konsoli.
Zadanie 22: Podana jest lista hashtags:
- hashtags = [’holiday’, 'sport’, 'fit’, None, 'fashion’]
Sprawdź, czy każdy obiekt z listy jest obiektem klasy str. Jeżeli tak wydrukuj wartość True, w przeciwnym przypadku wydrukuj wartość False. Użyj instrukcji break.
Zadanie 23:
Podana jest lista spółek z indeksu WIG.GAMES wraz z ceną zamknięcia i walutą:
gaming = {
’11B’: [362.5, 'PLN’],
’CDR’: [74.25, 'USD’],
’CIG’: [0.85, 'PLN’],
’PLW’: [79.5, 'USD’],
’TEN’: [300.0, 'PLN’]
}
Używając instrukcji continue zbuduj pętlę, która pozwoli zmienić cenę zamknięcia wyrażoną w USD na PLN. Przyjmij kurs USDPLN = 4.0.
Słownik gaming wydrukuj do konsoli.
Pomocniczy wynik:
{’11B’: [362.5, 'PLN’],
’CDR’: [297.0, 'PLN’],
’CIG’: [0.85, 'PLN’],
’PLW’: [318.0, 'PLN’],
’TEN’: [300.0, 'PLN’]}
Oczekiwany wynik:
{’11B’: [362.5, 'PLN’], 'CDR’: [297.0, 'PLN’], 'CIG’: [0.85, 'PLN’], 'PLW’: [318.0, 'PLN’], 'TEN’: [300.0, 'PLN’]}
Zadanie 24:
Podana jest niepełna lista imion (jednego brak):
names = [’Jack’, 'Leon’, 'Alice’, None, 'Bob’]
Lista składa się tylko z obiektów typu str lub wartości None. Posługując się instrukcją continue wydrukuj do konsoli tylko poprawnie przekazane imiona (obiekty typu str).
Oczekiwany wynik:
Jack
Leon
Alice
Bob
Zadanie 25:
Podana jest poniższa lista:
project_ids = [’02134′, '24253′]
Sprawdź czy następujące id projektu:
project_id = '02135′
występuje w liście project_ids. Jeśli nie dodaj id tego projektu do listy. Następnie wydrukuj listę project_ids do konsoli.
Oczekiwany wynik:
[’02134′, '24253′, '02135′]