14.3. Ниске¶
Погледај наредни видео:
Поред бројева, рачунари су веома добри и у раду са текстом и, као што
смо видели, за рад са текстом се користе ниске и променљиве типа
str
. Иако се могу посматрати и као атомичке вредности (појединачни
подаци), ниске се могу посматрати и као торке карактера (слова,
интерпункцијских знакова и слично). Самим тим, на ниске се примењују
скоро све технике које се користе у раду са торкама.
Нагласимо да су, као и торке, и ниске имутабилне и да једном формирану ниску није могуће променити.
Надовезивање ниски¶
Погледај наредни видео:
Слично као и над листама, над нискама се могу вршити одређене операције.
Једна од основних операција је спајање две ниске. Ова операција
донекле подсећа на сабирање и обележава се знаком +
. На пример,
вредност израза "abraka" + "dabra"
је "abrakadabra"
. Још
једна интересантна операција је да се ниска помножи природним
бројем. И множење ниске бројем функционише исто као код торки, односно код листа.
На пример, вредност израза "ba"*2
је "baba"
.
- "ba" + "na" * 2
- Тачно! "banana"
- "a" + "na" * 2 + "s"
- Тачно! "ananas"
- "ba" * 2 + "na"
- Нетачно! "babana"
- "an" * 2 + "nas"
- Нетачно! "anannas"
Q-17: Који од наредних израза крију у себи исправно записан назив воћа?
Допуни наредни програм тако да исправно испише име и презиме (у овом
примеру треба да се испише „Петар Петровић
“).
А шта је са цифрама у ниски?¶
Ниске у себи могу да садрже цифре, па чак могу да буду састављене
искључиво од цифара. Међутим, када се на две ниске примени оператор
+
ниске се надовезују. Тако је резултат операције "12" + "34"
једнак "1234"
, а не 46
како би неки очекивали. Помоћу
input
се увек уноси текст, тј. резултат ове операције је увек
ниска, чак иако тај текст садржи само цифре. Имајући ово у виду,
покушај да предвидиш шта ће израчунати наредни програм када, након
његовог покретања, корисник унесе 3, а затим и 5.
- 8
- Нетачно! Иако корисник куца цифре, ``prvi_sabirak`` и ``drugi_sabirak`` нису бројеви него ниске (текст) и зато се оператором ``+`` оне надовезују.
- 15
- Нетачно! Покушај поново.
- "35"
- Тачно!
- "8"
- Нетачно! Иако корисник куца цифре, ``prvi_sabirak`` и ``drugi_sabirak`` нису бројеви него ниске (текст) и зато се оператором ``+`` оне надовезују.
Q-18: Који је резултат извршавања претходног програма ако корисник унесе
прво 3
, а затим 5
.
Ако текст садржи само цифре, онда се број представљен тим цифрама може
добити помоћу int
. На пример, int("123")
је број 123
. Тако
је int("12") + int("34")
једнако 12 + 34
тј. 46
. Стога се
учитавање броја може постићи помоћу int(input("Unesi broj:"))
. Тако
се претходни програм који сабира два учитана броја може
поправити на следећи начин:
Ниска може да садржи и децималан запис неког броја и тада се број
представљен том ниском може добити помоћу float
. На пример,
float("123.45")
je број 123,45
. Претварање ниске у број је и у
овом случају веома важно урадити, јер се у супротном оператор +
односи на надовезивање ниски, а не на сабирање бројева. Провери да ли
ово добро разумеш.
-
Покушај поново
- float("3.5") + float("3.5")
- 7.0
- "3.5" + "0.5"
- "3.50.5"
- 3.5 + "3.5"
- greška
- float("2.5") + 1.5
- 4.0
Тако се децималан број може унети са broj = float(input("Unesi decimalan broj:"))
.
Дужина ниске, издвајање делова ниске¶
Дужину ниске, тј. број њених карактера, можемо добити помоћу функције
len
. Тако је len("Zdravo")
једнако 6, јер ниска "Zdravo"
има тачно 6 карактера.
Вредност len("Popokatepetl")
је
Вредност len("Супер Марио 3!")
је
Као и у другим торкама и листама, и карактери у ниски имају своје редне
бројеве, тј. позиције. Први карактер се налази на позицији 0, други на
позицији 1, и тако даље. Могуће је издвојити појединачни карактер из
ниске. На пример, ако је ime = "Zorana"
тада се карактер Z
може добити изразом ime[0]
, а карактер r
изразом ime[2]
.
Подржани су и негативни индекси тако што -1 означава последњи карактер,
-2 претпоследњи и тако даље. На пример, ако је ime = "Zorana"
тада
је ime[-1]
карактер a
, док је ime[-4]
карактер r
.
И издвајање дела ниске (подниске) функционише на исти начин као и код торки и листа. Подсети се овога.
Дата је ниска s = "Programiranje je mnogo zabavno"
.
Вредност израза s[0:4]
је
Израз којим је из ниске s
могуће издвојити реч mnogo
је
И наредни задатак се може урадити коришћењем издвајања делова ниске.
ЈМБГ¶
![](../_static/img/question-mark.png)
Сваки грађанин Републике Србије има свој јединствени матични број (ЈМБГ). У њему прве две цифре одређују дан рођења, друге две месец, а наредне три цифре одређују годину рођења. Две цифре након тога одређују општину рођења, наредне три цифре су јединствене за ту особу при чему се из њих може одредити пол (комбинације од 000 до 499 се додељују дечацима, а од 500 до 999 девојчицама). Последња цифра је контролна. Она се израчунава применом једне посебне формуле на претходне цифре. За дати ЈМБГ одредите ког дана и месеца се особа родила.
Иако делује да је ЈМБГ број, њега је боље посматрати као ниску карактера, тј. стринг (енг. string). Наиме, обично смо заинтересовани само за издвајање одређених делова ЈМБГ-а, док на ЈМБГ никада не примењујемо аритметичке операције (нпр. нема смисла сабирати два ЈМБГ-а нити ЈМБГ множити са 2). Издвајање делова је веома једноставно ако ЈМБГ представимо у облику ниске.
Претрага ниске¶
Често је потребно да проверимо да ли једна ниска садржи неки карактер
или садржи неку другу ниску. То можемо урадити коришћењем find
.
На пример, ако је ime_i_prezime = "Љубица Љубичић"
, тада је
вредност ime_i_prezime.find(" ")
једнака 6
, јер се размак може
наћи на позицији 6. Ако потражимо карактер који ниска не садржи (на
пример, ime_i_prezime.find(",")
), добићемо вредност -1
.
Уместо find
можемо употребити и index
(као и код торки и
листа), међутим, када се оно што се тражи не налази у ниски, find
враћа вредност -1
, док index
даје грешку при извршавању
програма.
Претрагу можемо употребити да бисмо, на пример, издвојили име и презиме из датог имена и презимена (што је управо супротно од задатка у којем смо на основу посебног имена и презимена и добили спојено име и презиме).
Овај задатак има и лепше решење које користи функцију split
, која
формира листу речи дате реченице (врши поделу ниске на подниске на
основу размака који се јављају унутар ниске).
Осим што можемо пронаћи позицију на којој се неко слово или нека
подниска јавља унутар ниске, можемо и избројати колико се пута оно
појављује. За то можемо користити count
. На пример, број
појављивања слова a
у неком имену можемо израчунати помоћу
ime.count("a")
. Наредни задатак се веома једноставно може урадити
применом методе count
.
Врсте реченица¶
![](../_static/img/question-mark.png)
Дат је текст (ниска) који садржи неколико једноставних реченица. Одреди колико међу њима има обавештајних, колико има упитних и колико има узвичних реченица.
Обавештајне реченице се завршавају тачком, упитне знаком питања, а
узвичне узвичником. Број реченица сваке врсте можемо одредити тако што
пребројимо колико се пута јавља сваки од ова три карактера (карактер
тачка (.
), карактер упитник (?
) и карактер узвичник (!
)).