DoDo / Programování

Mirek Kučera - vvendigo@seznam.cz

4. října

Instalace jazyka Python pro Windows

Stačí v Microsoft Store (ikona nákupní tašky) zahledat Python a nechat nainstalovat verzi 3.10 (ale pro naše účely lze použít i jakoukoli jinou verzi > 3.1).

Druhou možností, např. pro jiný operační systém, je stáhnout a nainstalovat balík z python.org.

V nabídce programů přibude Python a IDLE.

IDLE

Po spuštění se objeví tzv. konzole, do které můžeme psát matematické výrazy i jakékoli příkazy jazyka Python. Po stisknutí klávesy Enter se daný příkaz vyhodnotí.

Například:

>>> 10 + 190
200
>>> max(1, 3, 2)
3
>>> "+" * 20
'++++++++++++++++++++'

Zmínil jsem příkaz print() a jeho parametry sep a end:

>>> print()

>>> print(2, "plus", 2, "je", 2+2)
2 plus 2 je 4
>>> print(1, 2, 3, 4, sep="/")
1/2/3/4

11. října

První program

V menu IDLE vlevo nahoře, zvolíme File -> New File a otevře se okno editoru. První program bude opravdu jednoduchý:


print("Ahoj, Světe!")

Program spustíme pomocí menu editoru Run -> Run module. Před spuštěním musíme program uložit, spouští se ze souboru z disku.

Spuštění lze urychlit použitím klávesových zkratek: Ctrl+S (uložit) a pak F5 (spustit modul).

for cyklus

Opakované psaní stejné funkce je dost otravné. Proto počítačové jazyky obsahují konstrukci cyklu. V případe Pythonu je trochu specifická: for JMENO_PROMENNE in POSLOUPNOST_DAT:. Následující řádky, odsazené o stejný počet mezer jsou pak vykonány tolikrát, kolik je prvků v POSLOUPNOST_DAT (této skupině řádků se říká tělo cyklu). Pro naší raketu jsem to použil takto:

print("  I  ")
print(" XXX ")
print(" XOX ")
print(" XXX ")
print("XXXXX")
print("XXXXX")
print("XX XX")

for X in range(0, 40):
    print()

Funkce range(OD, DO, KROK) vyrobí potřebnou posloupnost dat - čísel od OD do čísla DO-1. Abychom viděli čísla co vyrobí v konzoli, musíme ji předat jako parametr do funkce list(), která z nich vyrobí seznam:

>>> range(0, 10)
range(0, 10)
>>> list( range(0, 10) )
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list( range(0, 10, 2) )
[0, 2, 4, 6, 8]
>>> list( range(10, 0, -1) )
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

V našem případě nás ta čísla ale nezajímají, jde nám jen o ten počet opakování cyklu. Kdybychom ale chtěli, můžeme v těle cyklu pracovat s proměnnou X (do které Python postupně dává čísla z posloupnosti), jak jsem ukazoval na "odpočtu před startem".

18. října

Proměnná

Použil jsem termín proměnná. Zjednodušeně lze říct, že je to pojmenování místa v paměti počítače, kam si ukládáme nějakou hodnotu. Např. číslo nebo text ("řetězec").

Proměnnou vyrobíme přiřazením - napíšeme nějaké jméno (může obsahovat velká a malá bez diakritiky, číslice a "podtržítka" [znak _]), znak = a hodnotu. Následně můžeme používat název proměnné tam, kde bychom jinak použili hodnotu:

>>> vyska_stromu = 12
>>> print("Strom měří", vyska_stromu, "metrů.")
Strom měří 12 metrů.
>>> jmeno = "Karel"
>>> print("Jmenuje se", jmeno, "a stoji u stromu mericiho", vyska_stromu, "metru.")
Jmenuje se Karel a stoji u stromu mericiho 12 metru.

Proměnné se hodí tam, kde chceme nějakou hodnotu použít opakovaně. Zároveň pak máme možnost ji měnit změnou na jednom místě programu.

Knihovny (moduly)

Python sám nabízí jen nejnutnější funkce. Pokud potřebujeme něco víc, musíme si do programu přidat knihovnu, která danou funkci obsahuje. Už základní instalace Pythonu ale obsahuje spoustu šikovných knihoven.

Nám by se hodilo odlet rakety trochu zpomalit. Na to lze použít funkci sleep() z knihovny time. Knihovnu načteme příkazem import:

import time

print("  I  ")
print(" XXX ")
print(" XOX ")
print(" XXX ")
print("XXXXX")
print("XXXXX")
print("XX XX")

for _ in range(0, 10):
    print(" ...")
    time.sleep(0.2)

for _ in range(0, 30):
    print("")
    time.sleep(0.1)

Komentáře

Do programu si můžeme psát poznámky, takzvané "komentáře". Jde to dvěma způsoby:

# <- pouzitim "hashtagu" - zbytek radku za timto znakem pocitac ignoruje

# lze ho napsat na samostatny radek

print("ahoj!") # ale i na konec radku, ktery neco vykonava

print("ale hashtag # uvnitr retezce jako komentar nefunguje")

# print(a + b) # komentar lze pouzit i na docasne "vypnuti" casti programu

# druhou moznosti je pouziti viceradkoveho retezce (misto jednech uvozovek se uzavira do trech):
"""
toto je
viceradkovy
komentar

tento kod se nevykona:
print("huhu")
"""

1. listopadu

Přerušení programu

Program lze přerušit stisknutím kláves Ctrl + C.

Funkce input()

Funkce input() dává uživateli možnost zadat nějakou vstupní hodnotu. Jako parametr se jí dává text výzvy:

a = input("Zadejte cislo: ")
a = int(a)

b = input("Zadejte druhe cislo: ")
b = int(b)

print("Souctem", a, "a", b, "je", a + b)

Typy proměnných

Narazili jsme na to, že Python rozlišuje typ proměnné nebo hodnoty. Například je rozdíl mezi číslem a řetězcem, protože některé operace nemusí pro různé typy hodnot dávat smysl. Třeba dělení řetězce číslem nebo jiným řetězcem:

>>> "karel" / 2
Traceback (most recent call last):
  File "", line 1, in 
TypeError: unsupported operand type(s) for /: 'str' and 'int'

# Ani retezec obsahujici cislo nebude fungovat.
# Python obsah retezce nezkouma, je to pro nej proste spatny typ hodnoty pro deleni:

>>> "6"/2
Traceback (most recent call last):
  File "", line 1, in 
TypeError: unsupported operand type(s) for /: 'str' and 'int'

Ukázali jsme si, že čísla v textu lze převést na správný typ hodnoty pomocí "funkcí" int() a float().

>>> int("123")
123
>>> float("1.23")
1.23
>>> int(123) / float("1.23")
100.0

Podmínka if

Často potřebujeme vykonat některé příkazy jen za určitých podmínek. Na to slouží konstrukce if LOGICKY_VYRAZ: následovaný blokem příkazů, které jsou vykonány, pokud platí LOGICKY_VYRAZ (má výslednou hodnotu True). Případně můžeme ještě doplnit blok else:, který se vykoná v opačném případě.

# priklady vyrazu

>>> 1 > 2
False

>>> 10 == 10
True

# to stejne s promennymi:
>>> a = 5
>>> b = 3
>>>
>>> a > b
True
>>> a == b
False
>>> a < b
False
>>> a != b
True
>>> a > 2
True

Příklad programu:

cislo = input("Zadejte cislo mensi nez 10: ")
cislo = int(cislo)

if cislo < 10:
    print("Velmi spravne!")
    print("Cislo", cislo, "je mensi nez 10.")
else:
    print("Ale, ale!")
    print("Cislo", cislo, "neni mensi nez 10.")

if cislo > 15:
    print("Je vetsi, a to o hodne!")

8. listopadu

Hra na hádání čísla

Proměnné, smyčky a podmínky jsme použili k vytvoření jednoduché hry.

Knihovna random obsahuje funkce, které vracejí náhodná čísla. My jsme použili randint(OD, DO), který vrátí celé číslo mezi OD a DO, včetně.

import random

print("Myslim si cislo od 1 do 10.")
print("Hadej, ktere to je! Mas 5 pokusu.")

cislo = random.randint(1, 10)
tip = 0

for kolo in range(1, 6):
    print(kolo, ". pokus.", sep="")
    vstup = input("Zadej svuj tip (1-10): ")
    tip = int(vstup)
    if tip == cislo:
        print("Spravne, je to", cislo, "!")
        break
    if tip < cislo:
        print("Me cislo je vetsi!")
    if tip > cislo:
        print("Me cislo je mensi!")

if tip != cislo:
    print("Neuhodl's! Bylo to cislo", cislo)

15. listopadu

Opakování

A simulace spoření.

22. listopadu

Knihovna turtle

from turtle import *

shape("turtle")
speed(2)

# nastaveni barev (cary a vyplne)
color("red")
fillcolor("yellow")

# "chytre" vykresleni ctverce:
for _ in range(4):
    forward(100)
    left(90)

# posuneme zelvu bez kresleni:
penup()
forward(100)
pendown()

# vyplneni obrazce:
begin_fill()
forward(50)
right(60)
forward(50)
right(60)
forward(50)
end_fill()

# schovani kresliciho obrazce:
hideturtle()

exitonclick()

Různé způsoby importu knihoven

# nasledujici kousky programu delaji to same:

# pokud naimportujeme knihovnu takto, musime pak pri volani funkci uvadet nazev knihovny:
import turtle
turtle.speed(1)

# nebo pri importu muzeme zmenit nazev pod kterym budeme knihovnu pouzivat
import turtle as t
t.speed(1)

# muzeme si nechat nastavit vsechny symboly (funkce, promenne a dalsi definice) z knihovny jako by byly definovany primo v programu:
from turtle import *
speed(1)
# ale pozor, muze dojit ke kolizi s nazvy, ktere pouzivate v programu nebo z jinych knihoven

# vybereme si, ktere symboly chceme:
from turtle import speed
speed(1)
# to je bezpecnejsi a nekdo to pouziva ke zvyseni citelnosti programu (je jasne, co presne se z knihovny pouziva)

# i konkretni funkci lze pri importu prejmenovat:
from turtle import speed as rychlost
rychlost(1)
# lze importovat i vice veci na jednom radku:
import random, time
from turtle import speed, forward as dopredu, left, right
# ale pozor na prehlednost

30. listopadu

Definice funkce

Pokud máme nějaký kód, který se opakuje na různých místech programu, můžeme ho přesunout do vlastní funkce a pak volat ji. Funkce se definuje pomocí klíčového slova def:

def JMENO_FUNKCE(JMENO_PARAMETRU1, JMENO_PARAMETRU2):
    # parametru muze byt libovolny pocet, v tele funkce je pak muzeme pouzivat jako promenne
    # telo funkce
    # ...
    return # Klicove slovo, ktere zpusobi navrat z funkce. Na konci nemusi byt - k navratu dojde automaticky.

# pokud za 'return' napiseme nejakou hodnotu, bude vysledkem volani nasi funkce: 

def soucet(a, b):
    vysledek = a + b
    return vysledek

print(soucet(1, 1))

# dalsi priklady:
from random import randint

def pozdrav_nebo_ne():
    if randint(0, 10) < 5:
        return
    print("Zdravim!")

pozdrav_nebo_ne() # pozdravi, nebo ne

def pozdrav_vicekrat(pozdrav, kolikrat):
    for _ in range(kolikrat):
        print(pozdrav)

pozdrav_vicekrat("Ahoj!", 10) # pozdravi 10x

Rozdíl mezi voláním funkce a funkcí jako hodnotou

Pokud napíšeme do programu samotná název funkce, funguje jako hodnota. Můžeme ho třeba přiřadit do proměnné nebo použít jako parametr. Právě pro předávání funkcí jako parametru se to často používá.

Pokud do programu napíšeme název funkce a za něj závorky (a do nich případně parametry), dojde k vykonání (takzvanému "zavolání") funkce. Výslednou hodnotou bude buď None, nebo výsledek, který funkce vrátí pomocí return.

# funkce jako hodnota:

print # neudela nic, proste hodnota, kterou nijak nepouzijeme

moje_promenna = print # prirazeni do promenne

# nasledne muzeme pouzit zavolani:
moje_promenna("Ahoj!")


# volani funkce:

print() # to zname...

soucet = max(1, 3) # funkce vybere vetsi z cisel a vysledek se zapise do nasi promenne