Korisnički unos

12.1 Korisnički unos 

Već smo na mnogo mesta koristili funkcije koje imaju neku interakciju sa korisnikom našeg programa. Na ovom mestu ćemo to „provežbati“ još malo, na taj način što ćemo napraviti program koji traži od korisnika da unese nešto, a zatim proverava da li je to nešto palindrom.
Pitanje: Šta je palindrom?
Odgovor: Palindrom je reč ili rečenica koja se isto čita i od napred, ali i od pozadi. Na primer, reč madam je palindrom, jer čitajući je sa leva na desno ima isto značenje kao i čitajući je sa desna na levo. „Ana voli Milovana“ je isto palindrom jer se čita na isti način i sa leve na desnu, ali i sa desne na levu stranu.
Dakle, počnimo sa kreiranjem programa, sačuvaj ga kao palindrom.py :
#!/usr/bin/env python3 

'''PALINDROM 
Skripta u kojoj je skup funkcija koje rade sa stringovima. 
Kada se pokrene samostalno, proverava da li je uneti string palindrom. 
''' 

def pita(tekst): 
    '''Funkcija koja pita korisnika zadati tekst, 
    vraća nam njegov odgovor - string.''' 
    prompt = '*>>> ' 
    print(tekst) 
    return input(prompt) 

def kraj(string): 
    '''Funkcija koja vraća vrednost True ukoliko 
    prosleđeni string počinje slovom "d".''' 
    # Može biti upper() ili lower() 
    string = string.lower() 
    return string.startswith('d') 

if __name__ == '__main__': 
    print(__doc__) 
    while True: 
        provera = pita('Unesi string za proveru:') 
        izlaz = pita('Želiš li da izađeš iz programa (d/N)?') 
        if kraj(izlaz): 
            break 
    input('Enter za kraj.')  
U ovom trenutku naš program ne radi mnogo toga.... Ili, pak, radi?
Vidiš li šta sam radio? Koristio sam sada već standardnu konstrukciju za proveru imena modula. Ako modul pokrećemo samostalno, prikazujemo njegovu dokumentaciju i ulazimo u while petlju, koja je u stvari glavno telo našeg programa. Budući da sam ranije rekao da u glavnom delu programa treba izbegavati pitanja i prikaze, već da to treba prepustiti funkcijama, ja sam kreirao posebnu funkciju pita() koja će na ekranu lepo prikazivati naša pitanja. Takođe sam kreirao i funkciju izlaz() koja služi da naš program radi, dokle god korisnik to želi, a kada ne bude želeo, dovoljno je da na kraju ukuca slovo „d“, ili „D“, ili bilo koju reč koja počinje sa slovom „d“ i program će da se završi. Obrati pažnju na ovu funkciju. U njoj koristimo metodu stringova lower() koja nam vraća string koji je predstavljen malim slovima, a mogli smo koristiti i metodu upper() - koja radi suprotno – vraća string sačinjen od velikih slova.
Pitanje: Ovaj program trenutno ne radi ništa:
./palindrom.py 
PALINDROM 
Skripta u kojoj je skup funkcija koje rade sa stringovima. 
Kada se pokrene samostalno, proverava da li je uneti string palindrom. 

Unesi string za proveru: 
*>>> ht 
Želiš li da izađeš iz programa (d/N)? 
*>>> 
Unesi string za proveru: 
*>>> gzgz 
Želiš li da izađeš iz programa (d/N)? 
*>>> dane 
Enter za kraj. 
Odgovor: Upravo tako. Ne radi ono za šta je namenjen. Treba da kreiramo funkcije koje će „raditi“ za nas. Ovo je samo proba kako radi program, dokle god je korisniku potreban, i primer je kako korisnik kontroliše kada želi da završi sa radom u programu.
Da bi naš program radio, potrbno nam je još dve funkcije, i to:
Jedna funkcija u kojoj ćemo koristiti isecanje sekvenci kako bi nam vratila naš tekst u obrnutom rasporedu. Već si video kako se mogu praviti isečci sekvenci korišćenjem sintakse sekvenca[a:b], koja će početi od pozicije a pa do pozicije b. A ako priložimo i treći argument u operaciju isecanja, koji određuje korak (razmak) kojim se vrši isecanje, a čija je podrazumevana vrednost 1, vratiće nam se „ispreskakan“ tekst. Davanjem negativnog koraka, odnosno, koraka vrednosti -1, mi ćemo dobiti tekst napisan u "rikverc" (obrnut).
Definisali smo funkciju koja pita nešto korisnika. Ona našem programu daje tekst koji je korisnik uneo. Mi ćemo da iskoristimo taj tekst da ga preokrenemo. A onda, treba nam funkcija koja testira da li su originalni tekst i onaj obrnuti jednaki, ako jesu - onda je uneseni tekst palindrom.
Hajde da napravimo to:
#!/usr/bin/env python3 

'''PALINDROM 
Skripta u kojoj je skup funkcija koje rade sa stringovima. 
Kada se pokrene samostalno, proverava da li je uneti string palindrom. 
''' 

def pita(tekst): 
    '''Funkcija koja pita korisnika zadati tekst, 
    vraća nam njegov odgovor - string.''' 
    prompt = '*>>> ' 
    print(tekst) 
    return input(prompt) 

def kraj(string): 
    '''Funkcija koja vraća vrednost True ukoliko 
    prosleđeni string počinje slovom "d".''' 
    # Može biti upper() ili lower() 
    string = string.lower() 
    return string.startswith('d') 

def obrni(tekst): 
    '''Funkcija koja obrće prosleđen tekst.''' 
    return tekst[::-1] 

def palindrom(tekst): 
    '''Funkcija koja proverava da li je tekst palindrom.''' 
    proveri = obrni(tekst) 
    return tekst.lower() == proveri.lower() 

def proveri(tekst): 
    if palindrom(tekst): 
        print('"{}" je palindrom.\n'.format(tekst)) 
    else: 
        print('"{}" nije palindrom.\n'.format(tekst)) 

if __name__ == '__main__': 
    print(__doc__) 
    while True: 
        provera = pita('Unesi string za proveru:') 
        proveri(provera) 
        izlaz = pita('Želiš li da izađeš iz programa (d/N)?') 
        if kraj(izlaz): 
            break 
    input('Enter za kraj.')  
Eto... Pokušaj da upišeš komentare iznad svakog reda, ako ti nije jasno šta ovaj program radi, probaj i prstom da ispratiš tok izvršavanja programa, a ja odoh u restoran na kafu...
Uf... Čekaj malo!
Šta je sada?
Problem: Ovaj program opet ne radi!
./palindrom.py 
PALINDROM 
Skripta u kojoj je skup funkcija koje rade sa stringovima. 
Kada se pokrene samostalno, proverava da li je uneti string palindrom. 

Unesi string za proveru: 
*>>> Madam 
"Madam" je palindrom. 

Želiš li da izađeš iz programa (d/N)? 
*>>> l 
Unesi string za proveru: 
*>>> ana Voli, milovana 
"ana Voli, milovana" nije palindrom. 

Želiš li da izađeš iz programa (d/N)? 
*>>> do mojega 
Enter za kraj. 
Bolje rečeno, radi, ali ne i za komplikovanije stringove, radi samo za one koji su sastavljeni od jedne reči, i one koji ne koriste interpunkciju!
Odgovor: U pravu si. Provera da li je tekst palindrom treba da ignoriše znakove interpunkcije, razmake u rečenici i veličinu slova. Na primer, "A mene, ni dogodine nema." jeste palindrom, ali naš trenutni program će to ignorisati. Možemo li poboljšati gornji program, kako bi prepoznao i ovakve palindrome? A što ne bi smo mogli?
Na svu sreću Python još uvek u svojim standardnim bibliotekama poseduje modul koji se naziva string, i koji u sebi čuva neke konstante koje nam mogu dobro doći:
>>> import string 
>>> string.punctuation 
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~' 
>>> string.whitespace 
' \t\n\r\x0b\x0c' 
>>> 
Vidimo da string.punctuation čuva string koji je sastavljen od svih znakova interpunkcije, dok string.whitespace čuva string sačinjen od svih znakova razmaka (razmak, tab, novi red itd).
Kako nam ovo može pomoći? Pa, na primer, možemo kreirati novu funkciju koja će sa for petljom „prolaziti“ kroz string koji je korisnik uneo, kreirajući novi bez punktuacije i praznih znakova, a zatim tako dobijeni string poslati dalje na proveru da li je palindrom.
Na kraju naš program treba da izgleda ovako nekako:
#!/usr/bin/env python3 

'''PALINDROM 
Skripta u kojoj je skup funkcija koje rade sa stringovima. 
Kada se pokrene samostalno, proverava da li je uneti string palindrom. 
''' 

import string 

def pita(tekst): 
    '''Funkcija koja pita korisnika zadati tekst, 
    vraća nam njegov odgovor - string.''' 
    prompt = '*>>> ' 
    print(tekst) 
    return input(prompt) 

def kraj(string): 
    '''Funkcija koja vraća vrednost True ukoliko 
    prosleđeni string počinje slovom "d".''' 
    # Može biti upper() ili lower() 
    string = string.lower() 
    return string.startswith('d') 

def obrni(tekst): 
    '''Funkcija koja obrće prosleđen tekst.''' 
    return tekst[::-1] 

def izbaci_sve(tekst): 
    '''Funkcija koja uklanja interpunkciju iz teksta. 
    Vraća string bez interpunkcije i praznih polja.''' 
    vrati = '' 
    for i in tekst: 
        if i not in string.punctuation and i not in string.whitespace: 
            vrati += i 
    return vrati 


def palindrom(tekst): 
    '''Funkcija koja proverava da li je tekst palindrom.''' 
    tekst = izbaci_sve(tekst) 
    proveri = obrni(tekst) 
    return tekst.lower() == proveri.lower() 

def proveri(tekst): 
    if palindrom(tekst): 
        print('"{}" je palindrom.\n'.format(tekst)) 
    else: 
        print('"{}" nije palindrom.\n'.format(tekst)) 

if __name__ == '__main__': 
    print(__doc__) 
    while True: 
        provera = pita('Unesi string za proveru:') 
        proveri(provera) 
        izlaz = pita('Želiš li da izađeš iz programa (d/N)?') 
        if kraj(izlaz): 
            break 
    input('Enter za kraj.') 
Dodali smo samo jednu funkciju, zar nije to super?
Unesi string za proveru: 
*>>> Ana voli - Milovana! 
"Ana voli - Milovana!" je palindrom. 

Želiš li da izađeš iz programa (d/N)? 
*>>> 
Unesi string za proveru: 
*>>> A mene- Ni DoGodine, NEMA!?! 
"A mene- Ni DoGodine, NEMA!?!" je palindrom. 

Želiš li da izađeš iz programa (d/N)? 
A i radi super! Za domaći, napiši komentare iznad svake linije u programu, kako bih ja bio siguran da apsolutno razumeš sve šta smo na ovome mestu radili!

12 Ulaz/Izlaz Indeks 12.2 Fajlovi

Коментари

Popularno

Audacious - program za slušanje muzike

LibreOffice Calc - program za izradu tabela

Brasero - program za rezanje CD-ova

Bekstvo iz Titela

Minitube - program za praćenje YouTube sadržaja

Idemo

Kako blokirati neželjene oglase koje AdSense pokazuje na Vašoj web lokaciji

Bezimena

Pozadina Bekstva iz titela

Pažljivo sa MS Word dokumentima koje primate putem elektronske pošte