Стрингови у Пајтону
Интерактивна лекција за све који нису били на часу или желе да утврде градиво: шта је стринг, позиције карактера, сечење, спајање, дужина, методе find, split, strip и четири задатка са часа. Код пишеш и покрећеш директно на овој страници.
Свака вежба има поље за код. Дугме Покрени (или Ctrl + Enter) извршава твој код и приказује шта програм исписује. Дугме Провери тестира твоје решење, и то не само на примеру који видиш, већ и на још једном скривеном, па решење мора да ради за било који унос. Помоћ даје наговештај, а Решење показује тачан код. Пробај прво сам.
Пајтон се учитава у прегледачу при отварању странице (потребан је интернет, први пут траје неколико секунди). Напредак се чува у овом прегледачу.
Шта је стринг
Стринг (енг. string) је низ карактера. Карактер може бити слово, цифра, размак или било који знак. Стринг у коду почиње и завршава се наводником ":
ime = "Nikola Tesla"
Пајтон прихвата и једноструке наводнике 'Nikola Tesla'. Важно је само да стринг почне и заврши се истим знаком. Касније ћемо видети када су нам потребни једноструки.
Сваки карактер у стрингу има своју позицију (индекс). Позиције почињу од 0, а не од 1. Размак је такође карактер и има своју позицију.
Промени текст, кликни на неки карактер или пређи на „Сечење“ и помери клизаче.
Пробај сам: покрени код испод, па промени текст у наводницима и покрени поново.
Коментари
Коментар је текст у коду који Пајтон прескаче. Служи људима: да објасни шта код ради или, код нас, да на почетку фајла стоји текст задатка.
Коментар у једном реду
Почиње знаком # и траје до краја реда. Може да стоји у засебном реду или иза кода.
# Ovo je komentar u jednom redu print(ime[0]) # i ovo je komentar, iza koda
Коментар у више редова
Пише се између три пара наводника """ на почетку и """ на крају. Све између се прескаче.
""" Zadatak 1. Korisnik treba da unese svoje ime. Prikazati prvo slovo imena, spojeno trece i cetvrto slovo imena i duzinu imena. """
Издвајање једног карактера
Карактер на одређеној позицији добијамо тако што иза имена променљиве у угластим заградама напишемо позицију:
ime = "Nikola Tesla" print(ime[0]) # N print(ime[2]) # k print(ime[7]) # T
"Nikola Tesla" има 12 карактера, па је последња позиција 11. Ако тражиш ime[12], Пајтон пријављује грешку IndexError, јер та позиција не постоји.Сечење стринга: више карактера одједном
Део стринга (низ карактера) издвајамо записом [почетак:крај]:
- карактер на позицији почетак је укључен,
- карактер на позицији крај није укључен, сечење се зауставља пре њега,
- број издвојених карактера је крај − почетак.
Ако изоставиш почетак, креће се од почетка стринга. Ако изоставиш крај, иде се до краја стринга.
| Запис | Резултат | Објашњење |
|---|---|---|
ime[2:4] | "ko" | позиције 2 и 3 (4 није укључена) |
ime[0:6] или ime[:6] | "Nikola" | од почетка до позиције 5 |
ime[6:] | " Tesla" | од позиције 6 до краја; на позицији 6 је размак, па и он улази у резултат |
ime[7:] | "Tesla" | од позиције 7 до краја, без размака |
Врати се на „Истражи позиције“ у првој целини и у режиму Сечење провери сваки ред табеле.
Спајање стрингова и дужина стринга
Оператор +
Када се + користи између два стринга, он их спаја у један. Редослед је важан: оно што је лево долази прво. Пајтон сам не додаје размак, па га, ако нам треба, морамо додати као стринг " ".
print("Nikola" + "Tesla") # NikolaTesla
print("Tesla" + "Nikola") # TeslaNikola
print("Nikola" + " " + "Tesla") # Nikola Tesla
print(ime[2] + ime[3]) # ko
Функција len()
Дужина стринга је број карактера у њему (рачунају се и размаци). Добија се функцијом len(), коју смо већ радили:
print(len("Nikola Tesla")) # 12
print(len("Nikola")) # 6
len(ime) карактера, последњи је на позицији len(ime) - 1.f пре наводника, а вредности пишемо у витичастим заградама, нпр. print(f"Duzina imena je {len(ime)}").Задатак 1: име
Методе: find() и split()
До сада смо користили функцију len(ime): име функције, па стринг у загради. Метода се пише другачије: прво стринг, па тачка, па име методе и заграде. Метода „припада“ стрингу и ради нешто са њим.
Вредност у загради зове се аргумент: то је податак који методи кажемо шта тачно да тражи или по чему да ради. Заграде се пишу увек, чак и кад су празне, нпр. tekst.strip().
find() тражи позицију
tekst.find("x") враћа позицију првог појављивања траженог текста. Ако тражени текст не постоји, враћа -1.
mejl = "petar@etstesla.rs"
print(mejl.find("@")) # 5
print(mejl.find(".")) # 13
print(mejl.find("x")) # -1, nema ga
Позицију коју врати find() можемо сачувати у променљиву и користити при сечењу. Пошто крај није укључен, mejl[0:et] даје све пре знака @, а mejl[et+1:] све после њега (додајемо 1 да прескочимо сам знак @).
split() дели стринг на делове
tekst.split("x") сече стринг на сваком месту где се појављује x и враћа листу делова. Сам знак по коме се дели се избацује. Деловима приступамо по позицији, исто као карактерима, и опет се броји од 0.
mejl = "petar@etstesla.rs"
podaci = mejl.split("@")
print(podaci) # ['petar', 'etstesla.rs']
print(podaci[0]) # petar
print(podaci[1]) # etstesla.rs
datum = "2026-09-26"
print(datum.split("-")) # ['2026', '09', '26']
Задатак 2: мејл
strip(), lstrip(), rstrip() и наводници
Граматички исправан датум је 9. 5., а не 09. 05. Зато нам треба начин да уклонимо нуле са почетка. За то служе три методе:
| Метода | Шта уклања |
|---|---|
strip() | са обе стране (лево и десно) |
lstrip() | само са леве стране, тј. почетка (l = left) |
rstrip() | само са десне стране, тј. краја (r = right) |
Ако заграде оставиш празне, уклањају се размаци. Ако у заграду напишеш знак, уклања се тај знак, и то све док се не наиђе на неки други знак. Карактери у средини стринга се никад не дирају.
| Код | Резултат | Зашто |
|---|---|---|
" mreza ".strip() | "mreza" | размаци уклоњени са обе стране |
"09".lstrip('0') | "9" | нула са почетка уклоњена |
"0009".lstrip('0') | "9" | уклања се свака нула док не дође друга цифра |
"10".lstrip('0') | "10" | на почетку нема нуле, нула на крају остаје |
"100".rstrip('0') | "1" | опрез: rstrip брише нуле са краја |
"10".strip('0') добијамо "1", јер strip брише нулу и са краја. Са lstrip('0') месец 10 остаје 10, а 09 постаје 9.Наводници унутар стринга
Стринг који почиње са " завршава се на првом следећем ". Зато овај код не ради, јер Пајтон мисли да се стринг завршио пре речи zdravo:
print("Rekao je "zdravo"") # SyntaxError
Решење: ако је спољни стринг у двоструким наводницима, унутра користимо једноструке, и обрнуто.
print('Rekao je "zdravo"') # Rekao je "zdravo"
print(f"Mesec: {mesec.lstrip('0')}") # unutar f"..." pisemo '0'
f"..." увек пишемо једноструке наводнике: тако код ради у свакој верзији.Задатак 3: датум
Датум у формату yyyy-mm-dd увек има исту дужину: 10 карактера. Зато знамо тачно на којој позицији је који део:
Због тога су исправна оба начина: и split("-") и сечење по позицијама. Да дужина није увек иста (нпр. 2026-9-5), радио би само split.
Поређење стрингова и if
Оператор == проверава да ли су две вредности једнаке. Код стрингова мора да се поклапа сваки карактер.
input() увек враћа стринг, чак и кад корисник укуца цифре. Исто тако, jmbg[4] је стринг "0", а не број 0. Стринг и број никад нису једнаки: "0" == 0 је False. Зато поредимо са "0", у наводницима.Структура ЈМБГ-а
Матични број има 13 цифара. Првих седам су датум рођења: дан, месец и последње три цифре године. Упиши неки ЈМБГ и погледај како се издваја датум.
Од године имамо само три цифре. Ако је прва од њих (позиција 4) 9, особа је рођена у 1900-им, па испред додајемо "1" (998 → 1998). Ако је 0, рођена је 2000. или касније, па додајемо "2" (005 → 2005). Зато овде мора if.
Задатак 4: ЈМБГ
Преглед: шта смо научили
| Шта | Запис | Пример (ime = "Nikola Tesla") | Резултат |
|---|---|---|---|
| Коментар у једном реду | # tekst | # Zadatak 1 | Пајтон прескаче |
| Коментар у више редова | """ ... """ | текст задатка на почетку фајла | Пајтон прескаче |
| Један карактер | s[i] | ime[0] | N |
| Сечење | s[a:b] | ime[2:4] | ko |
| Сечење до краја | s[a:] | ime[7:] | Tesla |
| Сечење од почетка | s[:b] | ime[:6] | Nikola |
| Спајање | s1 + s2 | ime[0] + ime[7] | NT |
| Дужина (функција) | len(s) | len(ime) | 12 |
| Позиција (метода) | s.find(x) | ime.find(" ") | 6 (или -1 ако нема) |
| Подела (метода) | s.split(x) | ime.split(" ") | ['Nikola', 'Tesla'] |
| Уклањање са обе стране | s.strip() | " mreza ".strip() | mreza |
| Уклањање са почетка | s.lstrip(x) | "09".lstrip('0') | 9 |
| Уклањање са краја | s.rstrip(x) | "2500".rstrip('0') | 25 |
| Поређење | s1 == s2 | ime[0] == "N" | True |
len(s) - 1.2. Код сечења
[a:b] почетак је укључен, крај није.3. Код
+ редослед је важан, а размак се не додаје сам.4. Функција се пише
len(s), а метода s.find(x).5.
input() и издвојени карактери су увек стрингови, па поредимо са "0", а не са 0.
Провера знања
Без покретања кода: шта ће бити резултат?