Python: Funkcije, praksa

U poslednjem textu mini-serijala o funkcijama pokazacemo njihovu primenu u praksi na primeru Cezar enkripcije. Ovo ce ujedno biti demonstracija pojedinih naucenih koncepata, kao i optimizavanog i pomalo minimalistickog stila u programiranju.

Najpre da se podsetimo sta smo do sada naucili. U prvom textu obradili smo osnovne elemente Python funkcije. U drugom smo radili na osobinama funkcija kroz primere. U trecem smo naucili dva trika za povecanje produktivnost. I u zavrsnom sumiramo nauceno kroz praksu.

Ovaj kratak program je napisan tokom izvanrednog IHTS kursa, koji svima preporucujem. Cezar cypher je jednostavan sistem enkripcije koji je dobio naziv po Juliju Cezaru jer ga je primenjivao tokom vojnih operacija za razmenu poruka. Radi se o jednostavnoj zameni slova za slovo po nekom kljucu koji definise za koliko je mesta pomeren alfabet u kriptovanom textu. Detaljno objasnjenje mozete naci na wikipediji ovde. Poznat primer ove enkripcije je cuveni ROT13 u kome je Engleski alfabet podeljen na pola. On je bio jako popularan na starim news grupama i jednostavnu demonstraciju mozete videti ovde.

Da predjemo na posao. U IDLE Editoru iskopirajte i pokrenite sledeci code:

def cea(s,x):
    a = ''
    for n in s:
        if n.isalpha():
            b = chr((ord(n.lower())+x-97)%26+97)
            if n.isupper():
                a += b.upper()
            else: a += b
        else: a += n
    print(a)

def uncea(s,x): cea(s,-x)

def brutc(s):
    for n in range(25):
        print('Key',n+1,'Text:')
        uncea(s,n+1)

#Examples:

#cea('Simple is better than complex.',5)
#brutc('Mywzvoh sc loddob drkx mywzvsmkdon.')
#uncea('Lyuxuvcfcns wiohnm.',20)

Kratko objasnjenje: Funkcija Cea pomera text za faktor x, cime ga enkriptuje. Uncea poziva Cea ali sa obrnutim faktorom, cime ga vraca nazad u alfabetu za onoliko mesto koliko je bio pomeren tokom enkripcije. I Brutc jednostavno izlistava svih 25 mogucnosti pomerenog texta za Engleski alfabet. Onda je lako videti koji od njih ima smisla, a time i koji je kljuc koriscen.

Testirajmo nas program u shellu:

>>> cea('Simple is better than complex.',5)
Xnruqj nx gjyyjw ymfs htruqjc.
>>> uncea('Lyuxuvcfcns wiohnm.',20)
Readability counts.
>>> brutc('Mywzvoh sc loddob drkx mywzvsmkdon.')
[...]
Key 10 Text:
Complex is better than complicated.
[...]

Opciono za kraj mozete probati brutc funkciju za sledeci cypher:

'Sw lzcowu xili, aiu c riuc swxi.'

Dobicete remix verziju jedne nase poslovice. :)

Inace, primeri koje smo koristili predstavljaju neke od osnovnih principa Pythona. Njih je napisao Tim Peters u svom textu The Zen of Python. U koliko zelite da procitate integralnu verziju texta sa svim principima, mozete koristiti poznati Python Easter Egg.

Kucajte u IDLE Shellu:

>>> import this

Na kraju treba dodati da Cezar shift vise nije u upotrebi jer se smatra nesigurnim. Dovoljno je pronaci kljuc na osnovu dela texta i onda je lako dekriptovati kompletan sadrzaj. Medjutim, gotovo je idealan za ucenje programiranja i demonstraciju jednostavne enkripcije.

Ovim zavrsavamo mini-serijal o funkcijama. Srecno u novim Python avanturama.

Posted on 2014/01/20, in Programski jezici, Python. Bookmark the permalink. 1 Comment.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: