Programmeerimine Konspekt

0. Programmeerimise ajalugu, Süntaks, Muutujad

Arenduse etapid

1. Eelanalüüs. Описание потребностей и их анализ
2. Tehniline ja visuaalne disain. Дизайн программного продукта
3. Arendus. Разработка
4. Testmine. Проверка
5. Juurutamine. Выпуск и внедрение продукта
6. Hooldus. Обслуживание продукта

Tarkvara elutsüki mudelid

  1. Waterfall (kaskaad)
  2. Iteratiivsed
  3. Spiraalsed
  4. inkrementaalsed
  5. Agile (agiilne)

Testimine

  • Valge kast – Белый ящик. Тестировщик знает, как работает программа и какие функции выполняет каждый ее блок.
  • Must kast – Черный ящик. Проверка, при которой тестировщик не имеет доступа к коду. Он, как реальный клиент или пользователь, оценивает функции и работу программы, ориентируясь исключительно на интерфейс взаимодействия.
  • Hall kast – Серый ящик. Тестировщик может видеть часть кода или иметь доступ к внутренним настройкам продукта, недоступным обычному пользователю.

Vead ja erandid

  • Loogikavead – Логические ошибки
  • Süntaksivead – Ошибки синтаксиса
  • Erandid – Исключения

Vigade liigitamine programmi töötlemise etappide kaupa

Kompileerimisvead – Ошибки компиляции
Ошибки которые можно исправить до запуска программы, ошибки, которые обнаруживает компилятор вместо программиста.

Paigutusvead – Ошибки компоновки

Toimimisvead – Ошибки выполнения

Põhilised programmeerimismudelid

Imperative programming
Imperative programming is a paradigm where you explicitly state how the program should achieve the desired result. You write step-by-step instructions for the computer to follow. This paradigm is closer to the machine’s way of thinking and requires a clear understanding of the system’s internals.

Declarative programming
Declarative programming is a high-level programming concept, which is the opposite of imperative programming. It is a programming approach in which coders write code that describes what they want to do and what results they want to achieve, rather than how they will achieve the results.

Structural programming
Structured programming encourages dividing an application program into a hierarchy of modules or autonomous elements, which, in turn, may contain other such elements. Within each element, code may be further structured using blocks of related logic designed to improve readability and maintainability.

Functional programming
Functional Programming (FP) is a style of programming which models computations as the evaluation of expressions. In functional programming, functions are first-class entities, meaning they can be passed as arguments to other functions, returned as values from other functions, and even assigned to variables.

Logic programming
What is logic programming? Logic programming expresses and manipulates logic-based relationships and rules in a declarative manner. Logic programs, driven solely by data, utilize logical statements known as predicates, which are either facts or rules.

Object Oriented Programming OOP
OOP is based on the idea of classes and objects. It organizes a computer program into basic, reusable blueprints of code or “classes.” These classes are then used and reused to create new and unique objects with similar functions.

Component Orientented programming
It’s known as component-oriented programming, and it’s all about stitching reusable components together like Lego blocks. At its core, component-oriented architecture embraces the Don’t Repeat Yourself (DRY) dogma. Repeating code is time and efficiency wasted.

Prototype-based programming
Prototype-based programming is a style of object-oriented programming in which classes are not explicitly defined. Inheritance is performed by reusing existing objects that serve as prototypes (objects inherit from other objects through a prototype property).

1. Teema Lineaarsed programmid

Algoritm

Algoritmide põhiomadused:

  • diskreetsus – osadeks jagatud
  • selgus(kindlus) lõplik sammude kogus
  • ühesus – ühesuguste lähteandmete korral peab algoritmi täitmine viima ühesugustele lõpptulemustele. Algoritmi täitmise tulemus ei tohi sõltuda täitjast
  • universaalsus – algoritm peab olema mõeldud kõikide antud
  • lõplikkus – lõpliku arvu sammude järel peab algoritm viima lõpptulemusele
  • korrektsus

Algoritmide tüübid

  • Lineaarne algoritm – algoritmi sammude täitmise järjekord ei sõltu vahetulemustest
  • Hargnev algoritm – sammude täitmise järjekord sõltub mingist tingimusest või vahetulemusest
  • Tsükliline algoritm – algoritmi mingit osa täidetakse korduvalt

Plokkskeem – algoritmi graafiline kujutamine plokkide ja neid ühendavate noolte abil.

2. Teema Valikud (If, elif, else)

1. Mis on tingimuslaused?

Tingimuslaused võimaldavad programmil teha otsuseid, kontrollides, kas mingi tingimus on tõene (True) või väär (False). Selle põhjal tehakse erinevaid tegevusi.

2. Süntaks:

if tingimus:
    # kood, mida käivitatakse, kui tingimus on tõene
elif teine_tingimus:
    # kood, mida käivitatakse, kui eelmine tingimus oli väär, aga see on tõene
else:
    # kood, mida käivitatakse, kui ükski eelnev tingimus ei olnud tõene

Tähtsad punktid:

  • if – alustab tingimuskontrolli.
  • elif – täiendav kontroll juhul, kui eelmine ei kehti.
  • else – käivitub ainult siis, kui ükski eelnev tingimus ei olnud tõene.
  • Tühikute (taandude) järgimine on Pythonis väga oluline.
age = 18

if age < 13:
    print("Sa oled laps.")
elif age < 18:
    print("Sa oled teismeline.")
else:
    print("Sa oled täiskasvanu.")
Sa oled täiskasvanu.

3. Teema Kordused

Kordused (ehk tsüklid) võimaldavad käivitada sama koodi mitu korda. Pythonis kasutatakse kahte peamist korduse tüüpi:

  • for-tsükkel – kasutatakse kindla arv kordi kordamiseks või näiteks loendite/lugude läbimiseks.
  • while-tsükkel – kordab koodi seni, kuni mingi tingimus on tõene.
for muutuja in järjend:
    # korduv tegevus

for i in range(1, 6):
    print(i)

while tingimus:
    # korduv tegevus

i = 1
while i <= 5:
    print(i)
    i += 1

Tähtsad märksõnad:

  • break – katkestab tsükli.
  • continue – jätkab järgmise kordusega, jättes ülejäänud koodi vahele.
  • range() – kasutatakse for-tsüklis arvude loomiseks.
nimed = ["Anna", "Karl", "Mati"]

for nimi in nimed:
    print("Tere, " + nimi + "!")
Arv on: 1
Arv on: 2
Arv on: 3

4. Listid

List ehk loend on andmetüüp, mis võimaldab hoida mitut väärtust ühes muutujas. Listid on järjestatud ja muudetavad kogumid, mis võivad sisaldada erinevat tüüpi elemente (numbrid, stringid, jne).

minu_list = [1, 2, 3, 4]
nimed = ["Anna", "Mati", "Karl"]

Juurdepääs elemendile indeksiga: indeksid algavad 0-st.

nimed[0]  # annab "Anna"

# muutmine
nimed[1] = "Kati"

# lisamine
nimed.append("Jüri")

# kustutamine
nimed.remove("Mati")

# pikkuse kontroll
len(nimed)  # tagastab listi pikkuse
puuviljad = ["õun", "banaan", "pirn"]

for puuvili in puuviljad:
    print("Mulle meeldib " + puuvili)
Mulle meeldib õun
Mulle meeldib banaan
Mulle meeldib pirn

5. Pythoni funktsioonid

str()

# str() muudab muutuja stringiks
a = "Minu arv on "
b = 10
c = a + str(b)

upper()

a = "artjom"
print(a) # artjom
a.upper()
print(a) # ARTJOM

lower()

a = "Minu Nimi On Artjom"
print(a) # Minu Nimi On Artjom
a.lower()
print(b) # minu nimi on artjom

capitalize()

a = "artjom põldsaar"
print(a) # artjom põldsaar
a.capitalize()
print(a) # Artjom põldsaar

date.today()

tana = date.today()
print(f"Täna on {tana}") # Täna on 2025-01-27

date()

aastaLopp = date(tana.year, 12, 31)
print(f"Aasta lõpp on {aastaLopp}") 
# Aasta lõpp on 2025-12-31

strftime()

# 27/12/2022
tana = tana.strftime("%d/%m/%Y")

# December 27, 2022
tana = tana.strftime("%B %d, %Y")

# 12/27/22
tana = tana.strftime("%m/%d/%y")

# Dec-27-2022
tana = tana.strftime("%b-%d-%Y")

monthrange(a, b)

res = calendar.monthrange(tana.year, tana.month)
paevadKuus = res[1]
print(f"Kuus on {paevadKuus} päeva")
# Kuus on 31 päeva

round(arv, punktid)

a = 3.1458139287
print(round(a, 2)) # 3.15

Tund 3

isalnum()Returns True if all characters in the string are alphanumeric
isalpha()Returns True if all characters in the string are in the alphabet
isascii()Returns True if all characters in the string are ascii characters
isdecimal()Returns True if all characters in the string are decimals
isdigit()Returns True if all characters in the string are digits
isidentifier()Returns True if the string is an identifier
islower()Returns True if all characters in the string are lower case
isnumeric()Returns True if all characters in the string are numeric
isprintable()Returns True if all characters in the string are printable
isspace()Returns True if all characters in the string are whitespaces
istitle()Returns True if the string follows the rules of a title
isupper()Returns True if all characters in the string are upper case

6. Sõnastikud

Sõnastik on andmetüüp, mis sisaldab võtme-väärtuse paare. Iga element sõnastikus koosneb võtmest ja sellele vastavast väärtusest. Sõnastiku elemendid ei ole järjekorras (kui ei kasutata orderrendi Python versioonis 3.7 ja uuemates).

Sõnastikku luuakse kõverate sulgudega {}, kus iga element on vormis võti: väärtus.

minu_sonastik = {
    "nimi": "Jüri",
    "vanus": 30,
    "töö": "programmija"
}
nimi = minu_sonastik["nimi"]
print(nimi)  # Väljund: Jüri

minu_sonastik["vanus"] = 31

minu_sonastik["linn"] = "Tallinn"

del minu_sonastik["töö"]

if "nimi" in minu_sonastik:
    print("Nimi on olemas!")

Funktsioonid

keys() – tagastab kõik võtmed:

print(minu_sonastik.keys())  # Väljund: dict_keys(['nimi', 'vanus', 'linn'])

values() – tagastab kõik väärtused:

print(minu_sonastik.values())  # Väljund: dict_values(['Jüri', 31, 'Tallinn'])

items() – tagastab võtme-väärtuse paarid:

print(minu_sonastik.items())  # Väljund: dict_items([('nimi', 'Jüri'), ('vanus', 31), ('linn', 'Tallinn')])

Näide

isik = {
    "nimi": "Jüri",
    "vanus": 30,
    "linn": "Tallinn"
}

print(isik["nimi"])  # Väljund: Jüri

7. Failidega töö

Failide avamine ja lugemine

Pythonis saab faile avada ja lugeda, kasutades open() funktsiooni. Faili avamisel on võimalik määrata erinevad režiimid, näiteks lugemiseks, kirjutamiseks või lisamiseks.

Faili avamise režiimid:

  • "r" – avab faili lugemiseks (fail peab olemas olema).
  • "w" – avab faili kirjutamiseks (kui fail ei eksisteeri, siis luuakse uus, olemasolev fail aga kustutatakse).
  • "a" – avab faili lisamiseks (kui fail ei eksisteeri, siis luuakse uus).
  • "rb" – avab faili lugemiseks binaarses režiimis.
  • "wb" – avab faili kirjutamiseks binaarses režiimis.

Funktsioonid failide töötamisega

  • read() – loeb kogu faili sisu.
  • readline() – loeb faili ühe rea korraga.
  • readlines() – loeb kõik read nimekirja kujul.
  • write() – kirjutab andmed faili.
  • writelines() – kirjutab mitmed read korraga faili.

Pärast faili töötlemist on oluline fail sulgeda, et kõik muudatused salvestatakse ja fail on korrektselt vabastatud.

fail.close()
with open("fail.txt", "r") as fail:
    sisu = fail.read()
with open("näide.txt", "r") as fail:
    sisu = fail.read()
    print(sisu)

Faili kirjutamine

with open("uus_fail.txt", "w") as fail:
    fail.write("Tere!\n")
    fail.write("See on esimene rida.\n")
    fail.write("See on teine rida.\n")

E-maili saatmine

Impordi e-posti moodulid

import smtplib
from email.message import EmailMessage

Konfigureeri e-posti päise väljad

message = EmailMessage()
message['Subject'] = "Teema"
message['From'] = "saatja@gmail.com"
message['To'] = "saaja@gmail.com"

Konfigureeri e-kirja keha

message.set_content("Hello from Python!")

Konfigureeri e-posti server

email_smtp = "smtp.gmail.com"
# set smtp server and port
server = smtplib.SMTP(email_smtp, '587')
# secure the SMTP connection
server.starttls()

E-kirja saatmine

sender_email_address = "your_email@gmail.com"
email_password = "your_email_password"
# login to email account
server.login(sender_email_address, email_password)
# send email
server.send_message(message)
# close connection to server
server.quit()

HTML-sisu saatmine e-postiga

message.set_content("""
<!DOCTYPE html>
<head>
</head>
<body>
<h1>Sending an HTML email from Python</h1>
<p>Hello there,</p>
<a href="https://inspirezone.tech/">Here's a link to an awesome dev
community!</a>
</body>
</html>
""", subtype="html")

On vaja kirjutada subtype=”html”

Pildi saatmine e-postiga manusena

Küsime kasutajalt faili laadima

from filedialog import *
fail = filedialog.askopenfilename(title="Vali fail", filetypes=[("All files", "*.*")])
with open(fail, "rb") as f:
    fail_data = f.read()

Lisame pilt manusena

fail_nimi = fail.split("/")[-1]
msg.add_attachment(fail_data, maintype="application", subtype="octet-stream", filename=fail_nimi)

8.1 Graafikute ja diagrammide loomine

matplotlib – kõige populaarsem raamatukogu lihtsate ja keerukate graafikute loomiseks.

Installimine

pip install matplotlib

Joongraafik

import matplotlib.pyplot as plt

# Andmed
aasta = [2018, 2019, 2020, 2021, 2022]
müük = [200, 220, 250, 270, 300]

# Loome joongraafiku
plt.plot(aasta, müük, marker='o', color='b', linestyle='-', linewidth=2)

# Lisa pealkirjad
plt.title("Aastane müük")
plt.xlabel("Aasta")
plt.ylabel("Müük")

# Näita graafikut
plt.show()

Tulpdiagramm

import matplotlib.pyplot as plt

# Andmed
kategooriad = ['Õun', 'Banaan', 'Pirn', 'Marjad']
müük = [150, 100, 120, 90]

# Loome tulpdiagrammi
plt.bar(kategooriad, müük, color='green')

# Lisa pealkirjad
plt.title("Puuviljade müük")
plt.xlabel("Puuvili")
plt.ylabel("Müük")

# Näita graafikut
plt.show()

Histogramm

import matplotlib.pyplot as plt
import numpy as np

# Loome andmed, mis jagunevad normaalselt
andmed = np.random.randn(1000)

# Loome histogrammi
plt.hist(andmed, bins=30, color='skyblue', edgecolor='black')

# Lisa pealkirjad
plt.title("Andmete jaotus")
plt.xlabel("Väärtused")
plt.ylabel("Sagedus")

# Näita graafikut
plt.show()

Punktdiagramm

import matplotlib.pyplot as plt

# Andmed
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]

# Loome punktdiagrammi
plt.scatter(x, y, color='r')

# Lisa pealkirjad
plt.title("X ja Y seos")
plt.xlabel("X väärtus")
plt.ylabel("Y väärtus")

# Näita graafikut
plt.show()

numpy kasutamine

import numpy as np
import matplotlib.pyplot as plt

# Generate a range of numbers (x values)
x = np.linspace(-10, 10, 400)  # Range from -10 to 10 with 400 points

# Apply the equation: y = 2x + 3
y = 2 * x + 3

# Create the plot
plt.plot(x, y, label="y = 2x + 3")

# Add labels and title
plt.title("Line Graph of y = 2x + 3")
plt.xlabel("x")
plt.ylabel("y")

# Show the legend
plt.legend()

# Display the plot
plt.grid(True)  # Add grid for easier visualization
plt.show()

8.2 Graafiline liides(Tkinter, CustomTkinter jne)

Tkinteri põhiüksused:

  • Tk() – loeb akna (rakenduse) peamise objekti.
  • Label() – kuvab teksti või pilte.
  • Button() – nupp, millele saab määrata tegevuse.
  • Entry() – tekstiväli kasutaja sisendi jaoks.
  • Canvas() – joonistamiseks ja graafika loomiseks.

Lihtne Tkinteri aknasüsteem

import tkinter as tk

# Loome akna
root = tk.Tk()
root.title("Minu Tkinter Rakendus")  # Aknale pealkiri

# Loome labeli, mis kuvab teksti
label = tk.Label(root, text="Tere tulemast Tkinterisse!", font=("Arial", 14))
label.pack()

# Nupu tegevusfunktsioon
def nupp_klik():
    label.config(text="Nuppu on vajutatud!")

# Loome nupu
button = tk.Button(root, text="Vajuta mind", command=nupp_klik)
button.pack()

# Aknale ilmumine
root.mainloop()

Kasutajasisendi vorm

import tkinter as tk

# Loome akna
root = tk.Tk()
root.title("Tervitus Rakendus")

# Funktsioon, mis tervitab kasutajat
def tervita():
    nimi = nimi_entry.get()  # Saame kasutaja sisendi
    tervitus_label.config(text=f"Tere, {nimi}!")  # Kuvame tervituse

# Loome nime sisestamiseks tekstivälja
nimi_label = tk.Label(root, text="Sisesta oma nimi:")
nimi_label.pack()

nimi_entry = tk.Entry(root)
nimi_entry.pack()

# Loome nupu, mis käivitab tervitamise
tervitus_button = tk.Button(root, text="Tervita mind", command=tervita)
tervitus_button.pack()

# Loome tervituse kuvamiseks labeli
tervitus_label = tk.Label(root, text="")
tervitus_label.pack()

# Aknale ilmumine
root.mainloop()

9. OOP

Objektorienteeritud programmeerimine (OOP) on programmeerimisparadigma, mis põhineb objektide mõistel. Objektid on klasside eksemplarid ja need võivad sisaldada andmeid (atribuutide kujul) ja meetodeid (funktsioonid, mis töötlevad neid andmeid). OOP põhialused on klassid, objektid, pärimine, kapseldamine ja polümorfism.

Pythoni keeles on OOP tugevasti integreeritud ja seda saab rakendada klasside ja objektide abil.

Klassid ja Objektid

Klass (Class):

Klass on „plaan“ või „mall“ objektide loomiseks. Klass määratleb objektide omadused (atribuutide kaudu) ja käitumise (meetodite kaudu).

Objekt (Object):

Objekt on klassi eksemplar, mis sisaldab andmeid ja saab täita meetodeid. Objektil on kõik klassi omadused, kuid iga objekti andmed võivad olla erinevad.

Näide

class Auto:
    # Konstruktor (init) määratleb objekti algse oleku
    def __init__(self, mark, mudel, aasta):
        self.mark = mark  # Atribuut: auto mark
        self.mudel = mudel  # Atribuut: auto mudel
        self.aasta = aasta  # Atribuut: auto aasta

    # Meetod: auto info kuvamine
    def kuva_info(self):
        return f"{self.mark} {self.mudel} ({self.aasta})"

# Loome objekti (auto)
minu_auto = Auto("Toyota", "Corolla", 2020)

# Kasutame objekti meetodit
print(minu_auto.kuva_info())  # Väljund: Toyota Corolla (2020)
  • __init__ on konstruktor, mis käivitub iga objekti loomisel ja määrab objekti algse oleku.
  • self viitab objekti endale, võimaldades meil ligipääsu objekti atribuutidele ja meetoditele.
  • kuva_info on meetod, mis kuvab objekti omadusi.

Pärimine (Inheritance)

Pärimine võimaldab ühel klassil (alamklassi) pärida omadused ja käitumise teisest klassist (pealklassist). See aitab koodis kordust vähendada ja loogikat jagada.

class Loom:
    def __init__(self, nimi):
        self.nimi = nimi

    def hääle_tegija(self):
        pass  # Alamklasside jaoks, ei tee midagi siin

# Alamklass
class Kass(Loom):
    def hääle_tegija(self):
        return f"{self.nimi} ütleb 'Meow!'"

class Koer(Loom):
    def hääle_tegija(self):
        return f"{self.nimi} ütleb 'Woof!'"

# Loome objekte
kass = Kass("Mitsi")
koer = Koer("Rex")

# Kasutame alamklassi meetodit
print(kass.hääle_tegija())  # Väljund: Mitsi ütleb 'Meow!'
print(koer.hääle_tegija())  # Väljund: Rex ütleb 'Woof!'

Polümorfism (Polymorphism)

Polümorfism võimaldab eri klasside objektidel kasutada samu meetodeid, kuid nende käitumine võib olla erinev sõltuvalt objekti tüübist. Selleks, et polümorfism toimiks, peab meetod olema määratletud nii, et erinevad alamklassid võivad seda erinevalt rakendada.

class Loom:
    def hääle_tegija(self):
        raise NotImplementedError("See meetod peab olema alamklassis määratletud.")

class Kass(Loom):
    def hääle_tegija(self):
        return "Meow!"

class Koer(Loom):
    def hääle_tegija(self):
        return "Woof!"

# Loome objektid
loomad = [Kass(), Koer()]

# Polümorfism: kuigi loomade tüübid on erinevad, kutsume sama meetodi
for loom in loomad:
    print(loom.hääle_tegija())  # Väljund: Meow! \n Woof!

Polümorfism tähendab, et erinevad klassid saavad kasutada sama meetodit hääle_tegija, kuid iga klassi puhul käitub see erinevalt.

OOP Näide kood

https://github.com/GummyisHear/TARpv24_pyhikonstruktsioonid/blob/master/oop/shop.py