Skip to content

Latest commit

 

History

History
388 lines (288 loc) · 12.3 KB

tutorial1-python.md

File metadata and controls

388 lines (288 loc) · 12.3 KB

logo Tutorial 1

Pár prvních pokusů s Pythonem

Většina ukázek z tohoto prvního tutoriálu bude fungovat i na běžném počítači při použití Pythonu (verze 3.5+). Cílem je základní představení, částečné pochopení a procvičení elementárních základů. Pokračování, kde už využijeme ESP32 s MicroPythonem, je v samostatném tutoriálu: Tutorial2. Pro ten už si ale musíte nainstalovat MicroPython na ESP.


CTRL-C

Po restartu nám ESP32 posílá do našeho počítače na terminál první zprávy s využitím REPL (Read–eval–print loop). Zeleně jsou systémové informace, které nás v tuto chvíli nezajímají. Po stisknutí CTRL-C se přeruší běh programu a uvidíme verzi MicroPythonu:

MicroPython v1.13-7-g5060270c6-build-octopusLAB on 2020-09-05; 
ESP32 module (spiram) with ESP32
Type "help()" for more information.
>>>

Samozřejmě platí i pro Python, že CTRL-C přeruší běh programu.

>>>

>>> toto je takzvaný "prompt", terminálová výzva, abychom tam něco napsali - příkaz nebo "posloupnost příkazů".

>>> a = 123      # do proměnné s názvem "a" se uložila hodnota (číslo 123)
>>> a            # vytiskne / zobrazí hodnotu proměnné 
123              # nebo print(a) 
                
>>> a + 10
133              # zobrazí vypočtenou hodnotu (jako kalkulačka)

Python zde běží v takzvaném interaktivním módu. Po každém vložení řádku (nebo bloku řádků) se okamžitě napsaný příkaz (nebo skupina příkazů) provede a čeká na další výzvu zobrazením >>>. Je to výhodné pro testování jednotlivých příkazů, pro výuku nebo průběžné modifikace.

>>> x = y = z = 123 # přiřazení pro více proměnných najednou
>>> z
123

>>> x, y = 123, 567 # přiřazení více hodnot
>>> y
567

Math

Někdy chceme použít i složitější matematické výrazy, než je + sčítání | - odčítání | * násobení | / dělení

Pro další matematické funkce a konstanty použijeme knihovnu math.

>>> import math        # knihovnu importujeme, až když ji potřebujeme,
                       # jinak nám zbytečně blokuje operační paměť

>>> math.log10(1000)   # funkce logaritmus o základu deset je jednou z metod knihovny math
3.0

>>> math.pi            # konstanta Pí (není to metoda!)
3.141593               # a počet desetinných míst je omezený

!!! note Toto není výuka programování – ale jen ukázky a experimenty s přihlédnutím na sadu knihoven a modulů octopusLab pro práci s vybraným hardware. Pro podrobnější proniknutí do tajů programování v Pythonu doporučujeme:

  - [naucse.python.cz](https://naucse.python.cz/)
  - [naucse.python.cz/course/mi-pyt/intro/micropython](https://naucse.python.cz/course/mi-pyt/intro/micropython/)
  - [howto.py.cz](http://howto.py.cz/index.htm)
>>> hodnota = 123
>>> print(hodnota)      # > 123 | vypíše obsah proměnné s názvem hodnota (korektně)
>>> print(math.pi)      # > 3.141593

Help

Zkuste si napsat help(). V Pythonu uvidíte asi něco jiného než v obecném MicroPythonu.

více...
(klikněte pro obsah) V MicroPythonu pro ESP se po help() vypíše:
>>> help()
Welcome to MicroPython on the ESP32!

For generic online docs please visit http://docs.micropython.org/

For access to the hardware use the 'machine' module:

import machine pin12 = machine.Pin(12, machine.Pin.OUT) pin12.value(1) pin13 = machine.Pin(13, machine.Pin.IN, machine.Pin.PULL_UP) print(pin13.value()) i2c = machine.I2C(scl=machine.Pin(21), sda=machine.Pin(22)) i2c.scan() i2c.writeto(addr, b'1234') i2c.readfrom(addr, 4)

Basic WiFi configuration:

import network sta_if = network.WLAN(network.STA_IF); sta_if.active(True) sta_if.scan() # Scan for available access points sta_if.connect("<AP_name>", "") # Connect to an AP sta_if.isconnected() # Check for successful connection

Control commands: CTRL-A -- on a blank line, enter raw REPL mode CTRL-B -- on a blank line, enter normal REPL mode CTRL-C -- interrupt a running program CTRL-D -- on a blank line, do a soft reset of the board CTRL-E -- on a blank line, enter paste mode

For further help on a specific object, type help(obj) For a list of available modules, type help('modules')


Operátory

Sem patří například + pro sčítání, - pro odčítání, * násobení a / dělení. A je jich mnohem více.

více...
(klikněte pro obsah) Informativní výčet operátorů v MicroPythonu:

    Operator                  Description
========================  ==================
lambda                    Lambda expression
or                        Boolean OR
and                       Boolean AND
not x                     Boolean NOT
in, not in                Membership tests
is, is not                Identity tests
<, <=, >, >=, <>, !=, ==  Comparisons
|                         Bitwise OR
^                         Bitwise XOR
&                         Bitwise AND
<<, >>                    Shifts
+, -­                      Addition and subtraction
*, /, %                   Multiplication, division, 
remainder
+x, ­-x                    Positive, negative
~x                        Bitwise not
**                        Exponentiation
x.attribute               Attribute reference
x[index]                  Subscription
x[index:index]            Slicing
f(arguments...)           Function call
(expressions...)          Binding or tuple display
[expressions...]          List display
{key:datum...}            Dictionary display
`expressions...`          String conversion
...


Výpis dostupných modulů

>>> help("modules")
více...
(klikněte pro obsah), Které "moduly" jsou aktuálně v Micropythonu dostupné help("modules")
>>> help()

(Verze 1.13):

main inisetup ubluetooth ure _boot machine ucollections urequests _onewire math ucryptolib uselect _thread micropython uctypes usocket _uasyncio neopixel uerrno ussl _webrepl network uhashlib ustruct apa106 ntptime uhashlib usys btree onewire uheapq utils/octopus_initial builtins ssd1306 uio utils/wifi_connect cmath uarray ujson utime dht uasyncio/init umqtt/robust utimeq ds18x20 uasyncio/core umqtt/simple uwebsocket esp uasyncio/event uos uzlib esp32 uasyncio/funcs upip webrepl flashbdev uasyncio/lock upip_utarfile webrepl_setup framebuf uasyncio/stream upysh websocket_helper gc ubinascii urandom Plus any modules on the filesystem


A po importu se můžete dotázat na každý modul samostatně (podobně i math. + TAB):

>>> import math
>>> help(math)
object <module 'math'> is of type module
  __name__ -- math
  e   -- 2.718282
  pi  -- 3.141593
  sqrt  -- <function>
  pow   -- <function>
  exp   -- <function>
  expm1 -- <function>
  log   -- <function>
  log2  -- <function>
  log10 -- <function>
  cosh  -- <function>
  sinh  -- <function>
  tanh  -- <function>
  acosh -- <function>
  asinh -- <function>
  atanh -- <function>
  cos   -- <function>
  sin   -- <function>
...

!!! hint "Python je jednoduchý"

- logické členění se provádí pomocí striktního odsazování bloků
- pozor na závorky u metod a funkcí `print("řetězec")` a uvozovky pro takzvané *řetězce (shluky písmen, co nejsou číslo)*
- pozor na dvojtečku za deklarací funkce, cyklu nebo podmínky: def funkce(parametr)`:`

Blok programu na více řádků a odsazování

Víceřádkové "dočasné definice vlastních funkcí" se provádí pomocí def název(parametry): - odsazení za nás udělá REPL ... nezapomenout na dvojtečku!

>>> def suma(x, y):
...    return x + y

>>> suma (1, 2)
3

!!! error "Odsazování"

- zmínili jsme už, že logické členění se provádí pomocí striktního **odsazování** bloků
- při psaní jednořádkových pokusů v terminálu (po `>>>`) Vám po řádku končícím dvojtečkou Python sám předvyplní 
symbolické tři tečky `...` jako odsazení *viz předchozí ukázka*, ale pozor! Při psaní programu do souboru se odsazuje pomocí mezer 
(doporučeno 3 nebo 4) nebo TABulátorem. 
A musí to být stále stejně! Kombinace mezer a TAB je také **syntaktická chyba**.

Píšeme-li postupně řádek po řádku - příkaz po příkaze, odsazování není potřeba. Až v definování procedur, v cyklech nebo podmínkách - tedy "po dvojtečce" :


Čekací prodlevy

  • program bude pokračovat až po uplynutí dané doby:
from time import sleep, sleep_ms # importujeme jen potřebné knihovny

sleep(1)           # 1 sekunda pauza
sleep_ms(100)      # 100 milisekund pauza
sleep_us(50)       # 50 mikrosekund pauza

Generátor náhodných čísel

Občas se nám v programu hodí vygenerovat pseudonáhodné číslo (pro testování, jednoduché hry nebo speciální efekty).

>>> from os import urandom
>>> urandom(1)[0]
42

Smyčky | Cykly

i = 0
while (i < 3):
    print(i)
    i += 1

Vypíše:

1
2
3

S "dospělým" Pythonem si můžete vyzkoušet více 🡒 naucse.python/cykly

Podmínky

Příkazy pro řízení toku programu (if, for, break, continue...) if - vyhodnotí podmínku a podle toho něco vykoná nebo pokračuje (dochází k větvení "toku" programu).

from os import urandom
num = urandom(1)[0]
if (num < 100):
   print("number {0} < 100".format(num))

Povšimněte si konstrukce format, kdy můžeme do řetězce vložit proměnnou, aniž bychom ho postupně "slepovali".

Ternární operátor (if na jenom řádku):

fruit = 'Apple'
isApple = True if fruit == 'Apple' else False
a, b = 10, 20  
# Copy value of a in min if a < b else copy b 
min = a if a < b else b
print(min)
# 10

S "dospělým" Pythonem si můžete vyzkoušet více 🡒 naucse.python/podminky

Nekonečný cyklus

Ještě drobná vsuvka - cykly a podmínky jsme zmínili v předchozí části, nyní použijeme jednu základní formu: "nekonečný cyklus":

>>> while podmínka:
...    prováděj_pokud_je_splněná_podmínka()
>>> a = 0
>>> while True: 
...    a += 1
...    print(a)

v nekonečné smyčce se maximální rychlostí vypisuje obsah zvětšující se proměnné "a".


!!! hint " Vychytávka [TAB]" Když chcete v Pythonu nebo MicroPythonu něco napsat, naučte se využívat TABulátor (klávesa TAB). Když například po promptu >>> chcete napsat octopus_initial.setup(), zkuste napsat pouze prvních pár písmen a pak zmáčknout TAB: >>> oc [TAB] a systém vám doplní nebo dá vybrat. Stejně tak po tečce: octopus_initial. stačí napsat se a pak TAB - a "našeptávač" automaticky doplní setup (nezapomeňte na závorky (), je to metoda).


Stojí za zmínku

Python umožňuje i složitější "konstrukce" typu:

# vyfiltruj sudá čísla do desítky:
>>> list(filter(lambda x: x%2 == 0, range(10)))

[0, 2, 4, 6, 8]


# do listu (pole) specifické trojice:
>>> list(5 * x + y for x in range(5) for y in [3, 2, 1])

[3, 2, 1, 8, 7, 6, 13, 12, 11, 18, 17, 16, 23, 22, 21]

Zkuste se obeznámit s některými "datovými strukturami" typu: řetězec, pole, seznam, slovník nebo pokročilejší databáze. Tomuto tématu se podrobněji věnujeme v samostatném workshopu: ws-python-data