Přednášející:
kybic@fel.cvut.cz
Stránky předmětu:
Řešení problémů
Napíšeme do příkazové řádky python3
:
!python3
(nebo spustíme IDE prostředí jako idle
, nebo Jupyter notebook... Možností je mnoho)
>python3
Python 3.4.3 (default, Oct 14 2015, 20:28:29)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 3+8
11
>>> 11*(5+3)
88
>>> 128./16.
8.0
>>> 2**16
65536
totéž, hezky vysázeno
3+8
11*(5+3)
128./16.
2**16
Výrazy (expressions) obsahují
3
, 8
, ...128.
, 11.5
,...+
, -
, /
, *
, ...(
, )
python3
, interpret Pythonu>>>
a=3
b=3+a
Jaká je hodnota proměnné b?
b
boys=15
girls=17
total=boys+girls
difference=girls-boys
ratio=boys/total
total
difference
ratio
a=10
a=a-2
a=a*2
Jaká je hodnota a?
a
# Vypíše pozdravení
print("Hello world")
hello_world.py
>python3 hello_world.py
!python3 hello_world.py
Editory: Emacs, gEdit, joe, ...
spouštění
Integrované prostředí: IDLE, PyCharm, Eclipse, ...
Kolik ${}^\circ C$ je $75^\circ F$?
f=75
c=(f-32)*5./9.
print(c)
Trochu hezčí výpis (pro pokročilé):
print(f,"stupňů Fahrenheita je",c,"stupňů Celsia.")
print("%f stupňů Fahrenheita je %f stupňů Celsia." % (f,c))
print
vytiskne své argumentyprint
může být číslo nebo řetězec%f
do řetězce doplní reálná čísla z dalších argumentůprint("%0.1f stupňů Fahrenheita je %0.1f stupňů Celsia." %
(f,c))
Co když chceme převést hodnot více? Kolik ${}^\circ C$ je $30^\circ F$?
Do souboru convert1.py
uložíme jednotlivé příkazy:
# Program pro převod stupňů Fahrenheita na stupně Celsia
f=75
c=(f-32)*5./9.
print("%0.1f stupňů Fahrenheita je %0.1f stupňů Celsia." % (f,c))
a spustíme z příkazové řádky (i opakovaně)
>python3 convert1.py
!python3 convert1.py
Náš program počítá pořád to samé... není flexibilní.
Vylepšená verze (convert2.py
):
# Program convert2.py pro převod stupňů Fahrenheita na stupně Celsia
import sys
f=int(sys.argv[1]) # první argument
c=(f-32)*5./9.
print("%0.1f stupňů Fahrenheita je %0.1f stupňů Celsia." % (f,c))
Argument (stupně Fahrenheita) zadáme pří spouštění:
!python3 convert2.py 60
!python3 convert2.py 90
!python3 convert2.py -20
Gratuluji, tohle je náš první užitečný program!
Poznámky:
import sys
zpřístupní knihovnu sys
- vysvětlíme později.sys.argv[1]
je první argument, sys.argv[2]
druhý, atd.# Program convert2.py pro převod stupňů Fahrenheita na stupně Celsia
import
import keyword
print(keyword.kwlist)
f
, c
, print
, ...
Písmena, čísla, podtržítka, nezačíná číslem,není klíčové slovo +
,-
,*
,/
,=
,...32
,-20
,...5.
, 9.
, 32.3
, 1.3e-6
($1.3\cdot 10^{-6}$)..."Hello world"
, 'xyz'
,"%0.1f stupňů Fahrenheita je %0.1f stupňů Celsia."
...(neúplný přehled)
c=(f-32*5./9.
prnt("%0.1f stupňů Fahrenheita je %0.1f stupňů Celsia." % (f,c))
!python3 convert2.py 20c
Program skončil chybou = "spadnul" (crashed)
c=(f-32)+5./9.
print("%0.1f stupňů Fahrenheita je %0.1f stupňů Celsia." %
(f,c))
8>3
10<=10
1==0
2!=3
a=4
b=6
a<b
Operátory >
,<
,==
,>=
,<=
,!=
.
Vracejí True
nebo False
(typ bool
).
if
)¶# Program conditionals.py pro demonstraci podmíněných příkazů
import sys
n=int(sys.argv[1]) # první argument - celé číslo
if n>0:
print(n,"je kladné číslo")
print("Konec programu.")
!python3 conditionals.py 10
!python3 conditionals.py -1
Bloky kódu = základ strukturovaného programování.
if-else
)¶# Program conditionals2.py pro demonstraci podmíněných příkazů
import sys
n=int(sys.argv[1]) # první argument
if n>0:
print(n,"je kladné číslo")
else:
print(n,"není kladné číslo")
!python3 conditionals2.py 14
!python3 conditionals2.py -3
# Program conditionals3.py pro demonstraci podmíněných příkazů
import sys
n=int(sys.argv[1]) # první argument
if n>0:
print(n,"je kladné číslo")
else:
if n==0:
print(n,"je nula")
else:
print(n,"je záporné číslo")
!python3 conditionals3.py 14
!python3 conditionals3.py -3
!python3 conditionals3.py 0
# Program conditionals4.py pro demonstraci podmíněných příkazů
import sys
n=int(sys.argv[1]) # první argument
if n>0:
print(n,"je kladné číslo")
elif n==0:
print(n,"je nula")
else:
print(n,"je záporné číslo")
!python3 conditionals4.py 14
!python3 conditionals4.py -3
!python3 conditionals4.py 0
Vytiskněte maximum tří vstupních čísel.
# maximum.py - Vytiskne maximum tří zadaných čísel
import sys
a=int(sys.argv[1])
b=int(sys.argv[2])
c=int(sys.argv[3])
if a>b: # maximum je a nebo c
if a>c: # a>b, a>c
print(a)
else: # c >= a > b
print(c)
else: # b >= a
if b>c: # b > c, b >= a
print(b)
else: # c >= b >= a,
print(c)
!python3 maximum.py 10 29 3
Takové funkce už v Pythonu samozřejmě jsou...
max(10,29,3)
!python3 conditionals4.py
sys.argv
- seznam vstupních parametrůlen(sys.argv)
- počet prvků seznamu = počet parametrů ₊ 1sys.argv[0]
- nultý parametr = jméno programu (např. "conditionals4.py")sys.argv[1]
- první parametr = první uživatelský argument# Program conditionals5.py pro demonstraci podmíněných příkazů
import sys
if len(sys.argv)!=2:
print("Zadej cele cislo")
else:
n=int(sys.argv[1]) # první argument
if n>0:
# zde následuje původní kód
print(n,"je kladné číslo")
elif n==0:
print(n,"je nula")
else:
print(n,"je záporné číslo")
!python3 conditionals5.py 1
!python3 conditionals5.py
# Program conditionals6.py pro demonstraci podmíněných příkazů
import sys
if len(sys.argv)<=1:
print("Zadej jedno cele cislo")
sys.exit() # ukončí program
# zde následuje původní program
n=int(sys.argv[1]) # první argument
if n>0:
print(n,"je kladné číslo")
elif n==0:
print(n,"je nula")
else:
print(n,"je záporné číslo")
Funguje stejně jako conditionals5.py
.
for
)for
)while
)for i in range(10):
print("Budu se pilně učit.")
for i in range(10):
print("Budu se pilně učit.")
for
cyklus¶Proměnná v příkazu
for <promenna> in range(n):
<blok>
nabírá postupně hodnoty $0\dots n-1$:
for i in range(5):
print("i=",i)
Funkce range
může mít i parametry start
a step
.
help(range)
Nastavení počáteční hodnoty cyklu:
for i in range(1,5):
print("i=",i)
Nastavení kroku 3, počáteční číslo 1, horní hranice 10:
for i in range(1,10,3):
print("i=",i)
Můžeme počítat i sestupně (počáteční hodnota 5, krok 1, spodní hranice 0):
for i in range(5,0,-1):
print("i=",i)
for f in range(0,110,10):
c=(f-32)*5./9.
print("%5.1fF = %5.1fC" % (f,c))
tabulka_fahrenheit.py
Vypočítejte $\sum_{i=1}^{10} i$:
s=0
for i in range(1,101):
s=s+i
print("Soucet je ",s)
Kontrola:
$$\sum_{i=1}^{n} i = \frac{n (n+1)}{2}$$Blok kódu může obsahovat další (vnořené) bloky.
Příklad: násobilka (soubor nasobilka.py
)
n=5
for i in range(1,n+1):
for j in range(1,n+1):
print("%2d * %2d = %2d" % (i,j,i*j))
!python3 nasobilka.py
i=5
while i>0:
print("i=",i)
i=i-1
Cyklus while
může nahradit cyklus for
, ale nikoliv naopak
10/3
10//3
a zbytek po dělení (operace modulo)
10%3
Vždy platí: (n//k)*k+(n%k)=n
(100//7)*7+(100%7)
Myšlenka: Spočítáme, kolikrát lze dělit deseti, než se dostaneme k nule.
c=1 # počet číslic
while n>10:
n=n//10 # celočíselné dělení
c=c+1
print("Počet číslic=%d" % c)
Celý program včetně kontroly vstupů:
# %load pocet_cislic.py
# Spočítej, kolik číslic má dané přirozené číslo
import sys
if len(sys.argv)!=2:
print("Chyba: zadej jedno přirozené číslo.")
sys.exit()
n=int(sys.argv[1])
if n<1:
print("Chyba:",n,"není přirozené číslo!")
sys.exit()
print("Bylo zadáno číslo", n)
# tady začíná vlastní výpočet
c=1 # počet číslic
while n>10:
n=n//10 # celočíselné dělení
c=c+1
print("Počet číslic=%d" % c)
Místo c=c+1
píšeme c+=1
. Totéž funguje i pro další operátory. Místo:
c=1 # počet číslic
while n>10:
n=n//10 # celočíselné dělení
c=c+1
print("Počet číslic=%d" % c)
napíšeme (soubor pocet_cislic2.py
)
c=1 # počet číslic
while n>10:
n//=10 # celočíselné dělení
c+=1
print("Počet číslic=%d" % c)
Vinou chyby program nikdy neskončí.
n=982
c=1 # počet číslic
while n>10:
n//10 # celočíselné dělení
c+=1
print("Počet číslic=%d" % c)
break
, continue
)¶V těle cyklu for
nebo while
:
break
ukončí celý cykluscontinue
přeruší aktuální iteraci a začne následujícífor i in range(5):
if i==3:
break
print(i)
for i in range(5):
if i==3:
continue
print(i)
prvočíslo $n>1$ je dělitelné pouze 1 a $n$.
$2,3,5,7,11,13,17,19,23,29,\dots$
Test dělitelnosti v Pythonu:
10 % 3 == 0
10 % 5 == 0
Úkol 1: Napište program, který zjistí, zda je zadané číslo prvočíslo.
Zkusím dělit zadané číslo $n$ čísly $p \in 2\dots n-1$, jestli $p\mid n$. (soubor prvocislo1.py
)
# Test prvočiselnosti zadaného čísla
import sys
n=int(sys.argv[1]) # číslo, které testujeme
p=2
while p<n:
if n % p == 0:
break
p+=1
if p<n:
print(n, "není prvočíslo, je dělitelné", p)
else:
print(n, "je prvočíslo")
!python3 prvocislo1.py 17
!python3 prvocislo1.py 15
Otázka: Je 1 prvočíslo?
Úkol 2: Napište program, vypíše všechna prvočísla menší než $m$. (soubor prvocislo2.py
)
# Vypíše prvočísla menší než zadaný limit
import sys
m=int(sys.argv[1])
for n in range(2,m): # cyklus 2..m-1
p=2 # začátek testu
while p<n:
if n % p == 0:
break
p+=1
if p==n: # n je prvočíslo
print(n,end=", ")
print(n) # závěrečný konec řádky
Poznámka: print(n)
místo print(n,end=", ")
by psalo každé číslo na vlastní řádku
!python3 prvocislo2.py 1000
Myšlenka: Stačí testovat pro $p\le\sqrt{n}$, neboť pokud $n=a b$, pak buď $a\le\sqrt{n}$ nebo $b\le\sqrt{n}$.
# prvocislo3.py - Vypíše prvočísla menší než zadaný limit
import sys
m=int(sys.argv[1])
for n in range(2,m): # cyklus 2..m-1
p=2 # začátek testu
while p*p<=n:
if n % p == 0:
break
p+=1
if p*p > n: # n je prvočíslo
print(n,end=", ")
print() # závěrečný konec řádky
!python3 prvocislo3.py 1000
Změříme čas pro $m=10000$. (Pro přehlednost potlačíme výstup)
!time python3 prvocislo2.py 10000 >/dev/null
!time python3 prvocislo3.py 10000 >/dev/null
Vylepšená verze je $24\times$ lepší!
if
,else
)for
, while
, break
, continue
)