article banner (priority)

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 to one_way_ticket.
  • arbitrary_user — W zasadzie poprawne, aczkolwiek pierwsza część jest niepotrzebnie długa. Wystarczy user. Jeśli jednak chcemy wyrazić, że chodzi o jakąś wartość, możemy użyć a/an, a więc a_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, czy admin_user jeśli chodzi o użytkownika będącego adminem.
  • post_user_request — Poprawna nazwa. Tutaj post odnosi się do metody POST w protokole internetowym HTTP.
  • szkolenie_warszawa — Nie używamy polskich słów przy nazywaniu zmiennych. Lepsza wersja to workshop_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ędzie PersonalInvoice.
  • UserAddress - Poprawna nazwa.
  • Carengine - "car" i "engine" to osobne słowa. Lepszą nazwą będzie CarEngine.
  • 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)})"