Warning
This page is located in archive. Go to the latest version of this course pages. Go the latest version of this page.

11. Konečný automat, regulární výrazy

Konečný počet stavů

Příklad s žárovkou

class LightBulb:
  _state = 'OFF'    # initial state of bulb
 
  def onOff(self, switch):
    if switch == 'ON' and self._state=='OFF':
        self._state = 'ON'
        print('Zarovka se rozsvitila')
    elif switch == 'OFF' and self._state=='ON':
        self._state = 'OFF'
        print('Zarovka zhasla')
    else:
        pass          # if we get wrong input
 
a = LightBulb()
 
a.onOff('ON')
a.onOff('ON')
a.onOff('OFF')
a.onOff('OFF')

Úloha 1 - Detektor sekvence bitů

Pomocí stavového automatu detekujte zvolenou sekvenci bitů

Program pro každý bit na vstupu vypisuje bit na výstup. Pokud je sekvence bitů 101 vypíše pro poslední bit ze sekvence 1

Příklad vstupu a výstupu:

vstup : 0110101011001

výstup: 0000100010000

Odvození stavového diagramu k úloze: https://www.geeksforgeeks.org/design-101-sequence-detector-mealy-machine/

# <vas kod>

Úloha 2 - Detekce sekvence znaků

Implementace pomocí objektů

class TextSeq:
 
    startState = 0
 
# Initialize 
    def start(self):
        self.state = self.startState
 
# Step through the input
    def step(self, inp):
        (s, o) = self.getNextValues(self.state, inp)
        self.state = s
        return o
 
# Loop through the input		
    def feeder(self, inputs):
        self.start()
        return [self.step(inp) for inp in inputs]
 
# Determine the TRUE or FALSE state
    def getNextValues(self, state, inp):
        if state == 0 and inp == 'A':
            return (1, True)
        elif state == 1 and inp == 'G':
            return (2, True)
        elif state == 2 and inp == 'C':
            return (0, True)
        else:
            return (3, False)
 
 
InSeq = TextSeq()
 
x = InSeq.feeder(['A','A','A'])
print(x)
 
y = InSeq.feeder(['A', 'G', 'C', 'A', 'C', 'A', 'G'])
print(y)

Generátor

Dodatečné informace ke generátorům dostupné např. na https://naucse.python.cz/lessons/advanced/generators/

def fib_return(n):
    ret_list = []
    a, b = 0, 1
    for i in range(n):
        ret_list.append(a)
        a, b = b, a + b
 
    return ret_list
 
def fib_yield(n):
    a, b = 0, 1
    for i in range(n):
        yield a
        a, b = b, a + b

a = fib_return(10)
print(type(a))
 
b = fib_yield(10)
print(type(b))

a = fib_return(10)
print(a)
 
for i in a:
    print(i, end=' ')

b = fib_yield(10) # vytvorime generator
 
for i in b:
    print(i, end=' ')
print()
 
b = fib_yield(10) # vytvorime generator
 
# vypisuje postupne hodnoty generatoru diky funkci next()
for i in range(10):
    print(next(b),end=' ')

Užitečné funkce

map()

filter()

# funkce map()
# prvni argument je funkce a dalsi argumenty jsou iterovatelne objekty
 
x1 = [1, 2, 3]
x2 = [4, 5, 6]
 
vysledek = map(lambda x, y: x + y, x1, x2)  # aplikuje funkci: x + y postupne na hodnoty v seznamech x1 a x2
print(list(vysledek)) # pretypovani na seznam

# funkce filter()
# prvni argument je funkce a dalsi argumenty jsou iterovatelne objekty
 
x1 = list(range(100))
 
suda = filter(lambda x: x%2==0, x1)  # funkce se aplikuje postupne na hodnoty v iterovatelnem objektu
# funkce filter vybere ty hodnoty, pro ktere funkce v argumentu vraci hodnotu True
 
print(list(suda))

Variabilní počet vstupních argumentů

*args

def vynasob(x, y):
    print(x*y)
 
vynasob(5,7)
 
#vynasob(5)
#vynasob(5,7,6)

def vynasob(*cisla): # *args
    z = 1
    for cislo in cisla:
        z *= cislo
    print(z)
 
vynasob(2)
vynasob(5,7)
vynasob(5,7,5)

**kwargs

def print_kwargs(**kwargs):
        print(kwargs)
 
print_kwargs(kwargs_1='1', kwargs_2='2')
print_kwargs({'kwargs_1':'1', 'kwargs_2':'2'})

Povinně klíčované argumenty

def kalk_1(x, y, operace='*'):
 
    if operace not in '+-*/':
        return x*y
    else:
        return eval(str(x) + operace + str(y))
 
def kalk_2(x, y,*,operace='*'):
 
    if operace not in '+-*/':
        return x*y
    else:
        return eval(str(x) + operace + str(y))
 
print(kalk_1(7,8,'+'))
print(kalk_2(7,8))

__name__ == '__main__'

viz. dokumentace

import cv11_modul
 
cv11_modul.main(['', '10'])

courses/bab37zpr/tutorials/lab11.txt · Last modified: 2022/11/28 14:30 by zizieada