python

Vargjet e karaktereve (Strings)

Gjuha python përveç strukturave të kontrollit, cikleve, moduleve përbëhet edhe nga sekuencat. Sekuencat janë struktura të dhënash, elementet e të cilave janë të renditura. Në python ka 7 lloje sekuencash:

Sekuencat më të rëndësishme me të cilat do të merremi në kapitujt pasardhës janë: vargjet e karaktereve, listat dhe n-shet.

Operatorët që veprojnë tek sekuencat janë si në tabelën e më poshtme:

sekuencë1 + sekuencë2 bashkimi i dy sekuencave
sekuencë * n n-numri i herëve që përsëritet sekuenca
a in sekuencë kontrollon për ekzistencën e a-së në sekuencë
a not in sekuencë kontrollon për mos ekzistencën e a-së në sekuencë
a[i] indeksimi i sekuencës a; numërimi fillon nga 0
a[i:j] ndarja ne pjesë e sekuencës a, nga indeksi i në indeksin j
a[i:j:k] ndarja në pjesë e sekuencës a, nga indeksi i në indeksin j me hap k

Krijimi i vargjeve të karaktereve

Vargjet e karaktereve janë koleksione karakteresh të renditura.

Për t'i treguar pythonit se duam të krijojmë një varg karakteresh, mjafton të vendosim thonjëzat.

>>> 'python'
>>> "python123"
>>> """python"""

Siç duket edhe nga shembulli, thonjzat që mund të perdorim për të krijuar vargjet e karaktereve janë: njëshe, dyshe dhe treshe.

Thonjzat njëshe dhe dyshe nuk kanë dallim në perdorim nga njera tjetra, ato përdoren për të mundësuar krijimin e fjalëve me apostrof. Psh.: "S'paske", nuk mund të shkruhet mes thonjzash njëshe pasi apostrofi do të kuptohej si mbyllje e vargut të karaktereve. Kështu që në këtë rast na ndihmojnë thonjezat dyshe. Ndërsa thonjzat treshe ose, siç njihen ndryshe: blloqet e vargjeve të karaktereve, perdoren për të shkruar disa rreshta.

>>> """Shembull
vargu karakteresh me thonjza
treshe"""
'Shembull \nvargu karakteresh me thonjza\ntreshe'

Nga ajo që na shfaqet në ekran shohim se janë shfaqur të tre rreshtat tonë në një rresht të vetëm, si dhe çdo fund rreshti është zëvendësuar me një karakter \n. Ky karakter përdoret për rresht të ri. Pak më vonë do të flasim për këto karaktere.

Nëse duam të marrim tekstin në formën siç e shkruajtëm, mund të perdorim komandën print.

>>> teksti = """Shembull
vargu karakteresh me thonjza
treshe"""
>>> print teksti
Shembull
vargu karakteresh me thonjza
treshe

Indeksimi dhe ndarja në pjesë (slicing)

p y t h o n
[0] [1] [2] [3] [4] [5]

Vargjeve të karaktereve mund t'i referohemi duke marrë çdo karakter më vete, ose duke grupuar disa prej tyre. Në rastin e parë përdoret indeksimi dhe në rastin tjetër ndarja në pjesë (slicing). Numërimi fillon nga zero. Kështu në rastin e fjalës python nëse do të donim t'i referoheshim gërmës së parë 'p' do ta indeksonim v[0].

>>> v = 'python'
>>> v[0]
'p'

Siç e kemi përmendur edhe më parë mund t'i referohemi një vargu edhe duke indeksuar nga fundi i tij, në këtë rast përdoren numrat negativë.

p y t h o n
[-6] [-5] [-4] [-3] [-2] [-1]

Shembull

>>> vargu = 'python'
>>> vargu[-1]
'n'
>>> vargu[-2]
'o'

Grupimi i disa karaktereve së bashku bëhet me ndarjen në pjesë (slicing). Sintaksa është [a:b], ku a dhe b janë numra.

Sintaksa Kuptimi
[a:b] veço karakteret duke filluar nga a-ja deri te b-ja pa përfshirë b-në
[a:] veço karakteret nga a-ja deri në fund të vargut
[:b] veço karakteret nga fillimi (pra nga 0) deri tek b-ja pa e përfshirë atë.
[:] merr të gjithë vargun
[:-b] veço karakteret duke përjashtuar b karaktere nga fundi
[-a:-b] veço karakter nga a-ja deri tek b-ja pa përfshirë b-në duke numëruar nga fundi
[a:b:c] veço karakteret duke u nisur nga a-ja deri tek b-ja pa e përfshirë atë, duke kapërcyer me nga c
[-a:-b:-c] veço karakteret duke u nisur nga a-ja deri tek b-ja pa e përfshirë atë, duke kapërcyer me nga c duke numëruar nga fundi.
[::-1] kthen vargun e karaktereve mbrapsht.

Shembull:

>>> a = 'python'
>>> a[1:3]
'yt'
>>> a[0:]
'python'
>>> a[2:]
'thon'
>>> a[:2]
'py'
>>> a[:]
'python'
>>> a[:-2]
'pyth'
>>> a[-3:-1]
'ho'
>>> n='0123456789'
>>> n[2:8:3]  # marrim nga indeksi 2 deri tek indeksi 7 duke kapercyer me nga 3 indekse
'25'
>>> n[-1:-5:-2]
'97'
>>> n[::-1]
'9876543210'

Pandryshueshmëria

Vargjet e karaktereve janë vargje të renditura karakteresh të pandryshueshme.

>>> a = 'dore'

Fakti i pandryshueshmërisë, që është edhe shumë i rëndësishëm, duhet kuptuar se nuk mund të ndryshojmë karakteret e një vargu karakteresh. Kështu psh. nëse tentojmë që 'dore' ta ndryshojmë dhe në vend të saj të shkruajmë 'bore', do të marrim një gabim sintakse.

>>> a[0] = 'b'
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    a[0] = 'b'
TypeError: 'str' object does not support item assignment

Veprimet me vargjet e karaktereve

Bashkimi me operatorin +

Vargjet e karaktereve mund të bashkohen mes tyre, nëpërmjet operatorit të bashkimit +.

>>> v1 = 'ab'
>>> v2 = 'cd'
>>> v1 + v2
'abcd'

Përsëritja me operatorin *

Operatori * është operatori i përsëritjes.

>>> 'a' * 4
'aaaa'

Përfaqësimi me operatorin in dhe not in

Operatori in kërkon për përfaqësimin e një elementi në sekuencë. Nëse ky element i përket sekuencës përgjigja është e vërtetë, në të kundërt përgjigja është e gabuar.

>>> varg = 'fjali shembull'
>>> 'fjali' in varg
True
>>> 'o' in varg
False

Operatori not in mohon kërkimin e një elementi në sekuencë. Nëse mohimi është i vërtetë, pra elementi nuk gjendet në varg, atëherë pergjigja është e vërtetë, në të kundërt përgjigja është e gabuar.

>>> 'fjali' not in varg
False

Në këtë shembull kemi mohuar kërkimin e elementit 'fjali'. Pyetja që kemi shtruar është: Elementi 'fjali' nuk ndodhet në sekuencën varg? Ky element siç e shohim ndodhet në sekuencën varg, pra pergjigja është e gabuar.

>>> 'o' not in varg
True

Ky shembull shtron pyetjen: 'o' nuk ndodhet në sekuencën varg? Elementi 'o' nuk është pjesë e vargut të karaktereve varg dhe pyetja jonë në këtë rast ka përgjigje të vërtetë. Pra mund të themi, po elementi 'o' nuk është pjesë e vargut të karaktereve v.

Sekuencat e shpëtimit ( angl. Escape sequences)

Më lart thamë se nëse duam të krijojmë një varg karakteresh mjafton të vendosim thonjëza; dhe nëse vetë vargu i karaktereve duhet të përmbajë thonjëza ose apostrof duhet t'i kombinojmë thonjëzat njëshe dhe dyshe sipas nevojës. Po ashtu thamë se nëse duam që vargu i karaktereve të jetë i përbërë nga më shumë se një rresht duhet të përdorim thonjëza treshe.

Përveç thonjzave 1-she, 2-she dhe 3-she, janë edhe sekuencat e shpëtimit. Këto sekuenca perdorin karakterin \ duke e kombinuar me karaktere të tjera. Psh. \t tregon hapësirën që shkakton butoni tab i tastierës, kurse \n rreshtin e ri që krijohet zakonisht me butonin enter. Sekuencat e shpëtimit lehtësojnë punë, sepse na lejojnë që të përfshijmë në vargje ( pavarësisht llojit të thonjëzave që kemi përdorur) karaktere që do të ishte e vështirë të shpreheshin ndryshe. Karakteri \ i ndjekur nga një karakter tjetër sipas nevojës, njihet si një karakter i vetëm. Psh. vargu i mëposhtëm ka 5 karaktere.

>>> vargu='1\n2\n3'
>>> print vargu
1
2
3
>>> len(vargu)
5

Metodat e vargjeve të karaktereve

Në kapitullin e funksioneve pamë se pythoni kishte funksione të gatshme për tu përdorur nga programuesit. Metodat e vargjeve të karaktereve janë funksione, por ndryshojnë paksa në sintaksë nga funksionet.

Sintaksa:

vargu.emrimetodes()

Shembull:

>>> a = 'nje fjali'
>>> b = a.capitalize()
>>> print b
Nje fjali

a është vargu fillestar, ndërsa b është vargu i ri që krijojmë në mënyrë që të bëjmë ndryshime (meqenëse vargjet janë të pandryshueshme atëherë na duhet të krijojme një varg të ri). Metoda capitalize() siç kuptohet lehtë kthen gërmën e parë të vargut ne gërmë të madhe. Kjo metodë nuk merr asnjë parametër.

Formatimi i vargjeve të karaktereve

Me formatim të vargjeve të karaktereve kemi parasysh ndryshimin e paraqitjes së tyre duke kombinuar vargun me vlerën e ndryshoreve të tjera. Duke pasur parasysh që vargjet e karaktereve janë të pandryshueshëm dhe nuk mund t'i ndryshojmë sipas vendit me indeksim, edhe kur flasim për formatimin e tyre kemi të bëjmë me krijimin e një vargu të ri të formatuar dhe jo modifikimin e vargut ekzistues.

Për të formatuar vargjet e karaktereve ka dy mënyra:

Formatimi i vargjeve të karaktereve përmes strukturave të gatshme të gjuhës.

Kjo mënyrë përdor operatorin % (që më parë e kemi parë tek numrat si operatorin e modulit) për formatimin e vargjeve të karaktereve. Sintaksa është:

'vargu bashkë me simbolet qe do të zevendësohen' % (vlerat)

Vargu përmban vargun bashkë me simbole të veçanta që fillojnë me operatorin % dhe shoqërohen me karakteret të tjera si psh. %s për vargjet, %d për numrat etj. Tek vlerat vendosen vlerat (qofshin këto numra ose vargje) të cilat do të zëvendësojnë simbolet sipas vendeve të përcaktuara tek vargu. Për ta pasur më të qartë le të shohim një shembull:

>>> 'Gjuha %s eshte krijuar ne vitin %d' % ('python', 1991)
'Gjuha python eshte krijuar ne vitin 1991'

Tek vlerat kemi një string 'python' që vendoset në vend të %s dhe një numër 1991 që vendoset në vend të %d. Simbolet më të përdorshme sipas llojit të të dhënave që duam të shfaqim janë:

Kodi Kuptimi Shembull
d ose i Numër i plotë
>>> "%d kembe" % 4
'4 kembe'
f ose F Numër me presje. Preçizioni fillestar është 6
>>> import math
>>> "%f" % math.pi
'3.141593'
s Varg karateresh.
>>> emri = "Arbana"
>>> "Pershendetje %s!" % emri
'Pershendetje Arbana!'
% Kur duam të përdorim vetë karakterin % si pjesë të vargut
>>> "%d %% %d" % (5, 4)
'5 % 4'

Vargjeve mund t'i përmirësojmë formatimet duke shtuar drejtimin në të majtë përmes karakterit -, të përcaktojmë preçizionin me karakterin . etj siç do i shohim në tabelat përkatëse më vonë. Këto formatime bëhen midis operatorit % dhe karakterit që tregon llojin e të dhënës siç u shpjegua më lart.

Nëse vendosim një numër midis % dhe karakterit të llojit, përcaktojmë gjerësinë minimale të vlerës:

>>> "%10s" % 'fjale'
'     fjale'
>>> "%2s" % 'fjale'  # numri percakton gjeresine minimale, nuk e kufizon fjalen ne aq karaktere
'fjale'

Karakteri -, siç u përmend, nëse vendoset përpara numrit të gjerësisë ndryshon rradhitjen:

>>> "%-10s" % 'fjale'
'fjale     '

Karakteri . i shoqëruar me një numër përcakton preçizionin ( numrin e shifrave pas presjes) kur kemi të bëjmë me numra me presje:

>>> "%-10.2f" % math.pi
'3.14      '

Siç e shikojmë karakteret modifikuese mund të kombinohen. Por rradha është e rëndësishme. Sintaksa për renditjen e të gjithë karaktereve është:

%[modifikuesit "#", "0", "-", " ", "+"][gjerësia][preçisioni][lloji]

Modifikuesi - siç thamë ndryshon rradhitjen në të majtë. Kurse modifikuesit e tjerë shpjegohen në tabelë:

Simboli Kuptimi Shembull
"#" Mund të ndryshojë funksionimin e karakterit të llojit. Psh lloji f nëse përdoret bashkë me #, bën që numri të ketë gjithmonë prejse dhjetore edhe nëse nuk ka shifra pas saj. Llojet e tjera që kemi mësuar (d, dhe s) nuk ndryshojnë edhe me përdorimin e këtij karakteri.
>>> "%.0f" % 7
'7'
>>> "%#.0f" % 7
'7.'
"0" Mbush vlerën në të majtë me aq 0 sa duam
>>> "%05d" % 2
'00002'
"-" Përcakton rradhitjen në të majtë
>>> "%-10s" % 'fjale'
'fjale     '
" " Le një hapësirë përpara numrave pozitivë
>>> '% d' % 2
' 2'
>>> "% d" % -2
'-2'
"+" Tregon gjithmonë shenjën e numrit edhe kur është pozitive
>>> "%+d" % 2
'+2'

Preçizioni dhe gjerësia minimale, përveç mënyrës që kemi përdorur më lart duke i shkruar direkt midis simbolit % dhe llojit, mund të shkruhen edhe në formën: "%*lloji" % (gjeresia, vlera). Pra në vend të numrit shkruajmë * dhe numrin e kalojmë tek lista e vlerave përpara vlerës përkatëse.

>>> "%.*f" % (2, 1.123)
'1.12'
>>> "%*.*f" % (10, 3, 1.123456) # gjeresia dhe precizioni
'     1.123'

Dobia e kësaj sintakse duket më qartë kur duam të caktojmë si gjerësi minimale ose preçizion vlera që i kemi ruajtur në ndryshore. Shembull:

>>> def printo_listen(lista):
    gjatesia = 0
    for el in lista:
        if len(el) > gjatesia:
            gjatesia = len(el)
    
    print '-' * gjatesia
    for el in lista:
        print "%*s" % (gjatesia, el)
    print '-' * gjatesia
>>> printo_listen(['alfabeti', 'nje', 'fjale'])
--------
alfabeti
     nje
   fjale
--------

Funksioni printo_listen merr si argument një listë me vargje karakteresh. Në ciklin e parë ai gjen fjalën me të gjatë dhe e ruan numrin e karaktereve të saj në ndryshoren gjatesia. Më pas kjo ndryshore përdoret për të formatuar vargjet e karaktereve që printohen në ciklin e dytë, në mënyrë të tillë që të kenë të gjithë të njejtën gjerësi.

Një shembull më konkret i përdorimit të formatimit të vargjeve të karaktereve do të ishte formatimi i numrit rendor të faturave. Numri i faturës në faturat e printuara mund të kërkohet të paraqitet me 5 shifra pra numra të formës 00001, 00002 e kështu me radhë. Kjo mund të bëhet shumë lehtë me anë të modifikuesit 0:

>>> for i in range(10):
        print "Fatura %05d" % (i + 1)
Fatura 00001
Fatura 00002
Fatura 00003
Fatura 00004
Fatura 00005
Fatura 00006
Fatura 00007
Fatura 00008
Fatura 00009
Fatura 00010

Formatimi i vargjeve të karaktereve me ane të metodës format.

Kjo mënyrë e formatimit të vargjeve të karaktereve është me specifike e vetëm pythonit, ndërkohe që menyra e parë është e ngjashme me komandën printf të gjuhës së programimit C.

Forma më e thjeshtë e sintaksës është:

"{0} {1}".format('vlera zero', 'vlera nje')

Shembull:

>>> "{0}{1}{2}".format('a','b','c')
'abc'
>>> "{2}{1}{0}".format('a','b','c')
'cba'

Formatimi i vargjeve të karaktereve me metoden format mund të bëhet sipas numrave të pozicionit si tek shembulli më lart, sipas emrave të veçantë për çdo pozicion, ose kombinimit të të dyjave.

Shembull:

>>> vargu = "Gjuhet {gjuha} eshte krijuar ne vitin {viti}"
>>> vargu.format('Python', 1991)
'Gjuha python eshte krijuar ne vitin 1991'

Njësoj si tek formatimet sipas strukturave të gatshme të gjuhës, edhe me formatimet sipas metodës format mund të bëjmë konfigurime të ndryshme në formatimin e vargjeve të karaktereve.

Sintaksa është e ngjashme me rastin e % me ndryshimin e {} dhe : në vend të %. Psh. "%03.2f" do të shkruhet "{:03.2f}"

Kështu shembulli i faturave me metodën format do të shkruhej kështu:

>>> for i in range(10):
        print 'Fatura {num:05d}'.format(num = (i+1))
Fatura 00001
Fatura 00002
Fatura 00003
Fatura 00004
Fatura 00005
Fatura 00006
Fatura 00007
Fatura 00008
Fatura 00009
Fatura 00010

Metoda format është një mënyrë më e re e python për të bërë formatimin e vargjeve. Ndryshimi është në sintaksën që përdoret për modifimet: gjetësia minimale shkruhet sërish si numër midis kllapave {gjatesia}. Drejtimi pa bërë ndryshime është vetë në të majtë. Nëse duam ta kthejmë në të djathtë nuk përdorim - por >. Shembull:

>>> "{:>10}".format('fjale')
'     fjale'
>>> "{:<10}".format('fjale')
'fjale     '
>>> "{:^10}".format('fjale')  # rradhit ne qender
'  fjale   '

Në vend të * përdorim sërish kllapat:

>>> '{:<{}s}'.format('fjale', 10)
'fjale     '

Preçizioni funksionon njësoj:

>>> "{:.2f}".format(math.pi)
'3.14'