Rozwiązania do zadań: Python od podstaw
Cześć! To jest fragment książki JavaScript od podstaw, która ma pomóc w nauce programowania od zera.
Stringi
W pierwszym przypadku zwróć uwagę na zastosowanie pojedynczych cudzysłowów, aby w środku umieścić podwójne.
print('Kim jest "ona"?') # Kim jest "ona"?
W drugim przypadku nie użyliśmy tej sztuczki, więc podwójny cudzysłów w środku kończy stringa, a następnie otwiera nowy. Na szczęście w środku znajduje się znak +
, który łączy dwa teksty w jeden. Zauważ podwójną spację pomiędzy "Użyję" a "by" w wyświetlonym tekście.
print("Użyję " + " by dodać teksty")
# Użyję by dodać teksty
Jeśli chcielibyśmy wypisać "+"
, to powinniśmy otoczyć cały tekst cudzysłowami pojedynczymi.
print('Użyję "+" by dodać teksty')
# Użyję "+" by dodać teksty
W ostatnim przypadku popełniliśmy typowy błąd nowicjusza i zapomnieliśmy o użyciu spacji, gdy dodajemy dwa stringi.
print("Tekst," + "następny," + "jeszcze jeden")
# Tekst,następny,jeszcze jeden
To, co powinniśmy zrobić, to dodać tę spację albo w tekście po lewej, albo po prawej od znaku dodawania.
print("Tekst, " + "następny, " + "jeszcze jeden")
# Tekst, następny, jeszcze jeden
print("Tekst," + " następny," + " jeszcze jeden")
# Tekst, następny, jeszcze jeden
Python jako kalkulator
print(1 * 2 + 3 * 4 + 5 * 6 + 7 * 8 + 9)
# 109
print(1 * (2 + 3) * (4 + 5) * (6 + 7) * (8 + 9))
# 9945
# Różni się od poprzedniego, bo nawiasy wymuszają
# dodawanie przed mnożeniem.
print(1 * 2 / 3 * 4 / 5 * 6 / 7 * 8 / 9 * 10)
# 4.063492063492064
# musiało być większe od 1, bo ostatnie jest mnożenie.
print(2 ** 10) # 1024
# to bardzo znana liczba w programowaniu
# "kilo" w kontekście informatyki oznacza zwykle 1024,
# w czasie gdy w innych kontekstach oznacza 1000.
Python jako kalkulator porównujący
W pierwszym przypadku mnożenie kończy się na 5, a więc możemy spodziewać się, że prawa strona jest większa. Poniższy kod to potwierdza.
print(1 * 2 + 3 * 4 + 5 < 1 + 2 * 3 + 4 * 5)
# True
Poniżej sprawdzamy dla innych przypadków, czy lewa strona jest większa od prawej.
print(2 ** 20 > 3 ** 15)
# False, więc prawa strona jest większa
print(2 ** 15 > 10 ** 4)
# True, więc lewa strona jest większa
Możemy też sprawdzić na odwrót.
print(2 ** 20 < 3 ** 15) # True
print(2 ** 15 < 3 ** 4) # False
Definiowanie zmiennych 1
name = "Michał"
print(name) # Michał
name = "Marcin"
print(name) # Marcin
points = 123
print(points) # 123
Definiowanie zmiennych 2
num = 10
print(num) # 10
num = 20
print(num) # 20
Nazywanie zmiennych
public_workshops
— Poprawna nazwa.1_way_ticket
— Nie zaczynamy nazw zmiennych od liczb. Lepsza wersja toone_way_ticket
.arbitrary_user
— W zasadzie poprawne, aczkolwiek pierwsza część jest niepotrzebnie długa. Wystarczyuser
. Jeśli jednak chcemy wyrazić, że chodzi o jakąś wartość, możemy użyća
/an
, a więca_user
.note_type
— Poprawna nazwa.user_Maciek
— Formalnie akceptowalna, aczkolwiek użycie polskiego imienia jest dyskusyjne. Także zwykle wydzielamy zmienne, by określić coś uniwersalnego — co charakteryzuje tego użytkownika. W pewnych przypadkach taka nazwa byłaby akceptowalna, ale zazwyczaj preferowalibyśmy na przykład:user
jak chodzi o "jakiegoś użytkownika",user1
jeśli chodzi o jednego z kilku, czyadmin_user
jeśli chodzi o użytkownika będącego adminem.post_user_request
— Poprawna nazwa. Tutajpost
odnosi się do metody POST w protokole internetowym HTTP.szkolenie_warszawa
— Nie używamy polskich słów przy nazywaniu zmiennych. Lepsza wersja toworkshop_warsaw
.
Dodawanie i odejmowanie od wartości zmiennych
fruits = "Figa "
price = 0
fruits += "Gruszka "
price += 3.2
print(fruits) # Figa Gruszka
print(price) # 3.2
fruits += "Banan "
price += 2.8
print(fruits) # Figa Gruszka Banan
print(price) # 6.0
fruits += "(kupon zniżkowy)"
price -= 1.4
print(price) # 4.6
None
name = None
surname = "Michalski"
print(name is None) # True
print(name) # None
print(surname) # Michalski
name = surname
surname = "Gajos"
print(name is None) # False
print(name) # Michalski
print(surname) # Gajos
Ćwiczenie: if
if is_important:
print("Szanownie")
print("Witam")
if gender == "female":
print("Panią")
if gender == "male": # albo elif
print("Pana")
Rozwiązanie z w pojedynczej linii:
text = ""
if is_important:
text += "Szanownie "
text += "Witam"
if gender == "female":
text += " Panią"
if gender == "male": # albo elif
text += " Pana"
print(text)
Ćwiczenie: else i elif
# Przykładowe wartości
coffee_finished = True
days_until_deadline = 3
# Rozwiązanie
if not coffee_finished:
print("Piję kawę")
elif days_until_deadline < 2:
print("Pracuję")
else:
print("Uczę się programowania!")
Warunki
Fragment pierwszy, wariant pierwszy
Cześć Michał
Może coś do picia?
Fragment pierwszy, wariant drugi
Witamy Pana Prezesa
Cześć Prezes Marek
Może coś do picia?
Fragment pierwszy, wariant trzeci
Cześć Paweł
Może czekoladkę?
Fragment pierwszy, wariant czwarty
Może czekoladkę?
Fragment drugi, wariant pierwszy
Cześć Michał
Może coś do picia?
Fragment drugi, wariant drugi
Witamy Pana Prezesa
Może coś do picia?
Fragment drugi, wariant trzeci
Cześć Paweł
Może czekoladkę?
Fragment drugi, wariant czwarty
Cześć
Może czekoladkę?
Fragment trzeci, wariant pierwszy
Cześć Michał
Kategoria: Dorośli
Fragment trzeci, wariant drugi
Witamy Pana Prezesa
Kategoria: Starsi
Fragment trzeci, wariant trzeci
Cześć Paweł
Kategoria: Dzieci
Fragment trzeci, wariant czwarty
Kategoria: Młodzież
Złożone wyrażenia logiczne
has_computer = True
passed_test = False
is_grounded = False
print(has_computer and passed_test)
# False, ponieważ True and False
print(passed_test or is_grounded)
# False, ponieważ False or False
print(has_computer and not passed_test)
# True, ponieważ True and !False
can_play_games = has_computer and not is_grounded
# True, ponieważ True and !False,
# a więc True and True
print(can_play_games) # True
play_games = has_computer and can_play_games
# True, ponieważ True and True
if not passed_test:
is_grounded = True
print(play_games) # True,
# ponieważ gdy wartość ta była obliczana,
# is_grounded był równy False
print(passed_test or not is_grounded)
# False, ponieważ False or !True,
# ponieważ aktualna wartość is_grounded to True
print(not (not has_computer or not passed_test))
# False, ponieważ True and False,
# bo !(!a or !b) jest równoznaczne z a and b
Ciągi matematyczne
Wypisz kolejne liczby parzyste (wielokrotności 2), zaczynając od 0, a mniejsze od 100.
i = 0
while i < 100:
print(i)
i += 2 # albo i = i + 2
Wypisz kolejne wielokrotności 7, zaczynając od 0, a mniejsze od 100.
i = 0
while i < 100:
print(i)
i += 7 # albo i = i + 7
Wyświetl kolejne wartości powstałe w wyniku wielokrotnego potrajania liczby, zaczynając od 13, tak długo, jak długo wynik jest mniejszy niż 1000.
i = 13
while i < 1000:
print(i)
i *= 3 # albo i = i * 3
Wypisz kwadraty kolejnych liczb całkowitych, mniejszych od 1000.
i = 0
while i * i < 1000:
print(i * i)
i += 1 # albo i = i + 1
Przypadki użycia pętli for dla liczb
Wypisz 5 kolejnych liczb, zaczynając od 0.
for i in range(5):
print(i)
Wypisz kolejne liczby, zaczynając od 5, mniejsze od 10.
for i in range(5, 10):
print(i)
Wypisz co czwartą liczbę od 5 do 30.
for i in range(5, 30, 4):
print(i)
Wypisz kolejne liczby od 10 do 5 (bez 5).
for i in range(10, 5, -1):
print(i)
Wypisz co drugą liczbę od 20 do 0 (bez 0).
for i in range(20, 0, -2):
print(i)
Funkcje
def print_sum(a, b):
print(a + b)
def print_numbers(a, b):
for i in range(a, b + 1):
print(i)
def print_stars(num):
stars = ""
for i in range(num):
stars += "*"
print(stars)
def print_square(size):
for i in range(size):
print_stars(size)
def print_triangle(size):
for i in range(size):
print_stars(i + 1)
Funkcje zwracające wartości
def days_to_millis(days):
return days * 24 * 60 * 60 * 1000
def triangle_area(a, b):
return a * b / 2
def biggest(a, b, c):
if a >= b and a >= c:
return a
elif b >= c:
return b
else:
return c
def sum_range(a, b):
res = 0
for i in range(a, b):
res += i
return res
# rozwiązanie rekurencyjne
def sum_range(a, b):
if b <= a:
return 0
return sum_range(a + 1, b) + a
Nazywanie klas
Personal_Invoice
- Nie stawiamy znaku podkreślenia między słowami w nazwach klas. Lepszą nazwą będziePersonalInvoice
.UserAddress
- Poprawna nazwa.Carengine
- "car" i "engine" to osobne słowa. Lepszą nazwą będzieCarEngine
.doctor
- Nazwy klas powinny zaczynać się z wielkiej litery.Dog
- Poprawna nazwa.
Klasy i atrybuty
class Player:
pass
player = Player()
player.points = 0
print(player.points) # 0
player.points = 1
print(player.points) # 1
Konto bankowe
Dobrą nazwą będzie BankAccount
.
class BankAccount:
def __init__(self):
self.balance = 0
def deposit(self, amount):
self.balance += amount
def withdraw(self, amount):
if amount <= self.balance:
self.balance -= amount
return True
else:
return False
account1 = BankAccount()
account2 = BankAccount()
account1.deposit(1000)
print(account1.balance) # 1000
print(account2.balance) # 0
Tworzenie i modyfikacja listy
values = [True, 42, "AAA"]
print(values.pop()) # "AAA"
print(values.pop()) # 42
values.append(88)
print(values) # [True, 88]
pets = ["dog", "cat"]
pets.pop()
pets.append("pig")
print(pets) # ["dog", "pig"]
pet = pets.pop()
print(pets) # ["dog"]
print(pet) # "pig"
Odnoszenie się do elementów listy
names = ["Ada", "Bartek", "Czarek", "Daria", "Ewa"]
print(names[0]) # Ada
print(names[3]) # Daria
print(names[-1]) # Ewa
print(names[-2]) # Daria
print(names[1]) # Bartek
print(names[-4]) # Bartek
Odnoszenie się elementów przy pomocy zakresu
names = ["Ada", "Bartek", "Czarek", "Daria", "Ewa"]
print(names[0:2]) # ['Ada', 'Bartek']
print(names[2:4]) # ['Czarek', 'Daria']
print(names[:3]) # ['Ada', 'Bartek', 'Czarek']
print(names[3:-1]) # ['Daria']
print(names[1:]) # ['Bartek', 'Czarek', 'Daria', 'Ewa']
print(names[1:3]) # ['Bartek', 'Czarek']
print(names[-3:]) # ['Czarek', 'Daria', 'Ewa']
print(names[1:-2]) # ['Bartek', 'Czarek']
print(names[:])
# ['Ada', 'Bartek', 'Czarek', 'Daria', 'Ewa']
Zmiana elementów listy
names = ["Ada", "Bartek", "Czarek"]
names[2] = "Figa"
print(names) # ['Ada', 'Bartek', 'Figa']
names[-2] = "Geralt"
print(names) # ['Ada', 'Geralt', 'Figa']
names = ["Ada", "Bartek", "Czarek"]
names[:1] = []
print(names) # ['Bartek', 'Czarek']
names[2:] = ["Ewa", "Halina"]
print(names) # ['Bartek', 'Czarek', 'Ewa', 'Halina']
names[1:2] = ["Iza", "Jan"]
print(names)
# ['Bartek', 'Iza', 'Jan', 'Ewa', 'Halina']
names[:-1] = ["Kasia"]
print(names) # ['Kasia', 'Halina']
Wielkość i elementy listy
letters = ['A', 'B', 'C', 'D', 'E', 'F']
print(len(letters)) # 6
print(letters[4]) # E
numbers = [5, 6, 7, 8, 9, 10, 11, 12]
print(len(numbers)) # 8
print(numbers[3]) # 8
Sprawdzanie obecności elementu na liście
letters = ["A", "C", "E"]
print("A" in letters) # True
print("B" in letters) # False
print("C" in letters) # True
letters[1] = "F"
print("F" in letters) # True
print("C" in letters) # False
Dodawanie i kopiowanie list
l1 = ["A", "B"]
l2 = ["D", "E"]
letters = l1 + l2
l1Copy = l1[:]
print(letters) # ['A', 'B', 'D', 'E']
l1.append("C")
print(l1) # ['A', 'B', 'C']
print(letters) # ['A', 'B', 'D', 'E']
print(l1Copy) # ['A', 'B']
Tuple
values = (True, 42, "AAA")
print(values[1]) # 42
print(values[2]) # AAA
print(values[:1]) # (True,)
empty = tuple()
print(len(empty)) # 0
single = ("AAA",)
print(single) # ('AAA',)
print(len(single)) # ('AAA')
Iterowanie i listy składane
names = ["michał", "nela", "ola", "przemek"]
upper = [name.capitalize() for name in names]
print(upper) # ['Michał', 'Nela', 'Ola', 'Przemek']
girls = [name.capitalize() for name in names
if name[-1] == "a"]
print(girls) # ['Nela', 'Ola']
count = 0
for name in names:
count += len(name)
print(count) # 20
__str__
, __repr__
i __eq__
class Money:
def __init__(self, amount, currency):
self.amount = amount
self.currency = currency
def __eq__(self, other):
return isinstance(other, Money)
and other.amount == self.amount
and other.currency == self.currency
def __str__(self):
return f"{self.amount} {self.currency}"
def __repr__(self):
return "Money(" +
f"amount={repr(self.amount)}, " +
f"currency={repr(self.currency)})"