"Escape" karakter

Pokušajte da funkcijom print prikažete na ekranu (odštampate) tekst koji sadrži navodnike, npr. This is a "small" program.
Probajte ovako:


In [1]:
print("This is a "small" program")


  File "<ipython-input-1-9e206a882c71>", line 1
    print("This is a "small" program")
                          ^
SyntaxError: invalid syntax

Obratite pažnju na to kako je kod obojen. Videćete da je tekst prekinut ispred reči "small", a novi tekst je otpočet nakon reči "small". Sama reč "small" je van teksta i Pajton pokušava da je interpretira, što dovodi do sintaksne greške.

Silazna kosa crta ("\") kao karakter ima posebno značenje u Pajtonu, kada se nalazi "u okviru teksta" (između navodnika). Naziva se escape karakterom. Korišćenjem ovog karaktera možemo reći Pajtonu da je karakter koji sledi deo teksta, čak i ukoliko se radi o "specijalnom" karakteru - u ovom slučaju navodnici, karakter koji služi za označavanje početka i završetka tesksta. Na taj način između navodnika možemo imati navodnike, koji se interpretiraju kao deo teksta.


In [10]:
print("This is a \"small\" program")


This is a "small" program

Obeležavanje teksta apostrofima

Za obeležavanje teksta koji prosleđujemo funkciji print možemo koristiti i apostrofe, na primer:


In [11]:
print('This is a text')


This is a text

To nam pruža više mogućnosti da prikažemo navodnike i apostrofe.

Apostrof u tekstu označenom navodnicima:


In [12]:
print("It's all good!")


It's all good!

Apostrof u tekstu označenom apostrofima:


In [13]:
print('It\'s all good!')


It's all good!

Navodnici u tekstu označenom apostrofima:


In [14]:
print('"Python" is a programming language.')


"Python" is a programming language.

Navodnici u tekstu označenom navodnicima:


In [15]:
print("\"Python\" is a programming language.")


"Python" is a programming language.

Ostale upotrebe "escape" karaktera

Ukoliko pokušamo da prikažemo silaznu kosu crtu ("\") na sledeći način, izazvaćemo grešku:


In [16]:
print("This is a backslash: \")


  File "<ipython-input-16-439ce6f6dd23>", line 1
    print("This is a backslash: \")
                                   ^
SyntaxError: EOL while scanning string literal

Kad god prikazujemo "specijalne" karaktere (poput navodnika i kose crte), koristimo "escape" karakter. U Pajtonu je to silazna kosa crta.


In [17]:
print("This is a backslash: \\")


This is a backslash: \

Pokušajte da funkciji print prosledite tekst koji sadrži novi red.


In [18]:
print("First line
      Second line")


  File "<ipython-input-18-a94099386333>", line 1
    print("First line
                     ^
SyntaxError: EOL while scanning string literal

Ovo izaziva grešku, jer Pajton očekuje da se tekst otpočet navodnicima završi u istom redu, i to navodnicima.

"Escape" karakter se može koristiti i za predstavljanje novog reda:


In [19]:
print("First line\nSecond line")


First line
Second line

Trostruki navodnici

Trostruki navodnici označavaju tekst, baš kao i navodnici i apostrofi, uz pogodnost da se između njih mogu naći svi specijalni karakteri - apostrofi, navodnici, oznake novog reda... Jedino za šta bismo morali koristiti "escape" karakter jesu trostruki navodnici, jer oni označavaju kraj teksta otpočetog trostrukim navodnicima.


In [20]:
print("""First line.
Second line.
All kinds of "special" characters here! Even backslashes! \ \\ \\\ """)


First line.
Second line.
All kinds of "special" characters here! Even backslashes! \ \ \\ 

I novi red je "specijalan karakter", pa i njega možemo "izbeći" escape karakterom.


In [4]:
print("This is a one-line string but it's a little too long so I want to break
it into two lines")


  File "<ipython-input-4-d654d4cb9017>", line 1
    print("This is a one-line string but it's a little too long so I want to break
                                                                                  ^
SyntaxError: EOL while scanning string literal

Pajton očekuje da string počet navodnicima završimo u istom redu i ukoliko napišemo naredbu gde string počinje u jednom redu (otvoreni navodnici) a završava se u sledećem redu (zatvoreni navodnici), izazvaćemo sintaksnu grešku, jer Pajton ne očekuje "specijalan karakter" za novi red u sred stringa (kao u naredbi iznad). Ukoliko ipak želimo da "razbijemo" string u više linija, svaki novi red, koji Pajton shvata kao specijalan karakter, možemo "izbeći" escape karakterom. Sledi primer.


In [5]:
print("This is a one-line string but it's a little too long so I want to break\
it into two lines")


This is a one-line string but it's a little too long so I want to breakit into two lines

Silazna kosa crta (backslash) kao karakter produžetka linije

Silazna kosa crta (backslash) može se koristiti i za razbijanje jedne linije koda u više linija. Koristi se za preglednost koda i nema nikakvog uticaja na izvršavanje programa. Sledi nekoliko primera.


In [9]:
2 + \
3


Out[9]:
5

In [10]:
print(\
      "some string")


some string

In [11]:
1 + \
1 + \
1 + \
1


Out[11]:
4

Promenljive

Sledi jednostavan program za sabiranje brojeva, koji koristi promenljive za smeštanje određenih vrednosti.


In [21]:
a = 3
b = 5
c = a + b
print(c)


8

Probajte da napišete program koji na osnovu zadatog poluprečnika računa obim i površinu kruga. Vrednost poluprečnika zadajte na početku programa, a za vrednost broja pi uzmite aproksimaciju 3.14. Program bi trebalo na ekranu da prikaže rezultat.

Program bi mogao da izgleda ovako:


In [22]:
r = 5
C = 2 * r * 3.14
A = r * r * 3.14
print("Circuference is:")
print(C)
print("Area is:")
print(A)


Circuference is:
31.400000000000002
Area is:
78.5

Promenićemo postojeći program tako da za vrednost broja pi uzima broj 3.14159. Ukoliko želimo da promenimo aproksimaciju broja pi, moramo to uraditi na dva mesta - na mestu gde se računa obim i na mestu gde se računa površina. U velikim programima, može se desiti da neku vrednost menjamo i na desetinama mesta. Ovo je loša programerska praksa, jer je naporno uvek menjati brojeve na više mesta, a i na taj način je lakše napraviti grešku. Može se desiti da brojeve promenimo na nekim, a ne na svim mestima, pa da prikažemo pogrešan rezultat.

Ukoliko koristimo promenljive, izbeći ćemo ovaj problem. Pored toga, dodaćemo komentare, kako bi program bio čitljiviji. Još jedna bitna stvar koja značajno doprinosi čitljivosti programa jesu opisna imena promenljivih. Umesto promenljivih poput r, C, A, treba koristiti promenljive poput radius, circumference, area, kako bi se iz samog imena promenljive moglo zaključiti čemu ona služi i kako se koristi u programu.


In [32]:
# The radius of the circle
radius = 5

# The value of the number pi, used throughout the program.
# If we want to use another value for pi, we only need to change it here
pi = 3.14159

# The circumference of the circle
circumference = 2 * radius * pi

# The area of the circle
area = radius * radius * pi

# Print the result
print("The circumference is:")
print(circumference)
print("\n")
print("The area is:")
print(area)


The circumference is:
31.4159


The area is:
78.53975

Operator dodeljivanja (asssignment operator)

U Pajtonu, znak jednako ("=") ima drugačije značenje nego u matematici. Dok se u matematici koristi za označavanje jednakosti leve i desne strane, u Pajtonu služi za smeštanje vrednosti u promenljivu. Levo od operatora se nalazi promenljiva koja će sadržati vrednost, a desno od operatora se može naći literal (npr. 2, 3.14, "some string"), promenljiva, matematička operacija, funkcija koja vraća vrednost itd.

Napisaćemo program za zamenu vrednosti dve promenljive (a i b). Na početku ćemo im dodeliti 2 različite vrednosti, a na kraju programa prikazati ih istim redosledom (a, b).

Naivni pristup bi mogao izgledati ovako.


In [1]:
# Declare two variables
a = 2
b = 3

# Switch the values
a = b
b = a

# Print new values
print("a = %d" % a)
print("b = %d" % b)


a = 3
b = 3

Ovaj pristup je loš, jer smo dodelivši promenljivoj a vrednost promenljive b (3) bespovratno izgubili staru vrednost promenljive a (2). Kada smo zatim promenljivoj b dodelili vrednost promenljive a, promenljiva a je već imala novu vrenost (3=

Sledi bolji pristup za zamenu vrednosti dveju promenljivih.


In [1]:
# Declare two variables
a = 2
b = 3

# Switch the values
tmp = a
a = b
b = tmp

# Print new values
print("a = %d" % a)
print("b = %d" % b)


a = 3
b = 2

Kako bismo bolje ilustrovali način funkcionisanja operatora dodeljivanja i šta se dešava kada istoj promenljivoj, u različitim delovima programa, dodeljujemo različite vrednosti, poslužićemo se sledećim primerom.


In [3]:
a = 1
print(a)
a = 2
print(a)
a = 10
print(a)


1
2
10

Bitno je primetiti da se u promenljivoj nalazi ono što smo joj poslednje dodelili. Ono što se pre toga u njoj nalazilo - nestaje.

Promenljivoj se mogu dodeljivati i rezultati operacija, na primer:


In [4]:
a = 3 + 2
print(a)


5

Jedan od operanada u tim izrazima može biti i sama promenljiva čiju vrednost računamo u izrazu, pod uslovom da smo joj ranije dodelili neku vrednost. U tom slučaju, "stara" vrednost će biti iskorišćena u računanju izraza, zatim će ta "stara" vrednost nestati, a promenljiva će sadržati novu vrednost - rezultat operacije. To pokazuje sledeći primer.


In [6]:
a = 10
# Print the "old" value of a
print("Old a = %d" % a)
# New a is equal old a (which is 10) plus 1
a = a + 1
# Print the new a
print("New a = %d" % a)


Old a = 10
New a = 11

Operator za formatiranje stringa

Izmenićemo prethodni program tako da u dve linije prikazuje nešto poput sledećeg teksta:

The circle radius is 5 and pi is 3.141590.
The circumference is 31.415900 and the area is 78.539750.


Svaki poziv funkcije print prikazuje tekst u zasebnom redu. Ovo nam onemogućava da tekst i rezultat prikažemo u istom redu. Korišćenjem operatora za formatiranje stringa možemo prevazići ovo ograničenje.

Kad se koristi nad brojevima, znak % odgovara operatoru modulusa, ili ostatka pri deljenju. Kad se koristi nad tekstualnim podacima (stringovima), znak % označava operator formatiranja stringa, i služi za dodavanje brojeva, teksta ili drugih odgovarajućih podataka u već postojeći string (tekst).


In [23]:
# The radius of the circle
radius = 5

# The value of the number pi, used throughout the program.
# If we want to use another value for pi, we only need to change it here
pi = 3.14159

# The circumference of the circle
circumference = 2 * radius * pi

# The area of the circle
area = radius * radius * pi

# Print the input and the result
print("The circle radius is %d and pi is %f." % (radius, pi))
print("The circumference is %f and the area is %f." % (circumference, area) )


The circle radius is 5 and pi is 3.141590.
The circumference is 31.415900 and the area is 78.539750.

Za dodavanje celih brojeva u string, koristimo oznaku %d. Za dodavanje razlomljenih brojeva, koristimo oznaku %f. Postoje i druge oznake, poput oznake %s, koja se koristi za dodavanje stringova u string. Na primer:


In [24]:
name = "John Smith"
print("Hi! My name is %s. How are you?" % name)


Hi! My name is John Smith. How are you?

Tipovi podataka u Pajtonu

Do sada smo uglavnom koristili tip podataka koji se naziva string. Stringovi u Pajtonu služe za prikazivanje teksta, koji može sadržati slova, cifre, interpunkcijske znake itd. Uglavnom se koristi za komunikaciju sa korisnikom. Pajton ga prepoznaje zahvaljujući navodnicima, apostrofima, ili trostrukim apostrofima, kao što smo videli u prethodnim primerima.

Pored stringova, postoje i tipovi koji služe za prikazivanje brojeva. U prethodnim primerima smo koristili celobrojni tip (integer) i razlomljeni tip (float). Od engleskih naziva potiču i njihovi formati koji se koriste u kombinaciji s operatorom formatiranja stringa - %d za celobrojni tip (d od decimal) i %f (f od float).

Probajte da prikažete celobrojni tip koristeći format razlomljenog tipa i obrnuto. Pajton će automatski uraditi konverziju tipa podataka u odgovarajući tip. Konverzijom se može izgubiti deo informacije, na primer, konverzijom razlomljenog broja u celobrojni tip, dobićemo zaokružen broj kao rezultat.


In [27]:
print("This is an integer: %f" % 3)


This is an integer: 3.000000

In [28]:
print("This is a float: %d" % 3.35)


This is a float: 3

Neki od tipova podataka u Pajtonu

  • stringovi
  • celi brojevi (integer)
  • razlomljeni brojevi (float)
  • logički tip (boolean)

Za razliku od programskih jezika kao što je C, koji koriste statičke tipove, Pajton koristi dinamičke tipove. To znači da promenljiva nije predodređena da sadrži samo jedan tip, već se u nju može smestiti objekat bilo kog tipa, jer Pajton informacije o tipu čuva uz objekat, a ne uz promenljivu (kao što to radi C).

Informaciju o tipu podatka koji nosi promenljiva možemo dobiti korišćenjem funkcije type.


In [29]:
# A string
my_variable = "This is a string."
print(my_variable)
print(type(my_variable))
print("\n")

# An integer
my_variable = 3
print(my_variable)
the_type = type(my_variable)
print(the_type)
print("\n")

# A float
my_variable = 3.5
print(my_variable)
print(type(my_variable))
print("\n")

# A boolean
my_variable = 3 > 5
print(my_variable)
print(type(my_variable))


This is a string.
<class 'str'>


3
<class 'int'>


3.5
<class 'float'>


False
<class 'bool'>

Ponašanje znakova i operatora s različitim tipovima podataka

Različiti znakovi označavaju različite operatore, u zavisnosti od tipa podataka. Na primer, procenat (%) kod celih brojeva označava ostatak pri deljenju, a kod stringova operator formatiranja stringa.

Zbir dva cela broja je ceo broj.


In [40]:
# Adding two integers
sum_of_integers = 3 + 5
print(sum_of_integers)
print(type(sum_of_integers))


8
<class 'int'>

Zbir celog broja i razlomljenog broja je razlomljen broj. Prilikom operacija koje uključuju celobrojne i razlomljene brojeve, Pajton implicitno konvertuje celi broj u razlomljeni (npr. 3 u 3.0) i zatim ih sabira. Konverzija je neophodna jer je operacija sabiranja definisana samo nad podacima istog tipa. Kada bi Pajton u ovoj situaciji konvertovao razlomljen broj u ceo broj, došlo bi do zaokruživanja, što bi dalje vodilo gubljenju preciznosti (npr. 5.3 u 5), pa bi 3 + 5.3 bilo jednako 8.


In [41]:
# Adding a float to an integer
sum_of_int_and_float = 3 + 5.3
print(sum_of_int_and_float)
print(type(sum_of_int_and_float))


8.3
<class 'float'>

Znak "%" kod brojeva označava ostatak pri deljenju. Kod stringova, ovaj znak označava operator formatiranja stringa.


In [42]:
print(32.1 % 10)
print("This is a number: %f" % 3.14)


2.1000000000000014
This is a number: 3.140000

Znak "+" kod brojeva označava sabiranje, a kod stringova konkatenaciju (pripajanje drugog stringa prvom).


In [44]:
# Add numbers
number1 = 10
number2 = 11
print(number1 + number2)
print("\n")

# Concatenate strings
str1 = "My name is "
str2 = "John Smith"
print(str1 + str2)


21


My name is John Smith

Interakcija s korisnikom (user input)

Funkcija input se koristi za interakciju s korisnikom. Ona omogućava korisniku našeg programa da unosi tekst s tastature. Njen jedini argument je tekst koji prikazujemo korisniku (kako bismo mu objasnili kakav ulaz s tastature očekujemo). Njen izlaz je string koji sadrži ono što je korisnik uneo preko tastature. Ukoliko očekujemo broj kao ulaz, možemo upotrebiti funkcije za konverziju (int i float), čiji je argument string, a izlaz broj.


In [36]:
name = input("What is your name?\n")
print("Hello, %s!" % name)


What is your name?
John
Hello, John!

In [45]:
# The radius of the circle
radius = float(input("Please enter the circle radius: "))

# The value of the number pi, used throughout the program.
# If we want to use another value for pi, we only need to change it here
pi = 3.14159

# The circumference of the circle
circumference = 2 * radius * pi

# The area of the circle
area = radius * radius * pi

# Print the input and the result
print("The circle radius is %f and pi is %f." % (radius, pi))
print("The circumference is %f and the area is %f." % (circumference, area) )


Please enter the circle radius: 5
The circle radius is 5 and pi is 3.141590.
The circumference is 31.415900 and the area is 78.539750.