Саптар: индекстер жана кесимдер
Саптар: индекстер жана кесимдер
Аныктама
Сап тырмакчага алынган Uniocode символдорунун ырааттуулугу. Мындан тышкары, Python саптарды аныктоо үчүн бир да, кош тырмакчаны да колдонууга мүмкүндүк берет:
@A@massege = "Salam dostor!"
print(massege)@A@
@T@Salam dostor!@T@
@A@name = 'Asan'
print(name)@A@
@T@Asan@T@
Индекс
Келгиле, муну 11 белгиден турган саптын мисалында карап көрөлү, hello world. Бизде биринчи беш тамга, андан кийин бир боштук жана дагы беш тамга. Жөн гана 2 сөз жана 11 белги. Бул саптагы ар бир белги өзүнүн сериялык номерине ээ. Python тилинде номерлөө тартиби 0дөн башталат, б.а. эң сол жактагы h символу нөлдүн ордунда, анда е тамгасы биринчи орунда ж.б.у.с. Башкача айтканда, бизде акыркы тамга онунчу орунда турат. Тартип номери дагы индекс деп аталат жана бул жерде турган маанини алуу үчүн бизге керек.
hello world мааниси менен s өзгөрмөсүн түзөлү. s өзгөрмөсүнө киргенде, биз бир эле учурда бардык символдорду алабыз, бирок күтүлбөгөн жерден бир гана символ алышыбыз керек болсо, анда индексти колдонушубуз керек. Мисалы, w алуу үчүн биз буйрукту төмөнкүдөй көрсөтүшүбүз керек: биз аны алууну каалаган сапты жазабыз, андан кийин чарчы кашааларды ачып, индекстин номерин көрсөтүп, натыйжаны алабыз.
@A@s = 'hello world'
s
//'hello world'
s[6]
//'w'@A@
Башкача айтканда, сиздин кайрылууңуз төмөнкүдөй болушу керек: сиз сап жазасыз жана индекстин номерин квадрат кашаанын ичинде көрсөтөсүз. Келгиле, d тамгасын алганга аракет кылалы. Сиз төрт бурчтуу кашаанын ичинде №10 индексти коюшуңуз керек:
@A@s[10]
//'d'@A@
Ошондой эле, сиз жок индекске кире албайсыз. Эгер сиз, мисалы, 14-белгисин алгыңыз келсе, саптын индекси чектен чыккандыгын билдирген бул катаны аласыз.
@E@s[14]
Traceback (most recent call last):
File "<pyshell#63>", line 1, in <module>
s[14]
IndexError: string index out of range@E@
d өзгөрмөсүнө дагы бир сапты сактап, ал жерге "privet".деп жазалы. Бул саптын номери бирдей, башкача айтканда, биринчи тамга индекстин нөлдүн астында, кийинки тамга биринчинин астында ж.б.у.с. Акыркы тамга бешинчи индекстин астында болот.
Сиз менен болгон жогорудагы мисалда биз бардык саптар үчүн биринчи символду бирдей ала аларыңызды көрөбүз - бул үчүн нөлдүк индексти көрсөтүү керек, бирок акыркы символ бардык саптар үчүн ар кандай. Башкача айтканда, мисалы, s өзгөрмөсүндө 10 саны, ал эми d өзгөрмөсүндө 5 саны болгон.
Акыркы индекс саны бүт саптын узундугунан 1ге аз. Демек, акыркы индексти мындайча жазса болот: чарчы кашаанын ичинде сапыңыздын узундугун таап, андан бир символду кемитесиз.
@A@s[len(s) - 1]
//'d'
d[len(d) - 1]
//'t'@A@
Ушундай жол менен сиз акыркы тамганы ала аласыз, бирок чындыгында бул абдан татаал мисал жана аны жөнөкөйлөтүү үчүн Pythonдо тескери номерлөө да бар. Ал оң четинен башталат жана акыркы тамга -1 индексинде, андан кийин ал -2 индексинде болот ж.б.у.с. Акыркысы -11 индексинин астында болот.
Мындан биз төмөнкүдөй жыйынтык чыгарсак болот: акыркы индексти алуу үчүн, сиз жөн гана -1 көрсөтсөңүз болот. Жана ал узундугуна карабастан каалаган сапта иштейт.
Кесүү(срезы)
Келгиле, кесим деген эмне экенин талкуулайлы. Көп учурда бир сапта бир символду эмес, бир эле учурда бир нече символду алышыңыз керек болот, бул үчүн тилкелер бар. Мисалы, "салам дүйнө" сабында бул жерде бул символдорду алышыңыз керек болсо (кызыл менен белгиленген):
анда төмөнкүдөй жазышыңыз керек болот - адегенде кайсы саптан символдорду алып жатканыбызды көрсөтүңүз, төрт бурчтуу кашааларды ачыңыз, кайсы индекстен символ алуу керек экендигин көрсөтүңүз жана кош чекит аркылуу кайсы индексти аяктоо керектигин белгилеңиз:
@A@s[1:6]
//'ello @A@'
Биз w , ды алгыбыз келди, башкача айтканда, анын 6 индекси бар жана биз сиз менен w алынбаганын көрүп жатабыз жана сиз кесип жатканда сол маани сизден алынаарын эстен чыгарбашыңыз керек, бирок оң жакта эмес. Башкача айтканда, w алуу үчүн - кийинки индексти иретинде көрсөтүү керек - 7.
@A@s[1:7]
//'ello w'@A@
Дагы бир мисалды карап көрөлү. Биз бул үч тамганы алышыбыз керек дейли (кызыл менен белгиленген):
@A@s[6:9]
//'wor'@A@
Бул учурда, кесип жатканда, биз сиз менен эки маанини өткөрүп бердик: интервалдын башталышы жана аягы. Бирок алардын бирин көрсөтпөөнү тандасаңыз болот. Эгер сиз экөөбүз s[4:] ушинтип жазсак, анда 4-индекстен аягына чейин символдорду алабыз.
@A@s[4:]
//'o world'@A@
Бул учурда, баары 4 индексинен аягына чейин алынат. Ошондой эле биринчи параметрди өткөрүп жиберсеңиз болот, башкача айтканда, аны бош калтырыңыз. Кош чекит коюуну унутпаңыз. Ал эми 4-көрсөткүч бизден алынбай турганын унутпаңыз.
@A@s[ :4]
// 'hell'@A@
Жөн эле s[4] деп жазганыңызда чаташтырбаңыз, сиз 4-индексте бир эле элементти аласыз, ал эми кесимди алуу үчүн кош чекит: s[:4] же s[4:] коюшуңуз керек болот.
Эгерде сиз s[:] мындай деп жазсаңыз, башкача айтканда, биринчи же акыркы параметрди көрсөтпөсөңүз, анда бүт саптын же бүт саптын көчүрмөсүн аласыз.
@A@s[:]
// 'hello world'@A@
Ошондой эле, кесип жатканда, сиз үчүнчү параметрди колдоно аласыз - бул кадам.
Мисалы, бизде болгону 11 тамга бар жана биз бири аркылуу турган бардык тамгаларды алгыбыз келет:
Муну төмөнкүдөй кылса болот: биз бүт сапты, башкача айтканда башынан аягына чейин алып, үчүнчү параметрди кийинки тамганы кандай кадам менен кабыл алабыз: s[::2] . Бул учурда, кадам эки болуп саналат.
@A@s[::2]
// 'hlowrd'@A@
Эгерде сиз мындай жол менен көрсөтсөңүз: s[::-1], башкача айтканда, башынан аягына чейин жана -1-кадам, анда сиз сызыкты тескери аласыз:
@A@s[::-1]
// 'dlrow olleh'@A@
Сиз ошондой эле s[2:8:3], деп жазсаңыз болот, башкача айтканда, 2-башын, 8-аягын жана 3-кадамды көрсөтүңүз - биз сиз менен төмөнкү натыйжаны алабыз:
@A@s[2:8:3]
// 'l '@A@
Сап өзгөрүлгүс объект болуп саналат. Мисалы, бул h тамгасынын биринчи символун аман-эсен ала аласыз, бирок бул сапка башка символду жазууга аракет кылсаңыз, башкача айтканда, аны индекс боюнча дайындыңыз, мисалы, а тамгасын айталы, анда сиз бул катаны аласыз. , бул сызык өзгөрүүлөрдү колдобой турганын айтат.
@E@s[0] = 'a'
Traceback (most recent call last):
File "<pyshell#78>", line 1, in <module>
s[0] = 'a'
TypeError: 'str' object does not support item assignment@E@
Башкача айтканда, мурунтан эле бар объектте сиз эч кандай тамганы оңдой албайсыз, эгер сиз кандайдыр бир тамганы өзгөрткүңүз келсе, анда сиз башкача аракеттенишиңиз керек - жаңы сап түзүшүңүз керек болот.
Эгерде сиз жана мен s сабындагы төртүнчү орундагы о тамгасын а, тамгасына алмаштыргыбыз келсе, анда биз бул а, тамгасына чейинки баарын бир кесим катары, башкача айтканда, эң башынан жана 4 элементке чейин ала алабыз, анда бул тилке тамгасына биздин жаңысын кошуп, анан а, тамгасынан кийинки тилимди, башкача айтканда, бешинчи элементтен эң аягына чейин алыңыз.
@A@s[:4]+'a'+s[5:]
// 'hella world'
s
// 'hello world'@A@
Ошентип, сиз жаңы сапка ээ болосуз, бирок ошол эле учурда биз акыркы сап өзгөрбөгөнүн көрүп жатабыз жана s өзгөрмөсүндөгү өзгөртүүнү сактап калуу үчүн ага биздин бүт туюнтумду дайындашыңыз керек болот, андан кийин биз жаңы сызык:
@A@s[:4]+'a'+s[5:]
// 'hella world'
s
// 'hello world'
s = s[:4]+'a'+s[5:]
s
// 'hella world'@A@