Cvičení č. 5 rozšířené o poznámky ze cvičení a řešení některých příkladů (ZS 2026/27)¶

V minulém díle jste viděli...¶

Data, se kterými pracuje počítač, jsou vždy zakódována v binární soustavě, bez ohledu na to, v jaké soustavě nebo multimediální reprezentaci jsou zobrazena uživateli na výstupu nebo vstupu.

Základní aritmetické typů v jazyku Python jsou bool, int, float a complex. Kromě booleovských konstant True a False existuje také speciální hodnota None, která má svůj vlastní typ. Čísla můžeme zadávat v desítkové, dvojkové, osmičkové nebo šestnáctkové soustavě:

In [1]:
print(11)
print(0o11)
print(0x11)
print(0b11)
11
9
17
3

S číselnými hodnotami můžeme provádět běžné aritmetické operace pomocí operátorů +, -, *, /, //, % a **. Také jsou k dispozici funkce abs, min, max a můžeme importovat modul math pro zpřístupnění matematických konstant a funkcí:

In [2]:
import math

print("Číslo π je přibližně", math.pi)
print("Hodnota cos(π) je ", math.cos(math.pi))
Číslo π je přibližně 3.141592653589793
Hodnota cos(π) je  -1.0

Komentáře v jazyku Python¶

Důležitým prvkem programovacích jazyků, který však nemá vliv na vykonávání kódu, jsou komentáře. Komentáře ve zdrojovém kódu programu slouží programátorům k bližšímu vysvětlení příkazu nebo bloku příkazů, které se v programu vyskytují, a umožňují tak program učinit pro lidi pochopitelnějším. Na rozdíl od ostatních prvků jazyka Python nejsou komentáře vázány žádnými syntaktickými pravidly – interpret je zcela ignoruje, pro něj je komentář ekvivalentem mezery: kam se smí vložit mezera, tam se smí vložit komentář.

V jazyku Python komentáře začínají znakem # a končí na konci řádku:

In [3]:
# první komentář
a = 1
b = 2 # druhý komentář
c = 3 # třetí komentář

Pokud je komentář delší, typicky pokud komentuje několik příkazů společně, můžeme jej rozdělit na několik řádků. Takové blokové komentáře je běžné psát před kód, který komentují:

In [36]:
# Zde nastavíme poloměr kruhu, spočítáme jeho obvod,
# a výslednou hodnotu vypíšeme pomocí funkce print.
import math
r = 1.5
obvod = 2 * math.pi * r
print("Obvod kruhu je", obvod)
Obvod kruhu je 9.42477796076938
In [37]:
"""
Zde nastavíme poloměr kruhu, spočítáme jeho obvod,
a výslednou hodnotu vypíšeme pomocí funkce print.
"""
r = 1.5
obvod = 2 * math.pi * r
print("Obvod kruhu je", obvod)
Obvod kruhu je 9.42477796076938
In [39]:
4 + 3
r = 1.5
obvod = 2 * math.pi * r
print("Obvod kruhu je", obvod)
Obvod kruhu je 9.42477796076938

Strukturování programu: podmínky a cykly¶

Potřebujeme-li se v programu rozhodnout, jak dále řešit zadanou úlohu, používáme podmíněný příkaz, který vyhodnotí zadanou podmínku a na základě obdrženého výsledku se rozhodne, které příkazy bude provádět dál. Dalším velmi častým prvkem pro strukturování programu jsou cykly, které umožňují provádět určité příkazy opakovaně.

Podmíněný příkaz¶

Podmíněný příkaz začíná klíčovým slovem if, za nímž následuje podmínka a dvojtečka (znak :). Podmínku podmíněného příkazu může tvořit libovolný booleovský výraz (resp. libovolný výraz, který lze převést na typ bool) a tělo podmíněného příkazu je tvořeno blokem příkazů, které se mají provést v případě, je-li podmínka splněna:

In [22]:
a = 1
if a > 0:
    print("číslo je kladné")
    print("číslo se rovná", a)
print("provede se vzdy")
číslo je kladné
číslo se rovná 1
provede se vzdy
In [1]:
a = -1
if a > 0:
    print("číslo je kladné")
    print("číslo se rovná", a)
print("provede se vzdy")  

# tyto i předchozí buňku si pusťte v pytutoru
provede se vzdy
In [2]:
# správné odsazení je důležité:
a = 1
if a > 0:
    print("číslo je kladné")    
     print("číslo se rovná", a)
print("provede se vzdy")
  Cell In[2], line 5
    print("číslo se rovná", a)
    ^
IndentationError: unexpected indent
In [4]:
# správné odsazení je důležité:
a = 1
if a > 0:
    print("číslo je kladné")
    
    print("číslo se rovná", a)
 print("provede se vzdy")
  File <string>:7
    print("provede se vzdy")
                            ^
IndentationError: unindent does not match any outer indentation level

Univerzální syntaktické pravidlo:

Ve všech případech, kde znak : uvozuje nějaký blok příkazů, ať už jde o podmíněný příkaz, cyklus nebo definici nějakého objektu, musí být všechny příkazy, které do daného bloku patří, odsazeny stejným počtem mezer.

Běžně se používá konvence odsazování pomocí 4 mezer. Přesný počet mezer sice není určen syntaktickými pravidly jazyka, ale všichni se této konvence budeme držet. Také pozor na míchání znaků "mezera" (" ", číslo 40 v ASCII) a "tabulátor" (" ", reprezentován symbolem "\t", číslo 9 v ASCII).

Za jednoduchým podmíněným příkazem může následovat příkaz else, který uvozuje blok příkazů, které se mají provést, pokud podmínka v předchozím příkazu if není splněna:

In [29]:
# Větev else
a = 0
if a > 0:
    print("číslo je kladné")
    print("číslo se rovná", a)
else:
    print("číslo není kladné")
    print("číslo se rovná", a)
print("provede se vzdy")
číslo není kladné
číslo se rovná 0
provede se vzdy
In [15]:
vek = 25

kategorie = "plná cena"
cena = 200

if vek > 65:
    kategorie = "sleva"
    cena = 100
    
print(kategorie, cena)    
plná cena 200
In [17]:
vek = 25

kategorie = ""
cena = 0

if vek > 65:
    kategorie = "sleva"
    cena = 100
else:
    kategorie = "plná cena"
    cena = 200
    
print(kategorie, cena)    
plná cena 200

Podmíněné příkazy lze samozřejmě vnořovat, přičemž je nutné dbát na správnou úroveň odsazení vnořených příkazů:

In [13]:
# Podmínky můžeme vnořovat do sebe:
a = 0
if a > 0:
    print("číslo je kladné")
    print("číslo se rovná", a)
else:
    if a == 0:
        print("číslo se rovná 0")
    else:
        print("číslo není kladné")
        print("číslo se rovná", a)
číslo se rovná 0

Mezi příkazy if a else spolu s jejich bloky příkazů může ještě vystupovat libovolný počet příkazů elif (zkratka pro else-if), které umožňují provádět ověření dodatečné podmínky v případě, že žádná z předchozích podmínek nebyla splněna. Předchozí příklad tedy můžeme zjednodušit takto:

In [6]:
# větve elif - výpočet spadne do první větve, kde podmínka platí
# ukázali jsme si, jak to funguje, pokud je pravdivých více podmínek
a = 100
if a > 0:
    print("číslo je kladné")
    print("číslo se rovná", a)
elif a == 0:
    print("číslo se rovná 0")  
elif a > 10: # neprovede se!
    print("číslo vetsi nez 10") 
else:
    print("číslo není kladné")
    print("číslo se rovná", a)
číslo je kladné
číslo se rovná 100

Porovnávací operátory¶

V jazyku Python jsou k dispozici následující operátory pro porovnávání hodnot výrazů:

Operátor Význam
== Rovnost dvou hodnot. Pozor: neplést s přiřazovacím operátorem =.
!= Nerovnost dvou hodnot ($a \ne b$).
< Ostře menší.
> Ostře větší.
<= Menší nebo rovno ($\le$).
>= Větší nebo rovno ($\ge$).

Jazyk Python dále umožňuje provádět zřetězené porovnávání. Např. výraz x < y <= z > a je ekvivalentní výrazu x < y and y <= z and z > a.

Všechny operátory jsou k dispozici pro datové typy, kde uvedený význam má smysl (např. operátory <, >, <=, >= nejsou k dispozici pro komplexní čísla, kombinace číslo a textový řetězec, apod.) a jejich výsledek je booleovská hodnota True nebo False.

In [7]:
# Podmínka může být složitější: použijeme operátory and, or, not
# Operátory pro porovnávání: ==, !=, >, <, >=, <=
vek = 40
skupinova_sleva = True

kategorie = "plna cena"
cena = 200
if vek <= 15 or vek > 65 or skupinova_sleva:
    kategorie = "sleva"
    cena = 100
print(kategorie, cena)
sleva 100
In [16]:
# TODO: zřetězené porovnání
x = 0
if x < 10 and x > 3:
    print("ano, je z intervalu")
else:
    print("ne, x není z intervalu")
ne, x není z intervalu
In [8]:
x = 5
if 3 < x < 10 == 10.0:
    print("ano, je z intervalu")
else:
    print("ne, x není z intervalu")
ano, je z intervalu

V podmíněných příkazech, kde je očekávána booleovská hodnota, je možné použít libovolný výraz, jehož hodnotu lze implicitně převést na typ bool. Převod se řídí těmito pravidly: None → False, 0 → False, 0.0 → False, complex(0, 0) → False, všechny ostatní číselné hodnoty → True.

In [9]:
# jako podmínka může sloužit i výraz, jehož hodnota lze implicitně převést na bool:
x = 10
if x != 0:
    print("ano")
else:
    print("ne")
ano
In [10]:
# jako podmínka může sloužit i výraz, jehož hodnota lze implicitně převést na bool:
x = 10
if x:
    print("ano")
else:
    print("ne")
ano
In [12]:
x = -100
if x + 2.6:
    print("ano")
else:
    print("ne")
ano
In [13]:
if "False":
    print("ano")
else:
    print("ne")
ano
In [14]:
if "":
    print("ano")
else:
    print("ne")
ne
In [32]:
# operátory == a !=
a = 3
b = 1 + 2
a == b
Out[32]:
True
In [15]:
# čísla typu float neporovnáváme pomocí == a !=, ale lépe pomocí přibližného porovnání:
a = 0.3
b = 0.1 + 0.2
if a == b:
    print("ano")
else:
    print("ne")
ne
In [35]:
a = 0.3
b = 0.1 + 0.2
abs(a - b) < 1e-9
Out[35]:
True
In [36]:
a = 0.3
b = 0.1 + 0.2
math.isclose(a, b)
Out[36]:
True

Příklady¶

  1. Sudé-liché. Napište program, který zjistí a vypíše, zda je zadané číslo sudé nebo liché.
In [17]:
# %
cislo = int(input("Zadej cislo"))
if cislo % 2 == 1:
    print(cislo, "je liche")
else:
    print(cislo, "je sude")
4 je sude
In [18]:
cislo = int(input("Zadej cislo"))
if cislo % 2:
    print(cislo, "je liche")
else:
    print(cislo, "je sude")
4 je sude
In [19]:
cislo = int(input("Zadej cislo"))
if not cislo % 2:
    print(cislo, "je sude")
else:
    print(cislo, "je liche")
4 je sude
  1. Je větší. Napište program, který zjistí a vypíše, které ze dvou zadaných čísel je větší.
In [20]:
a = int(input("Zadej první číslo"))
b = int(input("Zadej druhé číslo"))
if a > b:
    print(a, "je větší než", b)
elif a == b:
    print("čísla jsou stejná")
else:
    print(b, "je větší než", a)
6 je větší než 4
  1. Je největší. Napište program, který zjistí a vypíše, které ze tří zadaných čísel je největší.
In [21]:
a = int(input("Zadej první číslo"))
b = int(input("Zadej druhé číslo"))
c = int(input("Zadej třetí číslo"))
if a >= b and a >= c:
    print(a, "je největší.")
elif b >= a and b >= c:
    print(b, "je největší.")
else:
    print(c, "je největší.")
7 je největší.
In [24]:
x = int(input("Zadej první číslo"))
y = int(input("Zadej druhé číslo"))
z = int(input("Zadej třetí číslo"))
print("nejvetsi je", max(x, y, z))

if x >= y and x >= z:
    print(x, "je nejvetsi (první číslo)")
if y >= x and y >= z:
    print(y, "je nejvetsi (druhé číslo)")
if z >= x and z >= y: 
    print(z, "je nejvetsi (třetí číslo)")
nejvetsi je 4
4 je nejvetsi (první číslo)
4 je nejvetsi (druhé číslo)
4 je nejvetsi (třetí číslo)
  1. Seřaď. Napište program, který vypíše tři zadaná čísla v pořadí od největšího po nejmenší.
In [40]:
x = int(input("Zadej první číslo"))
y = int(input("Zadej druhé číslo"))
z = int(input("Zadej třetí číslo"))
if x >= y >= z:
    print(x, y, z)
elif x >= z >= y:
    print(x, z, y)
elif y >= x >= z:
    print(y, x, z)
elif y >= z >= x:
    print(y, z, x)
elif z >= x >= y:
    print(z, x, y)
else:
    print(z, y, x)
5 5 4
  1. Trojúhelník. Napište program, který zjistí a vypíše, zda lze sestrojit trojúhelník zadaný pomocí tří délek stran.
In [50]:
a = int(input("Zadej stranu a"))
b = int(input("Zadej stranu b"))
c = int(input("Zadej stranu c"))
if (a + b > c) and (a + c > b) and (b + c > a):
    print("ano")
else:
    print("ne")
ano
In [44]:
a = float(input("zadej stranu a"))
b = float(input("zadej stranu b"))
c = float(input("zadej stranu c"))

if a > b and a > c and  b + c > a:
    print("ano, jde to")
elif b > c and b > a and  a + c > b:
    print("ano, jde to")
elif c > b and c > a and  a + b > c:
    print("ano, jde to")
else:
    print("ne, nejde to")
ne, nejde to
  1. Test plnoletosti. Napište program, který se zeptá uživatele na věk a odpoví, zda je plnoletý.
In [ ]:
 

Příkaz while – cyklus se vstupní podmínkou¶

Příkaz while je variantou cyklu, který umožňuje ověření libovolné podmínky. Obecná syntaxe vypadá takto:

while nějaká_podmínka:
    tělo_cyklu
    ...

K ověření podmínky dochází vždy před provedením příkazů z těla cyklu. Interpretace chování příkazu while tedy je: dokud platí podmínka, prováděj příkazy.

Příklad: následující program vypíše všechna čísla od 0 do 10 včetně:

In [27]:
# program vypíše všechna čísla od 0 do 5 včetně:
# zkuste si v pytutoru
n = 0
while n <= 5:
    print(n)
    n += 1
0
1
2
3
4
5
In [26]:
# print co místo odřádkování končí mezerou ... výpis na jedem řádek
print ("ahoj", end = " ")
print ("ahoj", end = " ")
ahoj ahoj 
In [45]:
# program vypíše všechna čísla od 0 do 10 včetně, výpis na jeden řádek:
n = 0
while n <= 10:
    print(n, end = " ")
    n += 1
0 1 2 3 4 5 6 7 8 9 10 
In [54]:
# program vypíše mocniny dvojky 2^0 ... 2^10:
n = 0
while n <= 10:
    print(2 ** n, end = " ")
    n += 1
1 2 4 8 16 32 64 128 256 512 1024 
In [46]:
# cykly a podmínky můžeme vnořovat:
# program vypíše jen sudá čísla z posloupnosti čísel od 0 do 10 (včetně)
n = 0
while n <= 10:
    if n % 2:
        print(n, end = " ")
    n += 1
1 3 5 7 9 
In [47]:
# cyklus můžeme ukončit příkazem break:
# zkuste si v pytutoru
n = 0
while n <= 10:
    if n == 2:
        break
    print(n, end = " ")
    n += 1
0 1 
In [49]:
# continue - okamžitě ukončí aktuální iteraci cyklu:
n = 0
while n <= 10:
    if n % 2:
        n += 1
        continue
    print(n, end = " ")
    n += 1
0 2 4 6 8 10 
In [49]:
# bez continue se snadno obejdeme (využijeme else):
n = 0
while n <= 10:
    if n % 2:
        n += 1
    else:
        print(n, end = " ")
        n += 1
0 2 4 6 8 10 
In [48]:
# while True + break
while True:
    x = input("uz je konec?")
    if x == "ano":
        break
    print("pokracuji")
pokracuji
pokracuji
pokracuji
In [28]:
# cyklus se neprovede ani jednou:
n = 20
while n <= 10:
    print(n, end = " ")
    n += 1
print("pokracuj")
pokracuj
In [51]:
# program se může tzv. zacyklit (pokud podmínku neuděláme správně)
n = 5
while n > 0:
    #print(n, end = " ")
    n += 1
print("pokracuj")
---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
Cell In[51], line 4
      1 n = 5
      2 while n > 0:
      3     #print(n, end = " ")
----> 4     n += 1
      5 print("pokracuj")

KeyboardInterrupt: 
In [30]:
7 + 4
Out[30]:
11
In [31]:
# součet čísel od 0 do 10:
n = 0
soucet = 0
while n <= 10:
    #print(n, end=" ")
    soucet += n
    n += 1
print("soucet:", soucet)
soucet: 55
In [32]:
# počet sudých čísel mezi 0 a 10:
n = 0
pocet = 0
while n <= 10:
    if n % 2 == 0:
        #print(n, end=" ")
        pocet += 1
    n += 1
print("pocet:", pocet)
pocet: 6

Tip: Kliknutím na tlačítko pytutor v rozhraní JupyterLab se zobrazí grafická interpretace toho, co se v programu děje.

Příkaz for – cyklus s parametrem¶

Příkaz while je sice obecný cyklus (umožňuje ověřovat libovolnou podmínku), ale často je poměrně nešikovný, protože musíme sami zajistit správný přechod na následující iteraci. Alternativní příkaz for je užitečný v případech, kdy chceme opakovat příkazy pro předem známou sadu hodnot.

Obecná syntaxe příkazu for vypadá takto:

for parametry_cyklu in zdroj:
    tělo_cyklu

Parametr cyklu bývá většinou jen jeden. Může jich být i více, ale pak potřebujeme zdroj, který v každém kroku dodává příslušně velkou sadu hodnot.

Jako zdroj hodnot pro příkaz for může sloužit mnoho různých objektů, např. kontejnery a datové struktury, se kterými se seznámíme později. Dnes si ukážeme jen základní, ale velmi častý zdroj hodnot: funkci range, která představuje posloupnost celých čísel v určitém rozmezí. Chování funkce range se liší podle počtu (celočíselných!) argumentů, které jí předáme:

  1. Zadáme-li jeden argument, zdroj představuje posloupnost celých čísel od nuly až po zadanou hodnotu, ale tu už ne. Zadáte-li proto jako argument nulu nebo nějaké záporné číslo, dostaneme prázdnou posloupnost. Následující program vypisuje čísla od 0 do 10 včetně:
In [53]:
for n in range(11):
    print(n)
0
1
2
3
4
5
6
7
8
9
10
In [54]:
# udělej něco pětkrát:
for n in range(5):
    print("ahoj")
ahoj
ahoj
ahoj
ahoj
ahoj
In [63]:
# program vypíše všechna čísla od 0 do 10 včetně:
for n in range(11):
    print(n, end = " ")
0 1 2 3 4 5 6 7 8 9 10 
In [55]:
# program vypíše mocniny dvojky 2^0 ... 2^10
for n in range(11):
    print(2 ** n, end = " ")
1 2 4 8 16 32 64 128 256 512 1024 
In [56]:
# cykly a podmínky můžeme do sebe vnořovat:
# program vypíše jen sudá čísla z intervalu od 0 do 10 (včetně)
for n in range(11):
    if n % 2:
        print(n, end = " ")
1 3 5 7 9 
  1. Zadáme-li dva argumenty, zdroj představuje posloupnost celých čísel od hodnoty prvního argumentu po hodnotu druhého, ale hodnotu druhého už ne. Následující program vypisuje hodnoty od 7 do 10 včetně:
In [9]:
for n in range(7, 11):
    print(n, end = " ")
7 8 9 10 
In [33]:
# cyklus se neprovede ani jednou:
for n in range(11, 7):
    print(n, end = " ")
In [59]:
for n in range(2, 11, 3):
    print(n, end = " ")
2 5 8 
In [11]:
for n in range(22, 11, -1):
    print(n, end = " ")
22 21 20 19 18 17 16 15 14 13 12 
In [34]:
# cyklus se neprovede ani jednou:
for n in range(2, 11, -1):
    print(n, end = " ")
  1. Zadáme-li tři argumenty, zdroj představuje posloupnost celých čísel od hodnoty prvního argumentu až po hodnotu druhého (jeho hodnotu už ne) s krokem zadaným ve třetím argumentu. Pro kladný krok bude posloupnost rostoucí, pro záporný bude klesající.
In [12]:
for n in range(10, 0, -3):
    print(n, end = " ")
10 7 4 1 

Příklady¶

  1. Součet čísel pomocí for cyklu. Napište program, který sečte čísla od 1 do n (pomocí for cyklu).
In [45]:
# kontrola:
n = int(input("Zadej číslo:"))
součet = (n * (n + 1)) // 2
print("Součet čísel je", součet) 
Součet čísel je 5050
In [48]:
# a) pomoci for cyklu
# mezikrok
for i in range(1, n + 1):  # pozor, použijte jinou řídící proměnnou
    print(i, end = " ")
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 
In [46]:
# a) pomoci for cyklu: místo výpisu sčítám
součet = 0
for i in range(1, n + 1):  # pozor, použijte jinou řídící proměnnou
    součet += i
    
print("Součet čísel je", součet)
Součet čísel je 5050
In [ ]:
# to same pomoci while cyklu
In [49]:
# b) totéž pomocí while cyklu
n = int(input("Zadej číslo:"))
součet = 0
i = 1
while i <= n:
    součet += i
    i += 1
print(součet) 
5050
  1. Sudé-liché podruhé. Napište program, který bude pořád dokola žádat uživatele, aby zadal celé číslo, a poté vypíše, jestli je zadané číslo sudé nebo liché. Jakmile uživatel napíše "konec", tak program skončí.
In [51]:
s = input("Zadej cele cislo")
while s != "konec":
    n = int(s)
    if n % 2:
        print(n, "je liche")
    else:
        print(n, "je sude")
    s = input("Zadej cele cislo")
45 je liche
40 je sude
In [ ]:
while True:
    s = input("Zadej cele cislo")
    if s == "konec":
        break
    n = int(s)
    if n % 2:
        print(n, "je liche")
    else:
        print(n, "je sude")
  1. Načti a sečti čísla. Napište program, který postupně načítá čísla ze vstupu, dokud nepřijde prázdný řetězec "". Pak vypíše počet zadaných čísel a jejich součet.
In [77]:
soucet = 0
pocet = 0
while True:
    s = input("Zadej cislo")
    if s == "":
        break
    x = float(s)
    soucet += x
    pocet += 1

print(pocet, soucet)
    
2 47.3
  1. Chci číslo z intervalu. Program-kecálek čte čísla od uživatele, dokud uživatel nezadá číslo z požadovaného intervalu. Pak mu poděkuje a vypíše počet neúspěšných pokusů.
In [53]:
a = 3
b = 4
pokusu = 0
print("Zadej cislo z intervalu (", a, ",",b, ")" )
while True:
    x = float(input("zadej cislo"))
    if a < x < b:
        print("Prima, zadal jsi číslo ", x, ", počet neúspěšných pokusů je ", pokusu)
        break
    pokusu += 1
Zadej cislo z intervalu ( 3 , 4 )
Prima, zadal jsi číslo  3.5 , počet neúspěšných pokusů je  4
  1. Posloupnost. Napište program, který vypíše prvních n členů následující posloupnosti: 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 ...
In [86]:
# a) pro 5 clenu vypis 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5
n = 5
for i in range(1, n + 1):
    for j in range(1, i + 1):
        print(j, end = " ")
    # print()
1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 
In [87]:
# b) pro 5 clenu vypis 1 1 2 1 2
n = 5
pocet = 0
for i in range(1, n + 1):
    for j in range(1, i + 1):
        print(j, end = " ")
        pocet += 1
        if pocet == n:
            break
    if pocet == n:
            break
1 1 2 1 2